基于FPGA的VGA彩条信号产生器原理及源代码
------------------------------------------------------------------------------------------------
基于FPGA的VGA彩条信号产生器原理及源代码
一、VGA显示原理
1、VGA显示器采用光栅扫描方式,即轰击荧光屏的电子束在CRT显示器上从左到右、从上到下做有规律的移动,其水平移动受水平同步信号HSYNC控制,垂直移动受垂直同步信号VSYNC控制。扫描方式多采用逐行扫描。完成一行扫描的时间称为水平扫描时间,其倒数称为行频率,完成一帧扫描时间称为竽扫描时间,其倒数称为场频,又称为刷新率。VGA工业
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
要求的时钟频率如下:
时钟频率 25.175MHZ 行频
31469HZ 场频 59.94HZ
2、VGA显示器总是从屏幕的左上角开始扫描同,先水平扫描完一行(640个像素点)到最右边,然后回到最左边(期间CRT对电子束作行消隐),换下一行,继续扫描,直到扫描到屏幕的最右下角(共480行),这样就扫描完一帧图像,然后再回到屏幕最左上角(期间CRT对电子束作场消隐),开始下一帧图像的扫描。这样的扫描标准VGA模式(640*480*60HZ)下,每秒需扫描60帧,面每一个像素点的扫描周期大约为40ns。
3、VGA显示器上的每一个像素点可以有多种颜色,由三基色信号R、G、B组合构成,本例中为节省空间,每个像素点采用3位二进制数
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示(R、G、B信号各为1位),因此总共可显示8种颜色,如表1所示。
——————————————————————————————————————
------------------------------------------------------------------------------------------------
图1
表2 行扫描时序要求(单位:像素)
根据以上的行、场扫描时序的要求,我们可设置两个计数器,一
个是行计数器hcnt,进行模 800计数;另一个是场计数器vcnt,进
行模525计数。行扫描计数器的驱动时钟频率(像素输出的频率)按
照VGA工业标准为25.175MHZ。场扫描计数器以行同步信号HS为驱
动时钟,当HS的下降沿到来时进行计数。设置完计数器后,就可对
行图像H-Td和场图像V-Td所对应的640*480个点赋值。
二、源代码。
在下面的例子中,实现了一个彩条信号产生器。其中key为控制
按键,当其为“00”时,显示竖彩条;当其为“01”时,显示横彩条。
其它值时显示棋盘格。 VGA彩条信号发生器源代码
/*引脚定义
clock50MHZ :输入时钟采用50MHZ:
key :彩条选择信号,为“00”时显示竖彩条,为“01”时横彩
条,其它情况显示棋盘格; rgb :输出三基色; hs :行同步信号;
vs :场同步信号。*/
module color(clock50MHZ, key, rgb, hs, vs);
input clock50MHZ ; input[1:0] key ; output hs, vs ; output[2:0]
rgb ; reg hs, vs,clock ; reg[2:0] rgb ,rgbx , rgby ; reg[9:0] hcut ,vcut ;
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 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‵b100;
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‵
b001; else if(hcnt<=h,Ta+ h,Tb+ h,Tc+320-1)
else if(hcnt<=h,Ta+ h,Tb+ h,Tc+400-1)
else if(hcnt<=h,Ta+ h,Tb+ h,Tc+480-1)
else if(hcnt<=h,Ta+ h,Tb+ h,Tc+560-1) rgbx<=3‵
b101; rgbx<=3‵b110; rgbx<=3‵b000; rgbx<=3
‵b011; else if(hcnt<=h,Ta+ h,Tb+ h,Tc+640-1)
——————————————————————————————————————
------------------------------------------------------------------------------------------------
rgbx<=3‵b111; else
rgbx<=3‵b000;
if(vcnt<= v,Ta+ v,Tb+ v,Tc-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc60-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc120-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc180-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc240-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc300-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc360-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc420-1)
else if(vcnt<= v,Ta+ v,Tb+ v,Tc480-1)
else
end
always@(key)
begin if(key==2‵b00) rgb<=rgbx;
else if(key==2‵b01) rgb<=rgby;
else rgb<=(rgbx+rgby);
end
endmodule
rgby<=3‵b000; //竖彩条 rgby<=3‵b001; rgby<=3‵b010; rgby<=3‵b100; rgby<=3‵b101; rgby<=3‵b110; rgby<=3‵b111; rgby<=3‵b011; rgby<=3‵b111; rgby<=3‵——————————————————————————————————————
------------------------------------------------------------------------------------------------
b000;
——————————————————————————————————————