//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 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) //时钟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; //黑
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
fpga的vga色彩条显示问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 老皮芽子 2021-09-26 14:08关注
这个代码应该没问题了。红包就不用了。没问题就点"采纳"吧
//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,rgby; reg[9:0] hcnt,vcnt; reg[3:0] rgbx; 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) //时钟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<=4'b0000; //黑色 else if(hcnt<=h_Ta+h_Tb+h_Tc+80-1) rgbx<=4'b1001; //红 else if(hcnt<=h_Ta+h_Tb+h_Tc+160-1) rgbx<=4'b1010; //绿 else if(hcnt<=h_Ta+h_Tb+h_Tc+240-1) rgbx<=4'b1100; //蓝 else if(hcnt<=h_Ta+h_Tb+h_Tc+320-1) rgbx<=4'b1101; //青 else if(hcnt<=h_Ta+h_Tb+h_Tc+400-1) rgbx<=4'b1110; //品 else if(hcnt<=h_Ta+h_Tb+h_Tc+480-1) rgbx<=4'b1000; //黑 else if(hcnt<=h_Ta+h_Tb+h_Tc+560-1) rgbx<=4'b1011; //黄 else if(hcnt<=h_Ta+h_Tb+h_Tc+640-1) rgbx<=4'b1111; //白 else rgbx<=4'b0000; 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[2:0]; else if(key==2'b01) rgb<=rgbx[3] == 0 ? 3'b000:rgby; else if(key==2'b10) rgb<=rgbx[3] == 0 ? 3'b000:(rgbx[2:0]+rgby); else rgb<=rgbx[3] == 0 ? 3'b000:(rgbx[2:0]-rgby); end endmodule
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 STM32 INMP441无法读取数据
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境