【FPGA图像处理实战】- VGA接口与时序详解

本文转载自:FPGA入门到精通

VGA接口是一个很有历史的接口,全称为Video Graphics Array(VGA)视频图形阵列,是IBM公司在1987年随着PS/2一起推出的使用模拟信号的一种视频传输标准。

时至今日,这个接口依然还在大量使用,因为这个接口具有成本低、结构简单、应用灵活的优点。

本文将言简意赅的,帮助大家掌握VGA时序的要点,快速掌握和上手。

老规矩:文末给关键代码示例和下载完整工程的方法。

一、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

完整工程源码,本公众号配套的知识星球可下载。

最新文章

最新文章