基于FPGA的VGA显示(后附VHDL代码)整个VGA的时序操作很简单,就是形成一个具有一定占空比的电平周期。只是整个VGA的操作涉及到一些专有名词,理解上比较困难,一旦明白了这些是什么意思后,操作即将变得很简单。VGA工作流程:常见的彩色显示器,一般由CRT(阴极射线管)构成,彩色是由R、G、B(红、绿、蓝)三基色组成,CRT用逐行扫描或隔行扫描的方式实现图像显示,由VGA控制模块产生的水平同步信号和垂直同步信号控制阴极射线枪产生的电子束,打在涂有荧光粉的荧光屏上,产生R、G、B三基色,合成一个彩色像素。扫描从屏幕的左上方开始,由左至右,由上到下,逐行进行扫描,每扫完一行,电子束回到屏幕下一行的起始位置,在回扫期间,CRT对电子束进行消隐,每行结束是用行同步信号HS进行行同步;扫描完所有行,再由场同步信号VS进行场同步,并使扫描回到屏幕的左上方,同时进行场消隐,预备下一场的扫描。行同步信号HS和场同步信号VS是两个重要的信号。注意点:什么时候消隐?为什么要消隐?当一行扫描完毕后然后电子枪又转到下一行的这段时间或是扫描完所有的行后电子枪回到第一行的这段时间,这两段时间都要消隐。在消隐的时间内,数据是无效的。这样就保证电子枪的回扫的个动作不干扰显示,因为回扫这个动作是很频繁的,若在这个时间段内数据有效,那么就回在显示屏上出现电子枪回扫的轨迹。消隐的时候我们干什么?消隐这个动作是显示屏(CRT)执行的,我们在编程时只要注意有这么个东西就行。同步信号(包括HS和VS)是什么?这个就相当于一个数据起始信号,表明数据马上就要开始了。如果撇开具体的设备,那么这个信号和AD、DA中常用的Sync(同步)、CS(片选)信号相当。该信号一般为负电平,但对于有的显示器可不关心该信号的极性,因为它内部可自动转换正负逻辑。对于普通的VGA显示器,需要引出5个信号:R,G,B:三原色;HS:行同步信号;VS:场同步信。对于VGA显示器的上述五个信号的时序驱动要严格遵循“VGA工业标准”,即640×480×60HZ模式,否则无法显示正确地图象。VGA工业标准要求的频率:时钟频率:25.175MHz(像素输出的频率)行频:31469Hz(即行信号HS的频率)场频:59.94Hz(即场信号VS的频率)(每秒图像刷新频率)行扫描时序图:各个参数的意义和时间长度(时钟频率为25MHz)Ta:水平同步脉冲,这里为负电平,96个时钟周期Tb+Tc:行消隐后沿时间,高电平,48个时钟周期Td:视频数据有效时间,高电平,646个时钟周期Te+Tf:行消隐前沿时间,高电平,16个时钟周期Tg;行周期时间。Tg=Ta+Tb+Tc+Td+Te+Tf=800个时钟周期。场扫描时序图:各个参数意义和时间长度(单位是行周期)Ta:垂直同步脉冲,这里为负电平,2个行周期Tb+Tc:列消隐后沿时间,高电平,32个行周期Td:视频数据有效时间,高电平,480个行周期Te+Tf:列消隐前沿时间,高电平,11个行周期Tg;场视频周期。Tg=Ta+Tb+Tc+Td+Te+Tf=524个行周期。观察电平情况,可以发现这个两个时序本质上就是由一个低电平(同步信号)加一个高电平(前沿+后沿+数据有效时间)构成。所以,编写这个时序的时候,只要按照上述的时间要求构成这么一个占空比的周期就可以。当时钟频率不是25MHz时,我们只要把以上的参数按比例适当调整即可。我们给出不同时钟频率下的时间参数。逐行解释:12:40M时钟输入,复位信号输入(低电平复位)13:行同步信号和场同步信号输出14:红、绿、蓝信号输出15:拨码开关输入。根据拨码开关的状态选择是横彩条还是竖彩条显示21-25:定义一些常量,表示行同步信号的相关参数,具体值可见上表27-31:定义一些常量,表示场同步信号的相关参数,具体值可见上表33:自定义一种枚举类型h_state,表示整个扫描过程中行同步信号的状态34:自定义一种枚举类型v_state,表示整个扫描过程中场同步信号的状态36:定义一个行同步信号的内部信号量37-38:分别用上述的自定义枚举类型定义两个信号。在程序中需要用这两个信号分别实现行同步信号和场同步信号的状态改变。40-41:定义两个计数器,它们分别从两个进程中把变量的值传出来。46:将内部行同步信号并行输出到端口48-100:产生行同步信号。用状态机实现。50:定义一个计数器52-55:系统复位。状态机置为hs_front,即下一步进入消隐前沿;清零计数器;把行同步信号拉高56-99:系统正常工作,通过状态机产生行同步信号。整个状态的流程是:行消隐前沿-行同步脉冲-行消隐后沿-行有效数据时间-行消隐前沿,如此循环。57:计数器加159-66:行消隐前沿。60-62:行消隐前沿未结束,状态机状态不变(即还是hs_front);根据时序要求,拉高行同步信号63-66:行消隐结束,状态机转到下一个状态hs_sync-行同步脉冲;同时根据时序要求拉低行同步信号67-74:行同步脉冲68-70:行同步脉冲未结束,状态机状态不变(即还是hs_sync);根据时序要求拉低行同步信号71-74:行同步脉冲结束,状态机转到下一个状态hs_back-行消隐后沿;同时根据时序要求拉高行同步脉冲75-82:行消隐后沿,类似与59-66或者是67-7483-91:行有效数据时间,类似与59-66或者是67-74。状态机重新回到hs_front-行消隐前沿92-95:其它的状态。状态机置为hs_front,即下一步进入消隐前沿;清零计数器;把行同步信号拉高99:把计数器变量的值传递到外部的信号量中去,我们需要用这个信号量做颜色值的设置。102-154:产生场同步信号。用状态机实现。该实现过程类似于行同步信号的产生,在此不再赘述。只是要注意一点:场时序中是以行周期为单位,所以我们用行同步信号脉冲来触发计数,非40M的像素时钟(即输入时钟)156-196:根据拨码开关的状态和两个计数器的值分别设置颜色信号R、G、B159-176:拨码开关全0,产生竖彩条。其原理就是将行有效时间平分成几段,在每段内填充不同的颜色。注意:颜色数据只在行数据有效时间有效,所以要跳过前沿+同步+后沿时间。具体操作就是在不同的行时间段内填充不同的颜色。程序比较简单,大家可自行读懂。177-194:拨码开关全0,产生横彩条。其原理就是将场有效时间平分成几段,在每段内填充不同的颜色。具体操作和注意点同竖彩条的实现,在此不再赘述。