Verilog实现VGA通信的驱动

作者:默宸 ,来源:FPGA开源工作室

VGA全称是Video Graphics Array,即视频图形阵列,是一个使用模拟信号进行视频传输的标准。分辨率高,显示速度快。

一、传输协议

VGA接口15个引脚,除去地线,我们一般会用到5个引脚:1(RED)、2(GREEN)、3(BLUE)、13(HSYNC)、14(VSYNC)。

如图1:

图1 VGA接口引脚定义

1、2、3指的是传输的红、绿、蓝三色的模拟信号,范围为0-0.714V,0代表无色,0.714V代表满色,需要注意的这是模拟信号,因此前面还需要进行一个数模转换。HSYNC(行同步信号)和VSYNC(场同步信号)分别是指传输一行和传输一帧的时序,下面看一下他们的时序图:

图2 行同步时序

a:行同步时期,扫描地址的复位
b:行消隐后肩,扫描地址转移后的稳定等待准备期
c:行显示时期,数据有效区域
d:行消隐前肩,扫描地址转移的准备
e:行扫描总时间,一行扫描的总时间

图3 场同步时序

o:场同步时期,扫描地址的复位
p:场消隐后肩,扫描地址转移后的稳定等待准备期
q:场显示时期,数据有效区域
r:场消隐前肩,扫描地址转移的准备
s:场扫描总时间,一场扫描的总时间

可以看出,行同步时序和场同步时序类似,分别经历4个阶段:拉低、显示后沿、有效数据传输和显示前言。

图4 VGA显示器扫描轨迹

二、常见的刷新率时序表

由于FPGA擅长计数电路这里采用像素表示法来设计驱动。

图5 不同VGA的时序参数

FPGA硬件测试时要将sys_pll中的输出频率改为25MHZ。

三、驱动电路的verilog设计(lcd_driver)

目前液晶显示器普及,而高于 60Hz 的刷新率对于液晶来说,没有任何意义,所以我们以 640*480 在 60Hz 的刷新率下为例。

本次我们采用的是ADV7123视频转换芯片来实现。

1)为便于移植,根据640*480 60hz分辨率下的参数,宏定义相关数据。


2)行扫描单位hcnt计数


3)列扫描单位vcnt计数

每扫描完一行,即hcnt完成H_TOTAL次计数后,vcnt进行自加。


4)ADV7123控制信号输出

为了实现数据在lcd_dclk上升沿有效,我们将clk翻转输出,已实现上升沿采样 。

lcd_blank作为显示空白信号,低电平有效。

设计中不需要lcd_sync信息,可以直接接地。


5)有效显示使能信号输出

当使能信号有效时,接收外部输入的RGB数据lcd_data.


6)外部数据请求控制信号

为了保证数据稳定,lcd_request要提前一个时钟请求外部输入数据 。

同时,设计中实时显示下一时刻的扫描地址lcd_xpos、lcd_ypos,也要提前一个时钟输出,以保证外部数据输入的同步化。

lcd_xpos、lcd_ypos是显示器有效显示区域的行列坐标计数值。


四、模拟VGA图像数据的输入

1)宏定义三原色组合的颜色如下


这里要注意所用的VGA驱动电路是RGB888还是RGB565,如果是RGB565,三原色要改成下面样式,并把其他程序中lcd_data的位数改为16位:
笔者曾在这里犯过错误。


2)根据输入的行、列地址信号,输出三原色组合后得到的8条彩色。


五、不同分辨率的VGA驱动

lcd_para文件定义了四种VGA分辨率驱动,这里只需修改定义的注释就行,并把PLL锁相环中的频率改为相应的频率。


PLL修改方法为直接修改下面参数中的乘法除法因子:



文章转载自:FPGA技术联盟
*本文由FPGA技术联盟授权转发,如需转载请联系作者本人

推荐阅读