引言
VGA接口显示器是计算机系统以及智能仪器中重要的显示终端设备。标准的VGA接口需要提供以下几组基本的信号:行同步信号Hsync场同步信号Vsync以及红黄蓝3路模拟信号。因此要使数字图像信息在VGA接口显示器正确、完整地显示,就涉及到了时序的构建和数字图像信息的模拟化两方面。如果接口前端无可供利用的时序信息,那么就可参照有关标准来构造时序,这可利用可编程器件很方便地实现;另外由于VGA是一个模拟的接口标准,因此数字图像信息模拟化可用视频DA转换器来实现。VGA标准是当前最常用的视频显示标准,还包括SVGA、XVGA等子标准。本文主要以640×480,60Hz下VGA显示标准为例,实现一个满足多方面需求的VGA显示终端接口。设计可应用于图像处理、视频信号再现、数据可视化分析等方面,实现方法和器件的选取以及设计应用列举都具有典型的代表意义。
理论分析
VGA显示接口的硬件设计和原理
(1)基本原理说明
这次系统设计使用的显示器是满足VGA标准的常用的彩色显示器,由CRT(阴极射线管)构成,彩色由G、R、B(绿:Green,红:Red,蓝:Blue)三基色组成。显示则用逐行扫描的方式解决,阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生GRB三基色,合成一个彩色像素。硬件选用了AnalogDevice公司的ADV7123。ADV7123由三个10位高速DAC组成,最高时钟速率为240MHZ,即可以达到最高240MS/s的数据吞吐率。当f(CLK)=140MHZ,f(OUT)=40MHZ时,DAC的SFDR(无杂散动态范围)为-53dB;当f(CLK)=40MHZ,f(OUT)=1MHZ时,DAC的SFDR为-70dB。ADV7123的BLANK引脚可以用来输出空白屏幕。ADV7123在100Hz的刷新率下最高分辨率为1600×1200。
显示器的显示原理
扫描从屏幕的左上方开始,从左到右,从上到下,进行扫描,每扫完一行,电子束回到屏幕的左边下一行的起始位置,在这个回扫的时间内,CRT对电子束进行消隐,每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方,在离开屏幕右下角回到屏幕左上角的时间内进行场消隐,预备下一场的扫描。
信号接口
对于普通的VGA显示器,其引出线共含5个信号:G、R、B:三基色信号;HS:行同步信号;VS:场同步信号。对于5个信号的时序驱动,对于VGA显示器要严格遵循640×480×60Hz模式。其中640是指每一行中显示的像素个数,而480是指屏幕每一列所包含的像素个数。
(2)Hs与Vs驱动信号的产生
我们常把要显示的数据如图像处理结果存放到存储器里,如果要把显示存储器里的图像在VGA接口显示器显示,大多情况下,扫描时序是需要我们构造的。以640×480,59.94Hz(60Hz)为例。VGA工业标准规定具体地,在扫描过程中的时序图如图1所示:
每场信号对应525个行周期,其中480行为图像显示行,每场有场同步信号,该脉冲宽度为2个行周期的负脉冲;每显示行包括800点时钟,其中640点为有效显示区,每行有一个行同步信号负脉冲,该脉冲宽度为96个点时钟。这样我们可以知道,行频为525×59.94Hz即31469Hz,需要的点时钟频率为:525×800×59.94Hz约25MHz。由上图可知,实际上在真正的实现过程中,每一行扫描所花的时间实际上比显示一行的像素所需的时间多了800-640=160个像素的时间而每一屏的扫描时间则是显示525行的时间,而不是480行的时间。
VGA显示接口的验证方法
在正式调试或使用接口前,对设计进行基本测试、论证是有必要的,通常方法是尽可能脱离其它不确定因素,只对关心这部分电路进行测试。如果在FPGA里构造的数据能够按要求在显示器上显示,则表示基本可以使用了。例如把计数器输出作为DA的红绿蓝数字信号输入,以H_Cnt作为计数脉冲,并引入上述的时序信号,正常情况下显示器显示结果是水平方向是反复由亮到暗,或是由暗到亮显示。还可以利用FPGA里的LPM_ROM预存显示数据输出作为
显示数据。仍以H_Cnt作为计数脉冲,计数器作为地址发生器,输出到LPM_ROM,作为地址。
简便起见,我们把128*128的彩色图像的信息保存到ROM中,每个像素点的颜色值保存为一个30位(ADV7123由三个10位高速DAC组成)的数据,其保存的顺序为先第一行从左到右的128个像素颜色数据,然后保存下一行的数据,其他地址线共有14位。
图片RGB颜色的值通过用matlab将图片二值化得到
时钟信号50MHZ进过FPGA上的锁相环进行分频处理得到25MHZ的时钟信号。
parameterLength=128;//定义图片显示的大小
parameterWidth=128;
always@(posedgeVGA_CLK)//行计数达到计数周期将重置
begin
if(H_Cnt==H_Tg-1)H_Cnt
elseH_Cnt
end
always@(negedgeHs)//场计数达到计数周期将重置
begin
if(V_Cnt==V_Tg-1)V_Cnt
elseV_Cnt
end
always@(posedgeVGA_CLK)//产生行同步信号
begin
if(H_Cnt
elseHs
end
always@(V_Cnt)//产生场同步信号
begin
if(V_Cnt
elseVs
end
always@(posedgeVGA_CLK)
begin//在显示器上显示范围的控制
if(H_Cnt>=H_Ta+H_Tb+H_Tc&&
H_Cnt
V_Cnt>=V_Ta+V_Tb+V_Tc&&
V_Cnt
begin//ROM读取控制和数据处理
R
G
B
address地址加1
end
else
begin
R
G
B
end
要把一幅图像的数据写入ROM,首先必须解决的就是写入文件的格式问题。
一般的方法是通过编程器把IntelHex,或者二进制文件.bin逐字节写入ROM。而图像都具有固定的格式,如BMP,JPEG,GIF等,其中的BMP格式图像是一种很常见的图像格式,没有经过压缩处理,且文件结构相对简单,易于处理,在本设计中采用了BMP图像作为研究对象。将BMP文件直接转化为IntelHex文件比较困难,因此可先将BMP格式文件转化成mif格式文件,再由QuartusII9.0直接将mif文件转化为IntelHex文件,最后再将图像数据烧写入ROM中,本设计中,我们首先通过MATLAB将要显示的图片进行处理得到RGB三个颜色的分量,然后通过编程将各颜色分量生成一个mif文件,用于初始化LPM_ROM,利用QuartusII9.0自带的MegaWizardPlug-InManager创建存储RGB值的ROM模块,同样利用QuartusII软件生产一个存储器初始化(.mif)文件,其大小为Wordsize=32,Numberofwords=16384,将生产的RGB颜色值导入到mif文件中。
结语
VGA接口显示器给我们提供了一个方便的显示方案,通过FPGA构造显示时序、以及ADV7123实现数模转化,在面积和速度上能够满足我们大部分的显示应用。实践证明基于FPGA和ADV7123的VGA显示接口能够很好地在多种场合应用。