VGA接口是一个很有历史的接口,全称为Video Graphics Array(VGA)视频图形阵列,是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。
时至今日,这个接口依然还在大量使用,因为这个接口具有成本低、结构简单、应用灵活的优点。
一、VGA接口与电路原理图
VGA接口母座如下图所示:
VGA接口电路示例如下:
从上面的VGA接口电路可以看到,总共有五个信号:行同步信号(HSync) 、场同步信号(VSync)、图像色彩数据R、G、B。
二、VGA工作原理
电子束从屏幕的左上角开始,从左向右逐行扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐。每行结束时,用行同步信号进行同步。当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧的扫描。
三、VGA一帧时序图
VGA一帧的时序参数主要包括行时序和场时序。
行时序的参数有行同步(Hor Sync)、行消隐(Hor Back Porch)、行视频有效(Hor Active Video)和行前肩(Hor Front Porch)。
场时序的参数有场同步(Ver Sync)、场消隐(Ver Back Porch)、场视频有效(Ver Active Video)和场前肩(Ver Front Porch)。
详细时序图如下:
四、VGA行同步和场同步时序图
上面这个就是简化后的时序图。
1、行同步时序
一行总像素 H_TOTAL = H_SYNC +H_BACK + H_ACTIVE + H_FRONT;
有效视频起始像素H_START = H_SYNC +H_BACK
有效视频结束像素 H_END = H_Sync+H_BACK +H_ACTIVE
行同步信号只在H_Sync像素内,保持低电平,其余时间保持高电平。
2、场同步时序
一场总行数 V_TOTAL = V_SYNC + V_BACK + V_ACTIVE + V_FRONT
有效视频起始行数 V_START = V_SYNC + V_BACK
有效视频结束行数 V_END = V_SYNC + V_BACK + V_ACTIVE
场同步信号只在V_Sync行数内,保持低电平,其余时间保持高电平。
根据前面这两段时序就可以写出VGA时序,这个时序逻辑不复杂。
3、VGA常用分辨率时序参数
不同帧率对应的时序参数具体像素或行数不同
五、关键源代码
1、横纵向计数
reg [11:0] x_cnt;
reg [11:0] y_cnt;
//H count
always @(posedge clk or posedge reset) begin
if(reset)
x_cnt <= 1;
else if(x_cnt==H_TOTAL)
x_cnt <= 1;
else
x_cnt <= x_cnt+1;
end
//V count
always @(posedge clk or posedge reset) begin
if(reset)
y_cnt <= 1;
else if(y_cnt==V_TOTAL)
y_cnt <= 1;
else if(x_cnt==H_TOTAL)
y_cnt <= y_cnt+1;
end
2、行同步信号与场同步信号
reg hsync_r, vsync_r;
//行同步信号
always @(posedge clk or posedge reset) begin
if(reset)
hsync_r <= 1'b1;
else if(x_cnt==1)
hsync_r <= 1'b0;
else if(x_cnt==H_SYNC)
hsync_r <= 1'b1;
end
//场同步信号
always @(posedge clk or posedge reset) begin
if(reset)
vsync_r <= 1'b1;
else if(y_cnt==1)
vsync_r <= 1'b0;
else if(y_cnt==V_SYNC)
vsync_r <= 1'b1;
end
3、有效视频信号与blank信号
reg video_valid_r;
always @(posedge clk or posedge reset) begin
if(reset)
video_valid_r <= 1'b0;
else begin
video_valid_r <= (x_cnt >= H_START)&&(x_cnt < H_END)&&(y_cnt >= V_START)&&(y_cnt < V_END) ? 1'b1 : 1'b0;;
end
end
六、源代码下载
https://pan.quark.cn/s/43e9802d78d4