[X]关闭

MiZ702学习笔记(番外篇)——纯PL VGA驱动

文档创建者:宋桓公
浏览次数:6006
最后更新:2016-02-03
本帖最后由 宋桓公 于 2016-1-20 19:51 编辑

  这篇基本只是贴出代码,不做详细的说明。如果想看详细的说明可以参考自恋狂vip版主的:2.VGA时序与模拟彩条实现http://www.osrc.cn/forum.php?mod=viewthread&tid=650&fromuid=13
(出处: 电子资源)
  但是上篇的VGA显示效果不是很好,这篇到时会上篇进行整合,做成资料。这篇的代码是经过精雕细琢的,追求的是时序的完美。

还有本篇代码分频是手工分频,方便大家移植程序。希望跟着本教程学习的同学,可以根据:
MiZ702学习笔记10——文本实例化IP的方法
http://www.osrc.cn/forum.php?mod=viewthread&tid=717&fromuid=13
(出处: 电子资源)
这篇文件,进行修改,将手工分配改成IP分配。算是给大家布置的作业。

  程序结构如下:
  
外加一个头文件:
  lcd_para.v

vga_demo.v 主要负责给VGA接口赋值,实现彩条
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: 米联
  4. // Engineer: 宋桓公
  5. //
  6. // Create Date: 2016/01/09 11:52:30
  7. // Design Name:
  8. // Module Name: vga_demo
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module vga_demo(
  22.         input CLK,
  23.     input RSTn,
  24.     //硬件接口  
  25.     output lcd_hs,                    //lcd horizontal sync
  26.     output lcd_vs,                    //lcd vertical sync
  27.     //output lcd_blank,                //lcd blank(L:blank)
  28.     output[3:0] lcd_red,            //lcd red data
  29.     output[3:0] lcd_green,        //lcd green data
  30.     output[3:0] lcd_blue            //lcd blue data
  31. );
  32. `include "lcd_para.v"
  33. reg rCLK_25M;
  34. reg [2:0]i;
  35. //简单粗暴的弄个4分频,从100M到25M
  36. always@(posedge CLK or negedge RSTn)
  37.     if(!RSTn)
  38.     begin
  39.         rCLK_25M <= 1'b0;
  40.         i <= 3'd0;
  41.     end
  42.     else
  43.         case(i)
  44.             0,1,2,3:
  45.             begin
  46.                 rCLK_25M <= 1'b1;
  47.                 i <= i + 1'b1;
  48.             end
  49.            4,5,6:
  50.             begin
  51.                 rCLK_25M <= 1'b0;
  52.                 i <= i + 1'b1;
  53.             end
  54.             7:
  55.             begin
  56.                 rCLK_25M <= 1'b0;
  57.                 i <= 3'd0;
  58.             end
  59.         endcase
  60.     wire CLK_25M = rCLK_25M;
  61. //-------------------------------------------------
  62. reg [11:0]lcd_rgb;                                //RGB
  63. wire [10:0]lcd_xpos;                                //lcd horizontal coordinate
  64. wire [10:0]lcd_ypos;                                //lcd vertical coordinate        
  65. my_vga        VGA
  66.                         (
  67.                                 .CLK(CLK_25M),
  68.                                 .RSTn(RSTn),
  69.                                 //用户接口
  70.                                 .lcd_rgb(lcd_rgb),                                //RGB
  71.                                 .lcd_xpos(lcd_xpos),                                //lcd horizontal coordinate
  72.                                 .lcd_ypos(lcd_ypos),                                //lcd vertical coordinate        
  73.                                 //硬件接口
  74.                                 .lcd_hs(lcd_hs),                                        //lcd horizontal sync
  75.                                 .lcd_vs(lcd_vs),                                        //lcd vertical sync
  76.                                 .lcd_blank(/*空*/),                        //lcd blank(L:blank)
  77.                                 .lcd_red(lcd_red),                                //lcd red data
  78.                                 .lcd_green(lcd_green),                        //lcd green data
  79.                                 .lcd_blue(lcd_blue)                                //lcd blue data
  80.                         );
  81. always@(posedge CLK or negedge RSTn)
  82. begin
  83.         if(!RSTn)
  84.                 lcd_rgb <= 12'h0;
  85.         else
  86.                 begin
  87.                 if        (lcd_xpos >= 0 && lcd_xpos < (`H_DISP/8)*1)
  88.                         lcd_rgb <= `RED;
  89.                 else if(lcd_xpos >= (`H_DISP/8)*1 && lcd_xpos < (`H_DISP/8)*2)
  90.                         lcd_rgb <= `GREEN;
  91.                 else if(lcd_xpos >= (`H_DISP/8)*2 && lcd_xpos < (`H_DISP/8)*3)
  92.                         lcd_rgb <= `BLUE;
  93.                 else if(lcd_xpos >= (`H_DISP/8)*3 && lcd_xpos < (`H_DISP/8)*4)
  94.                         lcd_rgb <= `WHITE;
  95.                 else if(lcd_xpos >= (`H_DISP/8)*4 && lcd_xpos < (`H_DISP/8)*5)
  96.                         lcd_rgb <= `BLACK;
  97.                 else if(lcd_xpos >= (`H_DISP/8)*5 && lcd_xpos < (`H_DISP/8)*6)
  98.                         lcd_rgb <= `YELLOW;
  99.                 else if(lcd_xpos >= (`H_DISP/8)*6 && lcd_xpos < (`H_DISP/8)*7)
  100.                         lcd_rgb <= `CYAN;
  101.                 else
  102.                         lcd_rgb <= `ROYAL;
  103.                 end
  104. end
  105. endmodule
复制代码
my_vga.v 封装VGA接口:
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: 米联
  4. // Engineer: 宋桓公
  5. //
  6. // Create Date: 2016/01/09 10:08:16
  7. // Design Name:
  8. // Module Name: my_vga
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module my_vga(
  22.         input CLK,
  23.     input RSTn,
  24.     //用户接口
  25.     input [11:0]lcd_rgb,            //RGB444
  26.     output [10:0]lcd_xpos,          //lcd horizontal coordinate
  27.     output [10:0]lcd_ypos,          //lcd vertical coordinate   
  28.    
  29.     //硬件接口
  30.     output lcd_hs,                  //lcd horizontal sync
  31.     output lcd_vs,                  //lcd vertical sync
  32.     output lcd_blank,               //lcd blank(L:blank)
  33.     output[3:0] lcd_red,            //lcd red data
  34.     output[3:0] lcd_green,          //lcd green data
  35.     output[3:0] lcd_blue            //lcd blue data
  36. );
  37. wire Ready_Sig;
  38. sync_module    sync
  39. (
  40.     .CLK(CLK),
  41.     .RSTn(RSTn),
  42.    
  43.     .Ready_Sig(Ready_Sig),
  44.     .lcd_xpos(lcd_xpos),
  45.     .lcd_ypos(lcd_ypos),
  46.    
  47.     .lcd_vs(lcd_vs),
  48.     .lcd_hs(lcd_hs),
  49.     .lcd_blank(lcd_blank)
  50. );
  51.    
  52.    
  53. assign {lcd_red, lcd_green ,lcd_blue} = Ready_Sig ? lcd_rgb : 12'd0;
  54.    
  55.    
  56.    
  57. endmodule
复制代码
sync_module.v VGA驱动时序:
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: 米联
  4. // Engineer: 宋桓公
  5. //
  6. // Create Date: 2016/01/09 11:15:59
  7. // Design Name:
  8. // Module Name: sync_module
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module sync_module(
  22.         input CLK,
  23.     input RSTn,
  24.    
  25.     output [10:0]lcd_xpos,
  26.     output [10:0]lcd_ypos,
  27.     output Ready_Sig,
  28.    
  29.     output lcd_hs,
  30.     output lcd_vs,
  31.     output lcd_blank
  32.     );
  33.     `include "lcd_para.v"
  34.         reg [10:0]Count_H;
  35.         reg [10:0]Count_V;
  36.         reg rH,rV;
  37.         
  38.         always @(posedge CLK or negedge RSTn)
  39.                 if(!RSTn)
  40.                 begin
  41.                         Count_H <= 11'd0;
  42.                         Count_V <= 11'd0;
  43.                         rH <= 1'b1;
  44.                         rV <= 1'b1;
  45.                 end
  46.                 else
  47.                 begin
  48.                         if(Count_H == `H_TOTAL) rH <= 1'b0;
  49.                         else if(Count_H == `H_SYNC) rH <= 1'b1;
  50.                         else if(Count_H == 0) rH <= 1'b0;
  51.                         if(Count_V == `V_TOTAL) rV <= 1'b0;
  52.                         else if(Count_V == `V_SYNC) rV <= 1'b1;
  53.                         else if(Count_V == 0) rV <= 1'b0;
  54.                         if(Count_V == `V_TOTAL) Count_V <= 11'd1;
  55.                         else if(Count_H == `H_TOTAL) Count_V <= Count_V + 1'b1;
  56.                         if(Count_H == `H_TOTAL) Count_H <= 11'd1;
  57.                         else Count_H <= Count_H + 1'b1;
  58.                 end
  59.                
  60.                 wire h_sig = ( Count_H <= `H_SYNC - 11'd1) ? 1'b0 : 1'b1;
  61.                 wire v_sig = ( Count_V <= `V_SYNC - 11'd1) ? 1'b0 : 1'b1;
  62.                 //lcd_blank为高时,发出的颜色信号才有效!!
  63.                 assign lcd_blank = h_sig & v_sig;
  64.                
  65.                 assign lcd_hs = rH;
  66.                 assign lcd_vs = rV;
  67.                
  68. //--------------------------------------        
  69.                 reg V_Ready;
  70.                 always @(posedge CLK or negedge RSTn)
  71.                         if(!RSTn)
  72.                                 V_Ready <= 1'b0;
  73.                         else if( (Count_V >= `V_Start) &&
  74.                                                 (Count_V <= `V_END) )
  75.                                 V_Ready <= 1'b1;
  76.                         else
  77.                                 V_Ready <= 1'b0;
  78.                                 
  79.                
  80.                 reg H_Ready;
  81.                 always @(posedge CLK or negedge RSTn)
  82.                         if(!RSTn)
  83.                                 H_Ready <= 1'b0;
  84.                         else if( (Count_H >= (`H_Start - 11'd1)) &&
  85.                                                 (Count_H < (`H_END - 11'd1)) )  //后面一个判断不能要等于号
  86.                                 H_Ready <= 1'b1;
  87.                         else
  88.                                 H_Ready <= 1'b0;
  89.                 assign Ready_Sig = V_Ready & H_Ready;
  90.                
  91. //-------------------------------------------------------        
  92.                 reg [10:0]xpos;
  93.                 always @(posedge CLK or negedge RSTn)
  94.                         if(!RSTn)
  95.                         begin
  96.                                 xpos <= 11'd0;
  97.                         end
  98.                         else if(Ready_Sig)
  99.                         begin
  100.                                 xpos <= xpos + 1'b1;
  101.                         end
  102.                         else
  103.                         begin
  104.                                 xpos <= 11'd0;
  105.                         end
  106.                         
  107.                 assign lcd_xpos = xpos;
  108.                
  109.                 reg [10:0]ypos;
  110.                 always @(posedge CLK or negedge RSTn)
  111.                         if(!RSTn)
  112.                         begin
  113.                                 ypos <= 11'd0;
  114.                         end
  115.                         else if(xpos == `H_DISP)
  116.                         begin
  117.                                 if(ypos == `V_DISP) ypos <= 11'd0;
  118.                                 else ypos <= ypos + 1'b1;
  119.                         end
  120.                         
  121.                 assign lcd_ypos = ypos;
  122.    
  123.    
  124. endmodule
复制代码



最后是lcd_para.v,起到头文件的作用:
  1. //define colors RGB--4|4|4
  2. `define RED         12'h800     /*1111,0000,0000 */
  3. `define GREEN       12'hF0      /*0000,1111,0000 */
  4. `define BLUE        12'h00F     /*0000,0000,1111 */
  5. `define WHITE       12'hFFF     /*1111,1111,1111 */
  6. `define BLACK       12'h000     /*0000,0000,0000 */
  7. `define YELLOW      12'hFF0     /*1111,1111,0000 */
  8. `define CYAN        12'hF0F     /*1111,0000,1111 */
  9. `define ROYAL       12'h0FF     /*0000,1111,1111 */
  10. //---------------------------------
  11. `define        SYNC_POLARITY 1'b0
  12. //------------------------------------
  13. //vga parameter define
  14. `define        VGA_640_480_60FPS_25MHz
  15. //`define        VGA_800_600_72FPS_50MHz
  16. //`define        VGA_1024_768_60FPS_65MHz
  17. //`define        VGA_1280_1024_60FPS_105MHz
  18. //`define VGA_800_600_60MHz
  19. //---------------------------------
  20. //        640 * 480
  21. `ifdef        VGA_640_480_60FPS_25MHz
  22. `define        H_FRONT        11'd16
  23. `define        H_SYNC         11'd96  
  24. `define        H_BACK         11'd48  
  25. `define        H_DISP        11'd640
  26. `define        H_TOTAL        11'd800         
  27.                                          
  28. `define        V_FRONT        11'd10  
  29. `define        V_SYNC         11'd2   
  30. `define        V_BACK         11'd33
  31. `define        V_DISP         11'd480   
  32. `define        V_TOTAL        11'd525
  33. `endif
  34. //---------------------------------
  35. //        800 * 600
  36. `ifdef VGA_800_600_72FPS_50MHz
  37. `define        H_FRONT        11'd56
  38. `define        H_SYNC         11'd120  
  39. `define        H_BACK         11'd64  
  40. `define        H_DISP         11'd800
  41. `define        H_TOTAL        11'd1040
  42.                                        
  43. `define        V_FRONT        11'd37  
  44. `define        V_SYNC         11'd6   
  45. `define        V_BACK         11'd23  
  46. `define        V_DISP         11'd600  
  47. `define        V_TOTAL        11'd666
  48. `endif
  49. //---------------------------------
  50. //        1024 * 768        
  51. `ifdef        VGA_1024_768_60FPS_65MHz
  52. `define H_FRONT        11'd24         
  53. `define H_SYNC         11'd136  
  54. `define H_BACK         11'd160
  55. `define H_DISP         11'd1024  
  56. `define H_TOTAL        11'd1344
  57.                                          
  58. `define V_FRONT        11'd3
  59. `define V_SYNC         11'd6   
  60. `define V_BACK         11'd29   
  61. `define V_DISP         11'd768
  62. `define V_TOTAL        11'd806
  63. `endif
  64. //---------------------------------
  65. //        1280 * 1024
  66. `ifdef        VGA_1280_1024_60FPS_105MHz
  67. `define        H_FRONT        11'd48
  68. `define        H_SYNC         11'd112
  69. `define        H_BACK         11'd248
  70. `define        H_DISP        11'd1280
  71. `define        H_TOTAL        11'd1688
  72.                                          
  73. `define        V_FRONT        11'd1
  74. `define        V_SYNC         11'd3   
  75. `define        V_BACK         11'd38
  76. `define        V_DISP         11'd1024   
  77. `define        V_TOTAL        11'd1066
  78. `endif
  79. //        800 * 600
  80. `ifdef        VGA_800_600_60MHz
  81. `define        H_SYNC         11'd128
  82. `define        H_BACK         11'd88
  83. `define        H_DISP        11'd800
  84. `define        H_FRONT        11'd40
  85. `define        H_TOTAL        11'd1056
  86.                                          
  87. `define        V_SYNC         11'd4   
  88. `define        V_BACK         11'd23
  89. `define        V_DISP         11'd600  
  90. `define        V_FRONT        11'd1
  91. `define        V_TOTAL        11'd628
  92. `endif
  93. //--song
  94. `define        H_Start        (`H_SYNC + `H_BACK)
  95. `define        H_END         (`H_SYNC + `H_BACK + `H_DISP)
  96. `define        V_Start        (`V_SYNC + `V_BACK)
  97. `define        V_END         (`V_SYNC + `V_BACK + `V_DISP)
复制代码


最后奉上,引脚约束文件:
  1. set_property PACKAGE_PIN Y9 [get_ports {CLK}]  
  2. set_property IOSTANDARD LVCMOS33 [get_ports {CLK}]  
  3. set_property PACKAGE_PIN T18 [get_ports {RSTn}]
  4. set_property IOSTANDARD LVCMOS18 [get_ports {RSTn}]  
  5. # HSync         Horizontal sync         AA19
  6. set_property PACKAGE_PIN AA19 [get_ports {lcd_hs}]
  7. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_hs}]
  8. # VSync         Vertical sync         Y19
  9. set_property PACKAGE_PIN Y19 [get_ports {lcd_vs}]
  10. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_vs}]
  11. # V20, U20, V19, V18
  12. set_property PACKAGE_PIN V20 [get_ports {lcd_red[0]}]
  13. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_red[0]}]
  14. set_property PACKAGE_PIN U20 [get_ports {lcd_red[1]}]
  15. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_red[1]}]
  16. set_property PACKAGE_PIN V19 [get_ports {lcd_red[2]}]
  17. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_red[2]}]
  18. set_property PACKAGE_PIN V18 [get_ports {lcd_red[3]}]
  19. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_red[3]}]
  20. # AB22, AA22, AB21, AA21
  21. set_property PACKAGE_PIN AB22 [get_ports {lcd_green[0]}]
  22. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_green[0]}]
  23. set_property PACKAGE_PIN AA22 [get_ports {lcd_green[1]}]
  24. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_green[1]}]
  25. set_property PACKAGE_PIN AB21 [get_ports {lcd_green[2]}]
  26. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_green[2]}]
  27. set_property PACKAGE_PIN AA21 [get_ports {lcd_green[3]}]
  28. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_green[3]}]
  29. # Y21, Y20, AB20, AB19
  30. set_property PACKAGE_PIN Y21 [get_ports {lcd_blue[0]}]
  31. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_blue[0]}]
  32. set_property PACKAGE_PIN Y20 [get_ports {lcd_blue[1]}]
  33. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_blue[1]}]
  34. set_property PACKAGE_PIN AB20 [get_ports {lcd_blue[2]}]
  35. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_blue[2]}]
  36. set_property PACKAGE_PIN AB19 [get_ports {lcd_blue[3]}]
  37. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_blue[3]}]
复制代码


  我们最终选择的是VGA_640_480_60FPS_25MHz。640_480决定是画面的大小,25MHz是我VGA扫描的频率。因为我VGA驱动模块的时钟输入是25M,所以这里只能选择VGA_640_480_60FPS_25MHz。640_480画面的大小其实是无所谓的,应为现在的VGA都有自动缩放的功能,所以都是满屏显示。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 5

贾文洋

发表于 2016-1-21 15:32:12 | 显示全部楼层

你这个代码有问题,烧进去黑屏!??

宋桓公

发表于 2016-1-21 21:49:25 | 显示全部楼层

我试过,没问题的

ace2008888

发表于 2016-2-2 10:45:51 | 显示全部楼层

有两个问题
1.如果我再AXI总线上多挂几个器件,其他任何器件的操作,都会使屏变颜色。
2.你只能进行整屏的颜色,无法进行彩条显示。
3.我通过你这个PL+PS的模式怎么实现在屏幕上显示单个点或者字或者图片呢。

以上请给个思路。

宋桓公

发表于 2016-2-3 13:06:27 | 显示全部楼层

1、你不要只用一条总线,可以生成多条。
2、你自己的问题。
3、首先对图片取模,然后根据VGA输出的XY值,进行填充自己取得膜。你得了解VGA的显示方式

ace2008888

发表于 2016-2-3 19:31:18 | 显示全部楼层

宋桓公 发表于 2016-2-3 13:06
1、你不要只用一条总线,可以生成多条。
2、你自己的问题。
3、首先对图片取模,然后根据VGA输出的XY值, ...

2、你自己的问题。-----------想问下,问题出在哪里,我是用这段代码都没有改变?是哪里参数设置错了?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则