首页 vga全驱动

vga全驱动

举报
开通vip

vga全驱动 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 1 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 2 前言:前言:前言:前言: 最近手上多了黑金社区的 FPGA 开发板,在热身热身的过程中,笔者遇见了 VGA 驱动 的实验。老实说,笔者在网络上搜了一大把的资料,但是每一样资料笔者都不满意。呜 呜呜 ~ 算了!自己硬着头皮去尝试吧。笔者当...

vga全驱动
Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 1 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 2 前言:前言:前言:前言: 最近手上多了黑金社区的 FPGA 开发板,在热身热身的过程中,笔者遇见了 VGA 驱动 的实验。老实说,笔者在网络上搜了一大把的资料,但是每一样资料笔者都不满意。呜 呜呜 ~ 算了!自己硬着头皮去尝试吧。笔者当然是用“低级建模”的思路,去完成建 模。唔!自己也想不到,过程太顺利了。 在第一个试验中,是笔者最头疼了。因为当时笔者对“VGA 时序”的概念一塌糊涂, 一个简单的 sync_module.v 笔者不知道尝试了多少次。嗯 ~ 可怜的开发板 ,可怜的液 晶,一直被笔者折腾。 明白了第一个实验以后,第二个实验也很轻松。但是在第三个实验的时候,笔者瓶颈了 一段花四溅。对于很多朋友来说“图像显示”是一个大难 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ,笔者思考了很长时间。笔 者不停的在问自己“图像显示是否可以和点阵有关联?”。不知道是侥幸还是冥冥之中, 过往的许多关于 LED 点阵的实验,使笔者在脑海灵光一闪:“啊!我明白了”。 就这样第三个实验也安全过关。至于第四个笔记,是有关“颜色显示”的难题。呵呵, 这个也难不了笔者,笔者翻了翻以往相关的笔记。笔者在此对比了传统的“颜色编码” 和自己所熟悉的“图层概念”,那一方更容易实现“颜色显示”,然而笔者确定使用后者。 哈哈!实验结果也是令笔者很满意。就这样,第四个实验也轻松过关了。 最后一个实验是有关“动画”和“帧”的实验,最后的实验也是难度最高的。对于 VGA 驱动的“帧”来说,笔者还是第一次接触,呜呜 ~估计网上也没有什么好使的资料吧? 嗯!还是去睡觉吧!一觉过后问题果然被漂亮的解决了 ...... 后期的几天,笔者也就是编辑笔记了,使用的时间大约是 20小时吧。╮(╯▽╰)╭~ 哎! 全部实验(包括笔记)笔者使用了一个星期左右的时间去完成。在途中笔者还去了 2次 海边 1次公园寻找灵感。完成后的感觉真的是太棒了,这下可以去睡几天了。 在这里我很感谢黑金社区对笔者的资源支持。黑金开发板真的是一个好东西,有一股想 继续努力的冲动,建议大家可以去买一个玩玩吧,你不会后悔的,顶多 3个月不吃宵夜 而已。实际上,这一本笔记是从“Verilog HDL 那些事儿”第 3-3 章载录的。因为有关 VGA 的资料实在是太少了,所以笔者就将它独立出来了。 这里附上黑金社区的网址吧,喜欢的朋友自己去看看吧: http://www.heijin.org akuei2 24-08-2010 上 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 3 实验九:实验九:实验九:实验九:VGAVGAVGAVGA驱动驱动驱动驱动 实验九之一:驱动概念实验九之一:驱动概念实验九之一:驱动概念实验九之一:驱动概念 VGA 驱动实验作为 FPGA 的入门实验,多少也有些挑战。VGA是什么?估计有接触过 电脑的朋友多少也是知道。粗略认识 VGA 可分为,VGA 硬件接口,和 VGA 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 。VGA 硬件接口没有什么好学的,VGA 时序才是正点。 VGA 协议,主要有 5 个输入信号,亦是 HSYNC Signal, VSYNC Signal, RGB Signal。说 简单一点,HSYNC Signal 是“列同步信号”, VSYNC Signal 是“行同步信号”,RGB Signal 是“红色-绿色-蓝色 颜色信号”。 VGA 的扫描是固定的。一帧的屏幕是由“m 行扫描”和“n列填充”组成。假设以 800 x 600 x 60Hz 为例的显示 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 ( 800 宽 x 600 高 x 60Hz ), 那么宏观上它有 600 行 和 800列为一行。 扫描的次序如下: 扫描第 0行 - 在第 0行,列填充 0~799。 扫描第 1行 - 在第 1行,列填充 0 ~ 799。 扫描第 2行 - 在第 2行,列填充 0 ~ 799。 扫描第 m 行 - 在第 m 行,列填充 0 ~ 799。 扫描第 598行 - 在第 598行,列填充 0 ~ 799 直到描第 599行- 在第 599行,列填充 0 ~ 799 宏观上,一帧屏幕的显示是由 600行从上至下扫描,800列从左至右填充(这也是为什 么每当电脑几乎要当机的时候,视屏显示从上之下的延迟扫描)然而微观上,一行的行 扫描是由超过 800个列填充完成,一帧图像超过 600行扫描。实际上是 VGA 的时序在 作怪。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 4 上图是有关 HSYNC 和 VSYCNC 的时序图,以 800 x 600 x 60Hz 为例,信息如下: 800 x 600 x 60Hz a段 b段 c段 d段 e段-总共 n个列像素 HSYNC Signal 列像素 128 88 800 40 1056 800 x 600 x 60Hz o段 p段 q段 r段 s段-总共 n个行像素 VSYNC Signal 行像素 4 23 600 1 628 HSYNC Signal 是用来控制“列填充”, 而一个 HSYNC Signal 可以分为 4个段,也就 是 a (同步段) , b(后廊段),c(激活段),d(前廊段)。HSYNC Signal 的 a 是拉低 的 128 个列像素 ,b是拉高的 88 个列像素,至于 c 是拉高的 800 个列像素,而最后 的 d 是拉高的 40 个列像素。 一列总共有 1056 个列像素。 VSYNC Signal 是用来控制“行扫描”。而一个 VSYNC Signal 同样可以分为 4 个段, 也是 o (同步段) , p(后廊段),q(激活段),r(前廊段)。VSYNC Signal 的 o 是拉 低的 4 个行像素 ,p 是拉高的 23 个行像素,至于 q 是拉高的 600 个行像素,而最后 的 r 是拉高的 1 个行像素。 一行总共有 628 个行像素。 “一个行像素”是以“列像素为单位”来定义(以 800 x 600 x 60Hz 为例)如下所示 : 1个行像素 = 1056个列像素。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 5 而“一个列像素”是以“时间位单位”来定义(以 800 x 600 x 60Hz 为例),如下所示: 1个列像素 = 25 ns。 1个行像素 = 1056个列像素 = 1056 x 25ns = 2.64us。 (以 800 x 600 x 60Hz 为例)上述内容读者可以发现一个事实,要完成一行的扫描,需 要 1056 个列像素,也就是说需要 1056 x 25ns 的时间。如果要完成所有行的扫描的话, 需要 628 x 1056 x 25ns 的时间。很遗憾的是,不是所有时间都用来显示图片,有一部分 的时间是用来同步操作。 在上图表示了,HSYNC Signal 只有在的 C 段 (红色部分)和 VSYNC Signal 的 q 段 (黄色部分)的激活段,数据的输入才有效。换句话说,显示图片是发生在交叉(橘色 部分)的“有效区域”下。 交叉部分的表达式可以如此描述: 列像素 > 216 && 列像素 < 1017 && 行像素 > 27 && 行像素 < 627。 接下来我们以简单的实验来说明 VGA 时序的 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 6 vga_module.v 是组合模块,而且它包含了 pll_module.v , sync_module.v 和 vga_control_module.v 。我们先说说 pll_module.v 的目的: 如果是要驱动 VGA 为 800 x 600 x 60Hz 的显示标准,我们知道这个显示标准需要的 “最小单位”也就是“列像素”所占用的时间周期--25ns。换句话说,至少需要 40MHz 的时钟频率,而黑金搭载的时钟为 20Mhz,所以需要用到 pll_module.v 对黑金的源时 钟进行翻两倍。 20Mhz = 50ns 40Mhz = 25ns (pll 是 FPGA的重要硬件资源,pll 主要的功能是对源时钟编程,翻频,分频等 ) 而 sync_module.v 是对 HSYNC Signal 和 VSYNC Signal 控制的“功能模块”。他扮演 了“VGA 驱动的核心”的角色。除此之外,sync_module.v 还输出当前的 x地址 (Column_Addr_Sig),y地址 ( Row_Addr_Sig ) 和有效区域信号(Ready_Sig)。 vga_control_module.v 是“图像控制的核心”控制模块,有关 Red, Green, Blue 信号的 控制,x地址和 y地址的控制,图像显示控制,帧控制,完全都是在这个模块中完成操 作。 说简单点,sync_module.v 的工作是“显示标准控制”,然而 vga_control_module.v 的工 作是 “图像显示控制”。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 7 实验九之一源码:实验九之一源码:实验九之一源码:实验九之一源码: sync_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 8 由于时钟频率已经由 pll_module.v 进行翻倍,由本来的 20Mhz 变成 40Mhz ,所以时 钟周期完全符合 800 x 600 x 60Hz 的显示标准。也就是说,时间周期达到一个列像素的 时间,亦即 25ns。 第 18行定义的 Count_H 是对“列像素”计数的寄存器。第 20~26行表示了“列像素” 每 25ns 就会累计,直到 Count_H 达到 1056值。 第 30行定义了 Count_V,它是针对“行像素”计数的寄存器。而第 32~38行描述了, “1个行像素等于 1056个列像素(以 800 x 600 x 60Hz 为例)” 因为每 1056个列像 素,Count_V就会递增(第 37行),而第 35行表示了 Count_V的最大数,亦即 628。 在 42~51行,表示了“有效区域”,也就是说数据输入有效的条件。isReady 寄存器(42 行)定义了“有效区域”的标志。 第 55行表示了 VSYNC Signal 的 o 段。VSYNC Signal 在 o 段是保持低电平,当 o 段 之后就会拉高输出,而且 o段保持低电平的时间是 4个行像素。在 56行是针对,HSYNC Signal 的 a 段。我们知道开始的 128 个列像素都是拉低 HSYNC Signal,当 128个列 像素之后就拉高 HSYNC Signal。第 57行是“有效区域”的输出信号。 我们都知道屏幕是以“像素”计算。为了要很好的控制图片显示在屏幕的位置, sync_module.v 有义务输出当前的 x 地址(Column_Addr_Sig)和当前的 y 地址 (Row_Addr_Sig)。x地址的计数是发生在 128个 Count_H之后(62行),然而 y地址 计数是 27 个 Count_V之后(63行)开始计数。 Count_H的 128 = HSYNC Signal 的 a段 + b段。 Count_V的 27 = VSYNC Signal 的 o 段 + p段。 isReady 有效区域是 = HSYNC Signal 的 C 段 * VSYNC Signal 的 q段。 Column_Addr_Sig = HSYNC Signal 的 b 段之后 800 个列像素。 Row_Addr_Sig = VSYNC Signal 的 p 段之后的 600 个行像素。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 9 vga_control_module.v 这个 vga_control_module.v 比较简单,在第 18行定义了一个名为 isRectangle 的标志寄 存器。在第 23行,表示了在 x地址之后,和在 y 地址 100以内就设置 isRectangle 寄存 器为逻辑 1。第 31~33行,所有颜色信号被赋予同样的表达式,这表示了在 800 x 100 的 区域内显示白色的矩形。Ready_Sig 有时候可以作为保险。 vga_control_module.v 作为“图像显示控制”,在这个实验之中它显示了 高 100 x 宽 800 的矩形。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 10 vga_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 11 实验九之一说明:实验九之一说明:实验九之一说明:实验九之一说明: 这个实验主要是驱动 800 x 600 x 60Hz 显示标准,同时也描述了 sync_module.v 在 vga_module.v 组合模块中扮演的角色。 sync_module.v 直接对 HSYNC Signal 和 VSYNC Signal 控制。同时间, sync_module.v 也把当前的 x 地址和 y 地址告诉 vga_control_module.v 好让这个模块作出相关的显示控制。 除了 800 x 600 x 60Hz 的显示标准以外,还有其他的显示标准可以参考。 (常用时钟 Mhz 的时间周期,亦即是 1 个列像素的时间)从上图我们可以得知 800 x 600 x 60Hz 显示标准的使用时钟是 40Mhz 。这也是实验九之一将 20Mhz 时钟翻倍至 40Mhz 的原因,因为 800 x 600 x 60Hz 显示标准的 1个列像素需要 25ns。 完成的扩展图: 实验九之一结论:实验九之一结论:实验九之一结论:实验九之一结论: 实验九之一实现了简单的 VGA 驱动,同时实验也告诉我们配置 sync_module.v 等于是 配置 VGA 的显示标准。 但是这个实验有一个严冲的弱点,因为关于源时钟 20Mhz 翻 倍后是 40Mhz , 悄悄好达到 1个列像素的时间单位 25ns。 如果翻倍的时间不是 40Mhz 而是其他的什么,那么要如何是好!? Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 12 实验九之二:向下兼容概念实验九之二:向下兼容概念实验九之二:向下兼容概念实验九之二:向下兼容概念 假设现在我们向源时钟 20Mhz 翻倍到 100Mhz,然而 640 x 480 x 60Hz 的显示标准需 要的时钟频率是 25.175Mhz 也就是说 1个列像素需要的时间是 39.7 ns。那么 100Mhz 如何向下兼容 640 x 480 x 60Hz 的显示标准。 (聪明的朋友已经估计到解决的方法了吧 (∩_∩)!?) vga_module.v 组合模块同样是没有任何改变。有改变的只是 pll_module.v 将源时钟 20Mhz翻倍至 100Mhz ,和 sync_module.v 显示要求改变致 640 x 480 x 60Hz。 其实向下兼容的概念,也就是模仿“显示标准的主要时钟频率”。换一句说,如果 640 x 480 x 60Hz 的主要时钟频率是 25.175Mhz 的话,亦即 1个列像素是 39.7ns,那么可以 用更高的源时钟是求得 39.7ns 的定时。说得简单一点就是配置一个定时器。 假设源时钟是 100Mhz,定时器的计数 x 是 : x = 39.7 ns / ( 1 / 100Mhz ) = 3.97 = 4 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 13 实验九之二源码:实验九之二源码:实验九之二源码:实验九之二源码: sync_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 14 第 18行定义了 40ns 的常量。而第 22~30行是用于 40ns 的定时。那样一来,我们不用 同样的时钟频率也能向下驱动不同的显示标准(在 41行的定时作用)。 除此之外,修改的地方还不少, 主要是关于: 最大个列像素(第 39行),最大个行像素(第 51行),一个行像素所占有的 n个列像素 (53行),有效区域条件(第 63~64行),HSYNC Signal 的 a 段拉低时间(71行),VSYNC Signal 的 o 段拉低时间(72行),还有 x地址和 y地址的输出(第 78~79行)。 vga_control_module.v vga_control_module.v 和实验九之一基本一样,没有任何改变,这里就不显示了。 vga_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 15 vga_module.v 组合模块也就是修改了 CLK_100Mhz 的命名而已( 第 18,23,34,47 行)。其余的和实验九之一一样。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 16 实验九之二说明:实验九之二说明:实验九之二说明:实验九之二说明: 不是所有更高时钟的频率就能向下兼容,如实验九之二一样,100Mhz 的频率,为了兼 容 25.175Mhz 至少需要超过 2被时间的区别。如果时钟频率是 30Mhz,或者 40Mhz 估 计向下兼容的效果不怎么好 。 完成后扩展图: 实验九之二结论:实验九之二结论:实验九之二结论:实验九之二结论: 无论是是实验九之一或者实验九之二,主要是强调了 1个列像素在驱动 VGA 时所扮演 的角色。因为 1个列像素是最小的单位。只要掌握了 1个列像素,1个行像素,有效区 域,x 地址和 y地址,HSYNC Signal 和 VSYNC Signal 时序等等概念以后,VGA 的时 自然而然会明白。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 17 实验九之三:点阵概念实验九之三:点阵概念实验九之三:点阵概念实验九之三:点阵概念 点阵这东西,一直以来都是我的大爱呀,我所有 6成的实验都是与点阵有关。我相信有 学过 LED 点阵的同学应该对点阵有所概念。点阵嘛~就是在 m x n 的面积中,实现 亮(逻辑 1)和 灭(逻辑 0)效果来产生一副图像。典型的实例如:交通灯的小红人。 但是在 VGA 上实现点阵效果需要下一点功夫。因为 VGA 时序的关系,点阵都是 1 列 的显示。不同于 LED 点阵,用户可以自定义点阵的位长度,扫描方式。 开始实验之前,我们再来复习一下 VGA 扫描的次序(以 800 x 600 x 60Hz 为例): 一行的扫描是由 1056个列像素填充,换句话说就是 1个行像素等于 1056个列像素。然 而图片显示的“有效区域”是在 HSYNC Signal 的 c 段和 VSYNC SIgnal 的 q段的交 叉部分。 在点阵方面,RGB 信号全为逻辑 1代表“亮”,相反的 RGB信号全为逻辑 0代表“灭”。 上面是一张 64 x 64 像素的比卡丘(我最喜欢了)。点阵编码的方式是“逐行式”+“高 位在前”。“逐行式”也就是逐行扫描的意思。“高位在前”的表示如下: 假设有一行拥有 16个列像素,那么编码会是如此:0xf738。 至于为什么要采用“高位在前”的编码方式?原因在于“符合人类思维”和“容易理解”。 要显示一副 64 x 64 像素点阵的比卡丘图像,所占用的空间是 64 Bit(宽)* 64Bit(高) * 1Bit(颜色)亦即 4096 Bit 空间容量。所以呀,要存放这一副图像, 64 bit x 64 words 的 rom 就行了。 因为这样的配置也使得 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 简单化,毕竟 1 words 就代表一行,1 Bit 就代表一列。假设我要读取第 32 行的第 6 列的值。我只要向 rom 发送 32 的地址,然 后取出 rom 的值的第六位即可。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 18 下面是 64 x 64 比卡丘图像的点阵信息 行 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 64位点阵信息 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000180000000000 0000380000000000 00003C0000000000 00007C0000000000 0000FC0000070000 0000FE00003F0000 0000E60001FF0000 0001860007FF0000 0001C6000C3E0000 000101F8701C0000 00018FFFE0380000 0001840780300000 0001600000607800 0001000000C0C800 0003000001C0CF00 0003003803010780 000F004C160300C0 000D807C1C0300E0 000F007C0C060060 001720380C060060 001A6001060600C0 00180003820C0180 001CFFC7C30C0300 001C7707C1B80E00 行 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64位点阵信息 001C3F07C1181800 00BC1E01F1B01800 00EC0003B1D83000 018200071BCC3C00 0181000219C61600 00C1000031660E00 0060000020371C00 0028000000AC3000 003C0001E1F0E000 0006001B5BFCC000 0003001F03FCE000 0003803581FC6000 00010031807FC000 00038030E07F8000 0001000840F80000 0001C008C0F00000 0000C018C3C00000 0000C01D83000000 0000600E8C000000 000034066C000000 00001E03F0000000 0000070380000000 000001CF00000000 000000E700000000 0000006300000000 0000007E00000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 19 图上的 vga_module.v 是基于实验九之一的 vga_module.v。主要是对 vga_control_module 进行扩展的修改,支持从 rom_module.v 读取数据。除此之外 vga_control_module.v 还 控制对图片的输出。具体的操作直接看代码吧。 实验九之三代码:实验九之三代码:实验九之三代码:实验九之三代码: sync_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 20 基本上和实验九之一一模一样。显示标准是 800 x 600 x 60Hz。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 21 vga_control_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 22 在第 5行,第 14~15行,是针对 rom 进行修改,主要是加了 Rom_Data 和 Rom_Addr。 第 23~29行表示了 m 寄存器是读取 当前的 y地址(Row_Addr_Signal),亦即当前的行。 而第 33~39行的 n寄存器则是读取当前的 x地址(Column_Addr_Sig),也就是当前的列。 在 43行中,m 寄存器作为“行寻址”将值赋予 Rom_Addr。最后 45~47行,n寄存器作 为“列寻址”,对 rom 读取的值 Rom_Data,从最高位到最低位判断目前的第 m 行第 n 列是“点亮”还是“点灭”。 假设一个情况,我要显示图片第 0 行。那么图片第 0 行的值,当然是存放在 rom 的 0 地址(详细的 rom 配置和创建过程请参考实验配置笔记)。如果我要在屏幕的“第 0 y 地址”和“第 0 x 地址”显示开始显示图片的话,我们可以利用 “当前 y 地址 (Row_Addr_Sig)”和 “当前 x地址(Column_Addr_Sig)”。因为告诉了我们,当前的 显示进度。 当“当前 y地址”是 0时,直接利用“当前 y地址”对 rom 进行“行寻址”从 rom 读取 图片第 0行的信息,然后再利“当前 x地址”对读出图片的第 0行信息进行“列寻址”, 从高位到低位进行判断,在“当前显示的 x y 地址”是否是“点亮”还是点“点灭”。 如:图片第 0行的信息全部都是逻辑 0, 所以在“当前 y地址”0,和“当前 x 地址”从 0~63都是“点灭”的操作。上述的过程会一直重复直到 64行的图片信息扫描完毕。 vga_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 23 第 43~54 行主要是多了 rom 的实例化,然后在第 54~72行 vga_control_module.v 实例化 中,对 rom 扩展 Rom_Data 和 Rom_Addr 的输入输出口。 注意: 第 45 行定义了位宽为 64 位的 Rom_Data 的 wire。然而第 56 行定义了位宽为 6 的 Rom_Addr的 wire。这表示了 rom_module.v 的 1字数据是 64位宽,Rom_Addr 位宽为 6表示可以支持到 64个 words 的寻址。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 24 实验九之三说明:实验九之三说明:实验九之三说明:实验九之三说明: 实验九之三主要是对“点阵”的概念叙述一番。此外还说明了“屏幕”的 x地址和 y地 址在图片显示上的作用。 如果要将一张图片显示在屏幕上任一一个位置,需要好好利用从 sync_module.v 输出的 Column_Addr_Sig和 Row_Addr_Sig信号,因为这两个信号表示了当前显示的 x地址和 y 地址(当前显示 m 行 n 列)。如一张只有 64 x 64 像素的比卡丘图片,在实验九之三 中,将显示起始地址为(x,y)( 0,0 )。 此外实验九之三还很有效的利用 Row_Addr_Sig 对 rom_module.v 进行“行寻址”, 然 后利用 Column_Addr_Sig 对执行“列寻址”的操作。 完成后的扩展图: 实验九之三结论实验九之三结论实验九之三结论实验九之三结论:::: 实验九之三有一点使许多新手容易产生问题的,就是如何为一张图片执行“点阵编码“? 说一点题外话,在 LED点阵中,因为 LED点阵的扫描次序完全是用户自定义的,所以 “点阵”编码的方式很多样化。但是 VGA的扫描次序都是固定,故为了很好降低设计 的猥琐度,编码的方式尽量偏向“容易理解”。 如 VGA 扫描方式是逐行对列填充,也就是说列填充是从左至右。“高位在前”的“编 码方式”既然而然很符合 VGA“从左至右的列填充”的扫描次序。 还有一点问题点就是,关于“用什么方式去储存图片”?如果你的图片是 16x16 像素, 那么我很建议你在模块里定义图片每一行信息的常量。如果图片是超过这样 16 x 16 像 素,呵呵!还是建立一个 rom 来存放图片信息。不要像 C 语言那样,建立一个库文件, 然后调用。Verilog HDL语言不适合这一套。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 25 实验九之四:图层概念实验九之四:图层概念实验九之四:图层概念实验九之四:图层概念 将一张有颜色信息的图片现在屏幕上,传统通常都会用“颜色编码”的方式。假设一个 例子,如果有一个 VGA 驱动电路可以支持 8中颜色,也就是说每一列“点阵”都使用 3Bit 来代表。颜色支持如下: 颜色 Red Signal Green Signal Blue Signal 黑色 0 0 0 蓝色 0 0 1 绿色 0 1 0 浅蓝色 0 1 1 红色 1 0 0 紫色 1 0 1 黄色 1 1 0 白色 1 1 1 假设我有一行 4个列像素的信息(4个列点阵): 那么一行的长度需要 12位,编码结果是:100 101 111 000。对于“颜色编码”的方式, 对于硬件来说,无论是储存编码信息,还是处理编码信息,实在是有点过分。所以不怎 么推荐。 在这里我们还用另一种方式可以显示颜色图片,就是“图层概念”。 举一个例子,假设我要显示 64 x 64 只带有颜色的比卡丘(爱!爱!): 3色层集合 红色层 绿色层 蓝色层 基本上我会将该图片分为“基本 3色的图层”,亦即“红色层”,“绿色层”和“蓝色层”。 颜色的支持如下: 颜色 Red Signal Green Signal Blue Signal 红色 1 0 0 黄色 1 1 0 黑色 1 1 1 白色 0 0 0 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 26 又假设我有一行 4个列像素的信息(4个列点阵): 颜色层 第四位 第三位 第二位 第一位 红色层 1 1 0 1 绿色层 0 1 0 1 蓝色层 0 0 0 1 看简单点,红色的输出,只要红色层即可。黄色的输出需要红色层和绿色层相叠加。白 色也等于没有颜色,这时候不需要任何层的叠加。则黑色需要 3个层叠加才能显示。 红色层:4'b1101 绿色层:4'b0101 蓝色层:4'b0001 在“显示控制”的时候,只要将相同的行,相同的列,不同的层信 息发送到相关的输出信号。如:红色层 = Red Signal, 绿色层 = Green Signal, 蓝色层 = Blue Signal. 实验九之四就是要建立如上图的组合模块。从实验九之三的基础上,添加了 3 个 rom_module 亦即 red_rom_module.v,green_rom_module.v 和 blue_rom_module.v。每 一个 rom_module.v 如命名般分别储存“红色层”,“绿色层”,和“蓝色层”的点阵信息。 最后会经过 vga_control_module.v 巧妙的“叠加”操作,就会显示一张带有颜色的图片。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 27 实验九之四源码:实验九之四源码:实验九之四源码:实验九之四源码: sync_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 28 大致上和实验九之三一样。 vga_control_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 29 在第 5行定义了 Red_Rom_Data, Green_Rom_Data, Blue_Rom_Data。这些分别是 3个不 rom 的输入口,均为 64位宽(第 14~16 行)。第 26~46行,基本上是读取当前的 m 行 (y地址-Row_Addr_Sig)和当前的 n列(x地址-Column_Addr_Sig)。 在 47行定义了 Rom_Addr 输出值完全是基于 m(当前的 y地址,当前显示的行)。 然而有一点不一样的就是发生在第 50~53行,各个 RGB Signal 都有各自的输出值。如: Red_Sig 它的输出完全是根据 Red_Rom_Data 的值,其余的也是类似。至于 n(当前的 x地址,当前显示的列),是用于“列寻址”,然后判断该点阵是“点亮”还是“点灭”。 vga_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 30 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 31 实验九之四的 vga_module.v 比较不同。在 43~76 行中实例了 3 个 rom_module.v 分别 是 red_rom_module.v(47~52 行),green_rom_module.v(58~63行),blue_rom_module.v (69~74 行)。然而各个 rom_module.v 都有自己的输出连线 Rom_Data(45行,56行, 67 行),这些连线的终点是 vga_control_module.v(87~89 行)。vga_control_module.v 输 出的 Rom_Addr(90行),3个 rom_module.v同时公有的(72行,61行,50行)。 实验九之四说明:实验九之四说明:实验九之四说明:实验九之四说明: 实验九之四主要是基于“图层概念”去实现颜色图像的显示。在试验中,创建了 3个 64 x 64 的 rom 模块,每一个 rom 模块分别针对每一个层去储存信息。所谓的“叠加操作” 也不过是微秒的对 Red_Sig , Green_Sig, Blue_Sig 信号发送本身“同颜色的层”而已。 所以 vga_control_module.v 设计基本上是不难。 说白了 vga_control_module.v 和在实验九之三的操作一样,同样是处理点阵信息,不过 不同的是,不是处理 1副图片的点阵信息,而是 3副图片的点阵信息。 完成后的扩展图: 实验九之四结论:实验九之四结论:实验九之四结论:实验九之四结论: 关于“图层”的概念,在现实中如同不同颜色的半透明纸,叠加起来后呈现效果。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 32 实验九之五:帧的概念实验九之五:帧的概念实验九之五:帧的概念实验九之五:帧的概念 关联到“帧”,大家都会想起什么?没错就是动画。但是笔者在认识众多的 VGA实验当 中,大家只是单纯的注重 VGA驱动的方法,而忽略了帧。“帧”对于 VGA 来说是一个 重要的参数之一。屏幕显示“逼不逼真?”,“有没有拖尾现象?”,这些都关系到“帧”。 在一般的 VGA 显示标准中 如:800 x 600 x 60Hz (一帧等于一副图像)。 最后一字的“60Hz”,表示该显示标准,在 1秒内可以显示 60帧图像。 在这里我们先玩一些计算游戏: 以 800 x 600 x 60Hz 为例。我们知道 1 个行像素等于 1056 个列像素,而一个列像素需 要 25ns。换一句话说,一“帧”的图像 需要 628 * 1056 * 25ns 的时间。那么一秒内到 底能显示多少“帧”图片? 1帧图像所需要的时间 = 628 * 1056 * 25ns = 0.0165792s 1秒内可以显示 n帧图片 = 1 / 0.0165792 = 60.3 = 60 再尝试!以 640 x 480 x 75Hz 为例。1个列像素需要 31.74ns。 1帧图像所需要的时间 = 500 * 840 * ( 1 / 31.5Mhz ) = 0.0133333333333333 1秒内可以显示 n帧图片 = 1 / 0.0133333333333333 = 75 再再尝试!以 800 x 600 x 75Hz 为例。1个列像素需要 20.2ns。 1帧图像所需要的时间 = 625 * 1056 * ( 1 / 49.5Mhz ) = 0.0133333333333333 1秒内可以显示 n帧图片 = 1 / 0.0133333333333333 = 75 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 33 我们计算帧不是要研究什么“xx标准有多少 xx帧”,我们的目的主要是实现“一副图像 可以逗留帧数”,然而实现“动画效果”。 有一点请注意,这里所说的“动画”,不是读者在电视机上看的动画,那些动画有业界 的标准(好像是 1秒 24帧图像)。我们说谈的是“动画效果”,因为“帧”可以影响“动 画效果”的“切换速度”。 实验九之五要显示的“动画”很简单,就是总所皆知的交通灯“小绿人”。(偷偷告诉你 噢,小绿人实验在我学习单片机期间,研究过很长一段时间)。完整的“小绿人”太多 幅图像了(18副),这里我摘掉只剩前六副图像而已。 1 2 3 4 5 6 每一副小绿人的图像都是 16 x 16 x 1Bit,点阵信息如下: 行 第一副 第二幅 第三幅 第四幅 第五副 第六幅 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 1800 3C00 1800 0C00 0F00 0E80 1E40 2340 0300 0280 0440 0820 3010 0010 0000 0000 1800 3C00 1800 0C00 0F80 0EC0 1E60 3340 0300 0280 0460 0C20 3410 3830 0000 0000 1800 3C00 1800 0C00 0F80 0E40 1E20 0300 0300 0280 0460 0410 0410 3820 0000 0000 1800 3C00 1800 0C00 0F80 0C40 0E20 1320 0300 0280 04E0 0420 02C0 0E00 0000 0000 1800 3C00 1800 0C00 0F00 0D80 0EC0 17C0 0300 0280 04F0 0470 0670 0E10 0600 0000 1800 3C00 1800 0C00 0E00 0D00 0E80 0680 0300 0700 0900 08C0 0C20 0420 0C00 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 34 以上的点阵编码方式都是“高位在前”+“逐行扫描”,基本上和实验九之三一样。 现在的问题是:“如何将这些点阵信息安排储存入 rom?” 很简单,我们只要建立 16 bit x 96 words 的 rom 就可以了。当然这样举动是有原因的。 小绿人的一副图片是 16 x 16 的大小,一行有 16个列像素,而且有 16行。也就是说, 如果建立 16Bits 的位宽,一副图片需要 16 words ,而且这里有 6 副图片, 6 x 16 = 96 需 要 96 words。 每一副图像相差有 16个 words,而这个“相差数目”我们称为“帧偏移量”。所以呀, 每当想更换一副图像,都需要加上“帧偏移量”。 实验九之五的组合模块如上。在“同步模块”sync_module.v中多了一个输出“Frame_Sig” 信号,该信号主要是,每完成一帧图像的显示,就产生一个时间的高脉冲来通知 vga_control_module.v。然而,vga_control_module.v 会依 Frame_Sig 产生的高脉冲来计 数“帧”。 注意: 要知道“一帧图像是否已经显示完?”,在 sync_module.v之中就要好好的利用“行像 素”计数器 Count_V。以 800 x 600 x 60hz 为例,当行计数器 Count_V 计数到 628 的时候,亦即一帧图像已经显示完毕。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 35 实验九之五源码:实验九之五源码:实验九之五源码:实验九之五源码: sync_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 36 第 4~13 行定义了 Frame_Sig ,然而 Frame_Sig 会产生高脉冲当 1 帧图片显示结束(59 行)。我们知道一个事实,以 800 x 600 x 60Hz,当行像素计数器 Count_V 计数到 628, 的时候表示,最后一行已经扫描完毕。 vga_control_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 37 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 38 第 4~11行定义了 Frame_Sig 的入口。此外,为了能更好的显示“动画效果”,图像显, y地址从 0(29行),x地址从 2(第 39 行)开始。在 46行,定义了 FRAME的常量。 然而在 50~58 行,是 FRAME 的计数器。每当 Frame_Sig 接收到一个高脉冲(57行), 该计数器就递增,直到达到与常量 FRAME 相同的值(55行)就会赋值为 0。 第 60~104 行是“切换图像”的操作,每当一副图像显示 10 帧(根据 FRAME 常量), 就会跟换换下一副图像。而更换图像的操作就是为 rAddr 添加“帧偏移量”16。为了提 升“执行效率”和“解读性”,人为的添加“图像”的起始地址。 根据 green_rom_module.v 的配置,我们知道: 第一幅图像的起始地址是 00,而行寻址是 00~15。 第二幅图像的起始地址是 16,而行寻址是 16~31。 第三幅图像的起始地址是 32,而行寻址是 32~47。 第四幅图像的起始地址是 48,而行寻址是 48~63。 第五幅图像的起始地址是 64,而行寻址是 64~79。 第六幅图像的起始地址是 80,而行寻址是 80~95。 在第 106行,Rom_Addr 输出的值是 当前“第 n图像起始地址”+“m 行寻址”。 假设一个情况:在模块开始运作的时候,Addr 的值是 0也就是说第一幅图片被显示。 第一幅图片会以点阵的方式显示。当第一章图片重复显示 10 次的时候(10 帧),Addr 的值会赋予 16,也就是第二副图像被显示,而且同样以点阵的方式显示。直到显示 10 帧以后,下一张图像会被选中。 以上的顺序步骤会一直执行,直到显示完第 6副图像,然后 Addr 会再一次赋予 0值。 也就是说,“动画”会从新开始显示,“动画”会重复到永远 ... Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 39 vga_module.v Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 40 最后的源码就是 vga_module.v 这个组合模块。其实也没有什么特别的。 实验九之五说明:实验九之五说明:实验九之五说明:实验九之五说明: 实验九之五描述了“帧”对“动画效果”的影响。如果以 800 x 600 x 60Hz为例 , 我们 可以知道一帧图像所需要的时间是 0.0167s ,在试验中一副图像重复了 60次,也就是 说一副图像逗留的时间是 1s 左右。结果有 6副图像,“动画”时间需要 6s。 完成后扩展图: 实验九之五结论:实验九之五结论:实验九之五结论:实验九之五结论: 基本上笔者也不知道要说什么了,当你掌握 5个实验的概念后,已经证明读者都明白笔 者在写什么。 Verilog HDL 建模技巧 - 低级建模之 VGA 全驱动 http://blog.ednchina.com/akuei2 41 实验九说明:实验九说明:实验九说明:实验九说明: 有 VGA 硬件接口的屏幕,看简单点即使一副大点阵屏幕,但是这个点阵屏幕可以支持 多彩。但是为了很好与 VGA沟通,我们必须了解“时序”的接口。当中 HSYNC Signal 等于 行控制信号,VSYNC Signal 等于 列控制信号。然
本文档为【vga全驱动】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_864350
暂无简介~
格式:pdf
大小:2MB
软件:PDF阅读器
页数:42
分类:互联网
上传时间:2012-04-30
浏览量:36