zoukankan      html  css  js  c++  java
  • FPGA VGA时序的理解

    最近在做FPGA毕业设计,毕业设计规划的是摄像头采集图像,经过均值滤波,中值滤波,高斯滤波,然后通过VGA接口控制显示器显示出来,所以最近学习了一下FPGAVGA驱动的相关内容。

    VGA接口

     

    如上图所示,VGA接口一共15针,分为3*5。

     

    主要使用的信号线是上面的5根线,行同步信号,场同步信号和R,G,B基色的模拟信号。

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,完成一屏后在返回来扫描剩下的线,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。

     

    VGA水平扫描时序

     

    VGA垂直扫描时序

     

    VGA时序图

     

    如上图VGA显示时序所示,VGA每次显示都需要同步信号,经过同步脉冲a,显示后沿b,显示时序段c,显示前沿d,然后是同步脉冲a,这样一个循环。

    根据VGA协议标准,以640*480 60HZ为例,每秒钟要显示60次,一次显示800*525个点,其中640*480为显示时序段的有效点,其他的是为了同步时序的无效点。

    如下图所示黄色区域为800个点的行周期,红色区域为525个点的场周期,只有行周期和场周期同时有效的橘色区域640*480才是有效显示区域。

     

    VGA时序分析

    一秒钟需要显示800*525*60个点,而时序的时钟频率是25MHZ,所以显示一个点的时间是25M/(800*525*60)=40ns.

     

    行时序如上图所示:

    a段的持续时间是96*40ns

    b段的持续时间是45*40ns

    c段的持续时间是646*40ns

    d段的持续时间是13*40ns

    e段的持续时间是800*40ns(e段是整个行周期)

    场时序如上图所示:

    o段的持续时间是2*e

    p段的持续时间是30*e

    q段的持续时间是484*e

    r段的持续时间是9*e

    S段的持续时间是528*e

    只有行时序处于c段和场时序处于q段的时候发送的才是有效数据,一个行周期要显示640个点,一个场周期要显示480个行。

    代码如下,代码只实现了VGA时序,时钟默认25MHZ。需要进一步修改。

    1. module vga_driver(  
    2. clk         ,  
    3. rst_n       ,  
    4. din         ,  
    5. vga_hys     ,  
    6. vga_vys     ,  
    7. vga_rgb       
    8. );  
    9. parameter       DATA_W  = 16;  
    10. input         clk      ;  
    11. input         rst_n    ;  
    12. input         din      ;  
    13. output        vga_hys    ;  
    14. output        vga_vys    ;  
    15. output [DATA_W-1:0]  vga_rgb    ;  
    16. reg             vga_hys;  
    17. reg             vga_vys;  
    18. reg     [DATA_W-1:0]    vga_rgb;  
    19. reg     [9:0]   cnt_hys;  
    20. reg     [9:0]   cnt_vys;  
    21. wire            add_cnt_hys;  
    22. wire            end_cnt_hys;  
    23. wire            add_cnt_vys;  
    24. wire            end_cnt_vys;  
    25. reg             display_area;  
    26. always @(posedge clk or negedge rst_n)begin  
    27. if(!rst_n)begin  
    28. cnt_hys <= 0;  
    29. end  
    30. else if(add_cnt_hys)begin  
    31. if(end_cnt_hys)  
    32. cnt_hys <= 0;  
    33. else  
    34. cnt_hys <= cnt_hys + 1;  
    35. end  
    36. end  
    37. assign add_cnt_hys = 1;         
    38. assign end_cnt_hys = add_cnt_hys && cnt_hys== 800-1;     
    39. always @(posedge clk or negedge rst_n)begin  
    40. if(!rst_n)begin  
    41. cnt_vys <= 0;  
    42. end  
    43. else if(add_cnt_vys)begin  
    44. if(end_cnt_vys)  
    45. cnt_vys <= 0;  
    46. else  
    47. cnt_vys <= cnt_vys + 1;  
    48. end  
    49. end  
    50. assign add_cnt_vys = end_cnt_hys;         
    51. assign end_cnt_vys = add_cnt_vys && cnt_vys==525-1 ;     
    52. always  @(posedge clk or negedge rst_n)begin  
    53. if(rst_n==1'b0)begin  
    54. vga_hys <= 0;  
    55. end  
    56. else if(add_cnt_hys && cnt_hys == 96-1)begin  
    57. vga_hys <= 1;  
    58. end  
    59. else if(end_cnt_hys)begin  
    60. vga_hys <= 0;  
    61. end  
    62. end  
    63. always  @(posedge clk or negedge rst_n)begin  
    64. if(rst_n==1'b0)begin  
    65. vga_vys <= 0;  
    66. end  
    67. else if(add_cnt_vys && cnt_vys == 2-1)begin  
    68. vga_vys <= 1;  
    69. end  
    70. else if(end_cnt_vys)begin  
    71. vga_vys <= 0;  
    72. end  
    73. end  
    74. always  @(*)begin  
    75. display_area = cnt_hys >= 141 && cnt_hys <= (141+646) && cnt_vys >= 32 && cnt_vys < (32+484);  
    76. end  
    77. always  @(posedge clk or negedge rst_n)begin  
    78. if(rst_n==1'b0)begin  
    79. vga_rgb <= 0;  
    80. end  
    81. else if(display_area)  
    82. begin  
    83. vga_rgb <= din;  
    84. end  
    85. else begin  
    86. vga_rgb <= 0;  
    87. end  
    88. end  
    89. endmodule  
  • 相关阅读:
    myBatis学习笔记(10)——使用拦截器实现分页查询
    电影院的设计与实现(改进更新)
    软件设计师自我修炼1:怎样让用户对软件产生依赖
    jQuery.ajax()方法中參数具体解析
    王立平--Gallery:实现图片的左右滑动
    USB设备驱动概述
    Android中的多线程编程(一)附源代码
    Shannon-Fano-Elias编码的C语言实现
    互联网协议入门深入
    linux内核中创建线程方法【转】
  • 原文地址:https://www.cnblogs.com/Librarian/p/10066774.html
Copyright © 2011-2022 走看看