m0_61985610 2021-09-24 17:26 采纳率: 100%
浏览 106
已结题

fpga的vga色彩条显示问题

img


//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

img

img

img

  • 写回答

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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月4日
  • 已采纳回答 9月26日
  • 修改了问题 9月26日
  • 修改了问题 9月26日
  • 展开全部

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler