最近想做关于图像处理方面的东西。所以就首先想到用 Nexys™3 Spartan-6 FPGA Board 实验板做一个VGA显示的例子。
首先应当先了解vga显示的时序问题,只有清楚了解vga显示图像的规则,才能用FPGA显示图像。这个博客上讲的比较清楚,在此不做过多介绍,只是接下来想用System Generator练练手实现它罢了。做这个小例子其实也是参考了小豪同学的verilog代码,在此感谢!
前调函数如上图所示,用来配置vga显示图像的格式,方便模块变量的初始化。
上图就是产生vga信号: HSYNC Signal, VSYNC Signal, RGB Signa的框图,通过WaveScope观察波形无误后,就可以生产正确的hdl代码了。关键操作就是不断根据时序要求进行分频计数而已。
Rst_P是系统复位信号,是要对整个系统中有锁存功能的模块就行复位的输入信号(一般带有 Z-1的延迟模块,ram和rom模块都具有锁存功能)。双击Counter_H打开就可以看到内部设置,勾选synchronous(同步复位)后,就会有rst这个输入信号了。引用某本书的话来讲:毛刺是数字电路的天敌,只要用逻辑电路,就会有毛刺发生,采用同步电路,可以有效避免毛刺的影响。
根据行扫描地址和列扫描地位,配置输出vga信号R3_G3_B2。MCode如下:
Red信号3位,Green信号3位,Blue信号2位的格式,这是根据开发板vga硬件接口rgb数据格式定义的
板子最高电压3.3V。以RED信号为例,U7,V7,N7全部输出1的时候,用万用表量是3.3V,而普通显示器R的最大电压感觉应该是5V以上(具体多少不知道,只是量到4.89V),这么说用Nexys™3 Spartan-6 FPGA Board的VGA输出的图像,注定颜色共256种(2的八次方),颜色也稍显暗淡。高三位[7:5]红色,中间三位[4:2]绿色,低两位[1:0]蓝色。
当仿真观察波形无误后,就可以用System Generator生产HDL代码了,具体操作如流水灯实例操作一样,在此不再讲了。
代码生成后,就可以关掉matlab,打开ise建立工程,加上一个49M输出的时钟配给生成模块的clk信号,分配下响应的引脚,整个工程就可以了。
UCF文件如上。
最终显示在电脑屏幕上的效果如上图所示。(照相机闪光忘记关掉了,中间有个光圈。)
其实最终想显示一张800*600的图像,但是片内的BlcokRam实在放不下那么多数据,换成Virtex5的板子也不够用,坑爹啊。只好以后考虑片外存储器存储图像了。片外存储器我不会操作啊,求高手指导啊。
方便大家下载,已把这个工程所有文件上传至PUDN。