FPGA实验报告
关于VGA彩条信号和VGA图像显示控制设计器的学习报告
1. VGA彩条信号发生器
VGA(Vedio Graphics Array)显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT显示器上从左到右,从上到下有规律的移动。 其水平移动受到水平同步信号HSYNC控制。 垂直移动受到垂直同步信号VSYNC控制。 完成一行的扫描时间称为水平扫描时间,其倒数称为行频率。完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频,又称为刷新率。
VGA显示器总是从屏幕的坐上角开始扫描,先水平扫描完一行(640个像素)到最右边,然后再回到最左边(期间CRT对电子束作行消隐),换下一行,继续扫描,知道扫描到屏幕的最右下角(480行),这样就扫描完了一帧图像,然后再回到屏幕的最左上角(期间CRT对电子束进行场消隐)。这样的扫描在标准的VGA模式(640*480@60HZ)下,每秒需要扫描60帧,这样算来每一个像素点的扫描周期大约为40ns。
VGA显示器与FPGA间通过VGA接口进行连接,(也叫D-sub接口)。
VGA显示器上的每个像素点可有多种颜色,由三基色信号R,G,B组合构成,VGA在指定色版颜色时,一个颜色频道有6个bit,红、绿、蓝各有64种不同的变化,因此总共有 262,144 种颜色。在这其中的任何 256 种颜色可以被选为色版颜色(而这 256 种的任何 16 种可以用来显示 CGA 模式的色彩)。如R,G,B信号分别用多位表示的话,则屏幕上现实的颜色会大大丰富,但会好用更多的存储空间,另外还需要配置相应D/A
转换器。本例采用三位R,G,B信号。
颜色 黑 蓝 绿 品 红 青 黄 白 R 0 0 0 0 1 1 1 1 G 0 0 1 1 0 0 1 1 B 0 1 0 1 0 1 0 1
行扫描时序要求(单位:像素,即输出一个像素Pixel的时间间隔) 行同步头 行图像 行周期 对应位置 H_tf H_ta H_tb H_tc H_td H_te H_tg 时间Pixels 8 96 40 8 640 8 800 场扫描时序要求(单位:行,即输出一行Line的时间间隔) 行同步头 行图像 行周期 对应位置 V_tf V_ta V_tb V_tc V_td V_te V_tg 时间Lines 2 2 25 8 480 8 525 根据以上的行,场扫描时许的要求,我们可设置两个计数器,一个行扫描计数
器hcnt,进行模800计数;另一个是场扫描计数器vcnt,进行模525计数。行扫描计数器的驱动时钟频率(像素的输出频率)按照VGA的工业标准的25.175MHZ。场扫描计数器以行同步信号hs为驱动时钟,当hs下降沿到来时进行计数。设置完计数器后,就可对行图像H_td和场图像V_td所对应的640*480个点赋值。
具体实现的程序如下:
/*clock50MHZ:输入时钟,采用50MHZ; key:彩条选择信号; rgb:输出三基色; hs:行同步信号; vs:场同步信号
为观察计数器的计数情况,把hcnt和vcnt加入到了输出信号,实际不应加入到输出信号*/
module color(clock50MHZ,key,rgb,hs,vs,reset,hcnt,vcnt); input clock50MHZ,reset; input[1:0]key; output hs,vs; output[2:0]rgb;
output[9:0]hcnt,vcnt; reg hs,vs,clock;
reg[2:0]rgb,rgbx,rgby; reg[9:0]hcnt,vcnt;
parameter h_ta=96,h_tb=40,h_tc=8,h_td=640,h_te=8,h_tf=8,h_tg=800; parameter v_ta=2,v_tb=25,v_tc=8,v_td=480,v_te=8,v_tf=2,v_tg=525;
always@(posedge clock50MHZ) //2分频25MHZ begin if(!reset)
begin hs<=0;vs<=0;hcnt<=0;vcnt<=0;rgb<=0;clock<=0;end else clock<=~clock;end
always@(posedge clock) //行计数800 begin if(hcnt==h_tg-1) hcnt<=0; else hcnt<=hcnt+1;end
always@(negedge hs) //场计数525 begin if(vcnt==v_tg-1) vcnt<=0; else vcnt<=vcnt+1;end
always@(posedge clock) //产生行同步信号 begin if(hcnt<=h_ta-1) hs<=0; else hs<=1;end
always@(vcnt) /产生场同步信号
begin if(vcnt<=v_ta-1) vs<=0; else vs<=1;end
always@(posedge clock)
begin if(hcnt<=h_ta+h_tb+h_tc-1) rgbx<=3'b000;//竖彩条 else if(hcnt<=h_ta+h_tb+h_tc+80-1) rgbx<=3'b001;//蓝 else if(hcnt<=h_ta+h_tb+h_tc+160-1) rgbx<=3'b010;//绿 else if(hcnt<=h_ta+h_tb+h_tc+240-1) rgbx<=3'b011;//品 else if(hcnt<=h_ta+h_tb+h_tc+320-1) rgbx<=3'b100;//红 else if(hcnt<=h_ta+h_tb+h_tc+400-1) rgbx<=3'b101;//青 else if(hcnt<=h_ta+h_tb+h_tc+480-1) rgbx<=3'b110;//黄 else if(hcnt<=h_ta+h_tb+h_tc+560-1) rgbx<=3'b111; //白 else if(hcnt<=h_ta+h_tb+h_tc+640-1) rgbx<=3'b000;//黑 else rgbx<=3'b000;//?
if(vcnt<=v_ta+v_tb+v_tc-1) rgby<=3'b000;//横彩条 else if(vcnt<=v_ta+v_tb+v_tc+60-1) rgby<=3'b001;/蓝 else if(vcnt<=v_ta+v_tb+v_tc+120-1) rgby<=3'b010;/绿 else if(vcnt<=v_ta+v_tb+v_tc+180-1) rgby<=3'b011;//红 else if(vcnt<=v_ta+v_tb+v_tc+300-1) rgby<=3'b101;//青 else if(vcnt<=v_ta+v_tb+v_tc+360-1) rgby<=3'b110;//黄 else if(vcnt<=v_ta+v_tb+v_tc+420-1) rgby<=3'b111;//白 else if(vcnt<=v_ta+v_tb+v_tc+480-1) rgby<=3'b000;//黑 else rgby<=3'b000; end//?
always@(key)
begin if(key==2'b00) rgb<=rgbx; else if(key==2'b01) rgb<=rgby;
else if(key==2'b10) rgb<=(rgbx+rgby); else rgb=(rgbx-rgby); end endmodule
测试程序:
`timescale 1ns/1ns `define clk_cycle 20 module color_tb ;
parameter v_tg = 525 ; parameter h_te = 8 ; parameter h_tf = 8 ; parameter h_tg = 800 ; parameter v_ta = 2 ;
相关推荐: