阳小明VGA彩色信号发生器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
出题教师:阳小明
VGA 彩条信号发生器
一、设计简要说明:
用FPGA 实现VGA 的彩条信号显示,通过按键实现横纹、竖纹、方格图案的变化,并能进一步设计出文字、图像的显示。
显示图像分辩率为640×480,刷新率为60Hz 。
VGA 显示原理见教材《数字系统设计与Verilog HDL 》(第三版)P276,这里只做简单介绍。
当显示屏分辩率为640×480时,整个屏上有640×480=307200个点(也称为像素),每个点的位置由其所在行和列确定,如图1所示A 点的位置是410行450列。
一幅图像就由这样的点阵来显示,像素点点亮的方式为从左到右,从上到下一行一行地扫描,当一屏扫完也就完成了一帧图像的显示,一秒钟扫60帧图像,其刷新率为60Hz 。
设计的关键在于:1、显示某一颜色的位置;2、如何由二进制代表颜色。
应当注意,VGA 显示器每扫描完一行,再扫描一下行时会花一定时间来准备,因此要满足时序要求,见图2。
图2 VGA 行扫描时序图
同样每扫描完一帧,再扫描下一帧行时也会花一定时间来准备,因此也要满足其时序要求,见图3。
图3 VGA 场扫描时序图
0 450 410 从0计数到639
从0计数到479
显示的颜色用三位二进制表示,共可以显示八种颜色,对应关系见表1:
表1颜色编码
二、源代码及说明(参考)
//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] 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 c lock<=~clock; e nd
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) //时钟clock 为25MHz
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'b100; //蓝 else if(hcnt<=h_Ta+h_Tb+h_Tc+320-1) rgbx<=3'b101; //青 else if(hcnt<=h_Ta+h_Tb+h_Tc+400-1) rgbx<=3'b110; //品 else if(hcnt<=h_Ta+h_Tb+h_Tc+480-1) rgbx<=3'b000; //黑 1 0
1 0 1 0 1 0 B 1 1 0 0 1 1 0 0 G 1 1 1 1 0 0 0 0 R 白 黄 青 红 品
绿 蓝 黑 颜色
else if(hcnt<=h_Ta+h_Tb+h_Tc+560-1) 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) 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'b100; else if(vcnt<=v_Ta+v_Tb+v_Tc+240-1) rgby<=3'b101; else if(vcnt<=v_Ta+v_Tb+v_Tc+300-1) rgby<=3'b110; else if(vcnt<=v_Ta+v_Tb+v_Tc+360-1) rgby<=3'b111; else if(vcnt<=v_Ta+v_Tb+v_Tc+420-1) rgby<=3'b011; else if(vcnt<=v_Ta+v_Tb+v_Tc+480-1) rgby<=3'b111; 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
三、仿真结果
四、硬件测试 实验开发板(教改项目完成后可以提供相应平台)
五、思考题(指导教师根据学生完成思考题情况酌情加分)
1、如何在VGA 显示器上显示“EDA ”三个字。
2、如何在VGA 显示器上显示图片。
3、要实现图像平移应如何实现。
VGA 上显示的竖条纹
VGA 上显示的横条纹
VGA 上显示的彩色方格。