基于Xilinx artix 7的FPGA高级应用(一):VGA图像显示(实战篇)

本项目采用的FPGA芯片是Xilinx 公司 的 artix7 xc7a35t ,开发软件是Vivado 2018.3

FPGA高级应用(一) VGA图像显示

VGA图像显示的程序有着C语言设计中“单输出/入,多入口”的特点,话不多说,我们先来看module的输入输出变量

在这里插入图片描述
可以看到,除了三基色和扫描信号外,我们还引入了时钟、复位以及一个按键备用。

在原理篇中,我们讲到了根据扫描频率的不同,VGA是有固定标准的,如下图:

在这里插入图片描述
由于板载的时钟频率是50Mhz,所以我们选择比较相近的65.0Mhz时钟,1024*768@60的标准,可以看到,此时行时序周期和列时序周期就已经确定了,所以我们用parameter来确定:

在这里插入图片描述
设置好了周期之后,我们注意到,这个标准对应的时钟是65.0Mhz,我们的板载时钟是50Mhz,这个时候需要进行倍频,比较方便的方式是使用vivado自带的IP核:
在这里插入图片描述
最开始我们说过,这个程序有***“单输出/入,多入口”***的特点,也就是数据要遵从以下递交方式:

在这里插入图片描述
因此我们不能直接用输入输出量来进行扫描、调色等操作,所以我们要设置一系列中间量,也就是“待递交”区的变量以及真正用于调色、遍历的,图中黑色输入线代表的变量:

在这里插入图片描述
查表,知实际的行、列像素分别有1344和806个,所以行像素变量需要一个11位的寄存器,列像素变量需要一个10位寄存器。我们最终要实现的是不同颜色的整个屏幕、渐变色屏幕还有黑白方格和彩色条纹。这里就设置好储存它们颜色的寄存器变量。又因为是多功能的,我们还得设置VGA模式变量。然后我们设置扫描信号。
注意到这里我们采用按键来切换模式,因此有一个key_counter变量,我们先看看如何使用按键切换模式:

在这里插入图片描述
VGA模式寄存器有四位,这个rstn是时钟IP核中的复位功能,一旦复位我们首先就让VGA变为默认0000模式并且将按键变量key_counter清零,***此处采用的是非阻塞方式,一定要注意!***当按键被按下且时间少于1ms的时候,key_counter这个计数器一直随着时钟计数,直到计数1ms时VGA模式寄存器获得加一,模式切换完成,松开按钮计数器自动清零,准备在按钮再次被按下时切换到再下一个模式。

说完了按键切换功能,我们来关心最重要的扫描信号的实现了。首先看一看如何遍历屏幕上的每一个像素点:

在这里插入图片描述
在这里插入图片描述
水平和垂直扫描计数如出一辙,也就是复位时将计数器置1,然后开始计数,直到该行/列最大值时自动清零,唯一需要注意的就是列扫描计数开始下一列计数的条件是该行的计数已经达到最大值。

这是遍历计数,有了计数,我们就可以将扫描信号给出:

在这里插入图片描述
在这里插入图片描述
当行/列开始的同步信号来临时,我们将扫描信号置0,同步脉冲结束后我们将扫描信号置1

之后就是每个模式对应的配色了:
在这里插入图片描述
上面是彩条显示,不难读懂。比较困难的是接下来的黑白方格:

在这里插入图片描述
这段简短的代码直接画出了方格图。实际上我们可以这样理解:**x_cnt首先是一个11位的变量,我们划定x_cnt[4]=1b’1实际上是划定了x方向上一些离散的线段:判断条件是该变量的第五位是否是二进制的1,那么在x方向上每隔一段距离会有满足这个条件的一系列变量,其长度就是2的四次方16个像素(该变量是第五位)。**在y方向也是同样的道理,然后我们再用黑白将其填充完毕。

图像模式的代码完毕之后,我们就进入模式选择的部分,这里用一个if-case语句来完成:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

紧接着我们将定义的扫描信号交给真正的module的输入输出

在这里插入图片描述
到这里代码就已经完成了,给大家看一下彩色条纹的实现:

在这里插入图片描述
通过这个代码的整体,我们看出了他**“单输入/出,多入口”**的原则,比如扫描信号,没有直接将module的输出口赋值,而是建立一个中间量,再把多路输入赋值给中间量,最后递交给输出口,这样写出的代码无论是执行效率还是可读性都非常高,是一种很好的习惯。

本期就到这里了,如果有小伙伴想要完整代码的,可以qq联系我:459007310.
谢谢观看!

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值