VGA液晶顯示

                                                            

          

                                                  

  1. //640x480
  2. //像素頻率為25M Hz. Xilinx的zedboard板子時鐘為100M Hz
  3. //逐行掃描
  4. //H_Back_Porch=40
  5. //H_Top_Border=8
  6. //H_Bottom_Border=8
  7. //H_Front_Porch=8
  8. //V_Back_Porch=25
  9. //V_Top_Border=8
  10. //V_Bottom_Border=8
  11. //V_Front_Porch=2
  12. //H_sync=96
  13. //V_sync=2
  14. module VGA(rst,clk,Hsync,Vsync,R,G,B);      
  15. input  rst,clk;
  16. output Hsync;
  17. output Vsync;
  18. output reg [3:0] R; //輸出Red
  19. output reg [3:0] G; //輸出Green
  20. output reg [3:0] B; //輸出Blue
  21. reg [9:0] H_cnt; //列計數器
  22. reg [9:0] V_cnt; //行計數器
  23. wire clk_25M;    //頻率為25M Hz
  24. wire R0_active; 
  25. wire G0_active; 
  26. wire B0_active; 
  27. wire R1_active; 
  28. wire G1_active; 
  29. wire B1_active; 
  30. reg [2:0] div_cnt; //分頻計數器
  31. //===========================================================
  32. // 4分頻.頻率為25M Hz
  33. //===========================================================
  34. always@(posedge clk or negedge rst)   
  35. begin
  36.     if(!rst)                              div_cnt <= 3'd0;
  37.     else if(div_cnt == 3'd3)  div_cnt <= 3'd0;
  38.     else                                  div_cnt <= div_cnt + 3'd1;
  39. end
  40. assign clk_25M = (div_cnt <= 3'd1) ? 1 : 0;
  41. //===========================================================
  42. //行計數器
  43. //===========================================================
  44. always@(posedge clk_25M or negedge rst)   
  45. begin
  46.     if(!rst)                                                                   V_cnt <= 10'd0;
  47.     else if(H_cnt == 10'd799)
  48.     begin
  49.         if(V_cnt == 10'd524 && H_cnt == 10'd799)   V_cnt <= 10'd0;
  50.     else                                                                      V_cnt <= V_cnt + 10'd1;
  51.     end
  52.     else                                                                      V_cnt <= V_cnt;
  53. end 
  54. //===========================================================
  55. //列計數器
  56. //===========================================================
  57. always@(posedge clk_25M or negedge rst)   
  58. begin
  59.     if(!rst)                                 H_cnt <= 10'd0;
  60.     else if(H_cnt == 10'd799)  H_cnt <= 10'd0;
  61.     else                                     H_cnt <= H_cnt + 10'd1;
  62. end
  63. //===========================================================
  64. //Hsync 和 Vsync
  65. //===========================================================
  66. assign Hsync= (H_cnt < 10'd96) ? 1 : 0
  67. assign Vsync= (V_cnt < 10'd2) ? 1 : 0;  
  68. //===========================================================
  69. //有效顯示區內active為1
  70. //===========================================================
  71. //有效顯示區內active==1.顯示Red
  72. assign R0_active = (H_cnt>10'd143 && H_cnt<10'd249 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  73. //有效顯示區內active==1.顯示Green
  74. assign G0_active = (H_cnt>10'd250 && H_cnt<10'd356 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  75. //有效顯示區內active==1.顯示Blue
  76. assign B0_active = (H_cnt>10'd357 && H_cnt<10'd463 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  77. //有效顯示區內active==1.顯示Red
  78. assign R1_active = (H_cnt>10'd464 && H_cnt<10'd570 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  79. //有效顯示區內active==1.顯示Green
  80. assign G1_active = (H_cnt>10'd571 && H_cnt<10'd677 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  81. //有效顯示區內active==1.顯示Blue
  82. assign B1_active = (H_cnt>10'd678 && H_cnt<10'd783 && V_cnt>10'd34 && V_cnt<10'd514) ? 1 : 0;
  83. //===========================================================
  84. //RGB輸出
  85. //===========================================================
  86. always@(posedge clk_25M)   
  87. begin
  88.     if(R0_active == 1'b1)       //顯示Red
  89.     begin
  90.         R <= 4'b1111;
  91.         G <= 4'b0;
  92.         B <= 4'b0;
  93.     end
  94.     else if(G0_active == 1'b1) //顯示Green
  95.     begin
  96.         R <= 4'b0;
  97.         G <= 4'b1111;
  98.         B <= 4'b0;
  99.     end
  100.     else if(B0_active == 1'b1) //顯示Blue
  101.     begin
  102.         R <= 4'b0;
  103.         G <= 4'b0;
  104.         B <= 4'b1111;
  105.     end
  106.     else if(R1_active == 1'b1) //顯示Red
  107.     begin
  108.         R <= 4'b1111;
  109.         G <= 4'b0;
  110.         B <= 4'b0;
  111.     end
  112.     else if(G1_active == 1'b1) //顯示Green
  113.     begin
  114.         R <= 4'b0;
  115.         G <= 4'b1111;
  116.         B <= 4'b0;
  117.     end
  118.     else if(B1_active == 1'b1) //顯示Blue
  119.     begin
  120.         R <= 4'b0;
  121.         G <= 4'b0;
  122.         B <= 4'b1111;
  123.     end
  124.     else
  125.     begin
  126.         R <= 4'b0;
  127.         G <= 4'b0;
  128.         B <= 4'b0;
  129.     end    
  130. end
  131. //===========================================================
  132. endmodule 


螢幕輸出依序為Red.Green.Blue.Red.Green.Blue,故實驗完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值