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

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

FPGA VGA时序的理解的更多相关文章

  1. 图像处理算法的仿真平台之VGA时序

    一  概述 图像处理算法一般是用matla或OpenCV实现的,若是用FPGA实现,设计思路差别极大.matlab和opencv的优势:这些工具的优势在于可以方便地载入图像文件,或输出数据到图像文件, ...

  2. 【转载】VGA时序与原理

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信 ...

  3. VGA 时序标准

    VGA 显示器扫描方式从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步:当扫描完所有的行 ...

  4. VGA时序及其原理(转载)

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信 ...

  5. FPGA时序约束理解记录

    最近整理了一下时序约束的内容,顺便发出来分享记录一下. 任何硬件想要工作正常,均需满足建立和保持时间,至于这个概念不再陈述. 下面将重点介绍两个概念:建立余量和保持余量.FPGA内部进行时序分析无非就 ...

  6. fpga vga 显示

    VGA(Video Graphics Array)是IBM在1987年随PS/2机一起推出的一种视频传输标准,具有分辨率高.显示速率快.颜色丰富等优点,在彩色显示器领域得到了广泛的应用.不支持热插拔, ...

  7. 【转】 VGA时序及其原理

    显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信 ...

  8. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...

  9. 每天进步一点点------FPGA 静态时序分析模型——reg2reg

    2. 应用背景 静态时序分析简称STA,它是一种穷尽的分析方法,它按照同步电路设计的要求,根据电路网表的拓扑结构,计算并检查电路中每一个DFF(触发器)的建立和保持时间以及其他基于路径的时延要求是否满 ...

随机推荐

  1. java 学习笔记(四) java连接ZooKeeper

    public class Demo2 { public static void main(String[] args) { String connectString = "192.168.1 ...

  2. MyEclipse使用教程:导航代码(一)

    [MyEclipse CI 2019.4.0安装包下载] 无论是在文件之间导航还是在文件中导航,都可以使用大量导航工具来加快工作流程.目前这些导航工具可在MyEclipse,CodeMix中使用. 快 ...

  3. python之爬取网页数据总结(一)

    今天尝试使用python,爬取网页数据.因为python是新安装好的,所以要正常运行爬取数据的代码需要提前安装插件.分别为requests    Beautifulsoup4   lxml  三个插件 ...

  4. ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机【OK】

    ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机[OK]     使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能 ...

  5. 浮点数的存储、类型转换知识点(面宝P34)

    以float a=1.0f为例: (int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1: (int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换),即读a的内存时 ...

  6. entity framework delete table Error 11007:

    udate model from database 数据库表删除时,会出现“Error 11007:”的异常,此时在.edmx文件中找到此表的实体发现还存在,删除它就没有这个错误 了.

  7. 对组件、Prop 和 State的研究-----------------引用

    组件 第一步是将 UI 分解成多个组件.例如,我们可以这样来拆分房子: 现在来编码! House:  <div>    <Roof />     // 房顶    <Wa ...

  8. QT:QSS字体设置

    css,qss font-family常用的黑体宋体等字体中英文对照 当qss使用中文设置字体时,无法生效.因为qss不支持中文设置字体,所以下面给出一些常用的黑体宋体字体中英文对照. 微软雅黑: M ...

  9. Python天天学_03_基础三

    Python_day_03 金角大王: http://www.cnblogs.com/alex3714/articles/5740985.html ------Python是一个优雅的大姐姐 学习方式 ...

  10. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...