当前位置:   article > 正文

VGA 时序与实现

VGA 时序与实现

1.  VGA 时序标准

小梅哥视频链接:23A VGA成像原理与时序详解_哔哩哔哩_bilibili

行扫描时序图

场扫描时序图
具体参数自己查表

2.  640*480 分辨率 VGA 控制器时序分析

2.1  行扫描区间构成

H Sync Time
H Bach PorchH Left BorderH Data TimeH Right BorderH Front Porch
96 vclk40 vclk8 vclk640 vclk8 vclk8 vclk

        行计数器 HS 脉冲信号结束 (VGA_HS_end

                           图像数据开始输出(hdat_begin)

                           图像结束 输出(hdat_end),

                           行扫描停止(hpixel_end

时间节点参数VGA_HS_endhdat_beginhdat_endhpixel_end
节点值clk95143783799

2.2  场扫描区间构成

V Sync Time
V Bach PorchV Left BorderV Data TimeV Right BorderV Front Porch
2 lines
25 lines8 lines480 lines8 lines2 lines

        场扫描 是以一次行扫描的时间为单位。

        场计数器: VS 脉冲信号结束 (VGA_VS_end

                           图像数据开始输出(vdat_begin)

                           图像结束 输出(vdat_end),

                           行扫描停止(vline_end)

时间节点参数VGA_VS_endvdat_beginvdat_end
vline_end
节点值line134514524

3.  Verilog  实现

3.1  design sources 

  1. module vga(
  2. input clk ,
  3. input reset_n ,
  4. input [23:0]data ,
  5. output reg data_req ,
  6. output reg VGA_HS ,
  7. output reg VGA_VS ,
  8. output reg VGA_BLK ,
  9. output reg [23:0]VGA_RGB
  10. );
  11. parameter VGA_HS_end = 95 ;
  12. parameter Hdat_begin = 143 ;
  13. parameter Hdat_end = 783 ;
  14. parameter Hpixel_end = 799 ;
  15. parameter VGA_VS_end = 1 ;
  16. parameter Vdat_begin = 34 ;
  17. parameter Vdat_end = 514 ;
  18. parameter Vline_end = 524 ;
  19. //行计数器
  20. reg[9:0]H_cnt;
  21. always@(posedge clk or negedge reset_n)
  22. if(!reset_n) H_cnt <= 0 ;
  23. else if(H_cnt == Hpixel_end)
  24. H_cnt <= 0 ;
  25. else
  26. H_cnt <= H_cnt + 1'b1 ;
  27. // 场计数器
  28. reg[9:0]V_cnt;
  29. always@(posedge clk or negedge reset_n)
  30. if(!reset_n) V_cnt <= 0 ;
  31. else if(H_cnt == Hpixel_end)
  32. if(V_cnt == Vline_end)
  33. V_cnt <= 0 ;
  34. else
  35. V_cnt <= V_cnt + 1'b1 ;
  36. else
  37. V_cnt <= V_cnt ;
  38. // VGA_HS
  39. always@(posedge clk or negedge reset_n)
  40. if(!reset_n) VGA_HS <= 1;
  41. else if(H_cnt == 0) VGA_HS <= 0;
  42. else if(H_cnt > VGA_HS_end) VGA_HS <= 1;
  43. // VGA_VS
  44. always@(posedge clk or negedge reset_n)
  45. if(!reset_n) VGA_VS <= 1;
  46. else if(V_cnt == 0) VGA_VS <= 0;
  47. else if(V_cnt > VGA_VS_end) VGA_VS <= 1;
  48. // data_req
  49. always@(posedge clk or negedge reset_n)
  50. if(!reset_n) data_req <= 0 ;
  51. else data_req <= ((H_cnt >= Hdat_begin)&&(H_cnt < Hdat_end)&&(V_cnt >= Vdat_begin)&&(V_cnt <= Vdat_end)) ? 1 : 0;
  52. // VGA_BLK
  53. always@(posedge clk or negedge reset_n)
  54. if(!reset_n) VGA_BLK <= 0 ;
  55. else VGA_BLK <= data_req ;
  56. // VGA_RGB
  57. always@(posedge clk )
  58. if(data_req) VGA_RGB <= data ;
  59. else VGA_RGB <= 0 ;
  60. endmodule

3.2   vga_tb

  1. `timescale 1ns / 1ns
  2. module vga_tb( );
  3. reg clk , reset_n;
  4. reg [23:0]data;
  5. wire data_req ,VGA_HS ,VGA_VS ,VGA_BLK;
  6. wire [23:0]VGA_RGB;
  7. vga vga_(
  8. clk ,
  9. reset_n ,
  10. data ,
  11. data_req ,
  12. VGA_HS ,
  13. VGA_VS ,
  14. VGA_BLK ,
  15. VGA_RGB
  16. );
  17. initial clk = 1 ;
  18. always#20 clk = ~clk ;
  19. initial
  20. begin
  21. reset_n = 0 ;
  22. #201 ;
  23. reset_n = 1 ;
  24. #40000000;
  25. $stop;
  26. end
  27. always@(posedge clk or negedge reset_n)
  28. if(!reset_n) data <= 0 ;
  29. else if(data_req) data <= data + 1'b1 ;
  30. else data <= data ;
  31. endmodule

3.3  测试结果

行扫描  周期32us
场扫描  周期16.8ms
调试data_req算了好久,下班班哩~
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/424221
推荐阅读
相关标签
  

闽ICP备14008679号