一、代码架构
使用VGA移动方块的代码由三部分构成,分别为时钟模块、VGA驱动模块、显示数据源模块。
(1)通过功能实现过程,对代码架构的划分有了一个明确的思路。即,任何外部器件的构成均可由时钟模块,驱动模块,数据源模块构成。如下图。
(2)通过本模块体会参数化编程,当模块参数较多时使用parameter进行参数化编程。
二、时钟模块
由于本功能是在pc显示器上实现1024768@60Hz的图像显示,所以时钟频率为1344806*60=65MHz。故外部时钟经过pll后生成65MHz的时钟。
三、VGA驱动模块
重点要搞清楚VGA的驱动时序。如下图。
VGA时序分为信号一共有3大类,分别为数据信号R G B,行同步,场同步。其中行同步和场同步信号时序如上图。其他图像分辨率的图像如下图。
很明显VGA的行场同步信号,使用计数器实现固定的波形周期即可,卡点拉高和拉低的点即可。要特别注意场同步的单位是行,而不是像素。
同时VGA驱动模块需要输出当前扫描坐标,以便数据模块给出当前需要显示的数据。后边无论显示何种图像均以这个坐标做文章。
下面是VGA驱动详细波形
四、显示模块
VGA驱动模块输出了当前的扫描坐标。本模块根据当前坐标显示边框和移动方块。
此处对VGA显示移动方块进行详细说明。
当我们在VGA上绘制一个方块,需要知道方块的长度和左上角坐标就可以绘制出该方块。此处方块定义为40*40的方块。
首先定义两个方向,direct_x,direct_y,当x方向移动到边界的时候取反当前flag。
其次,根据direct_x,direct_y代表的边框对方块的左上角坐标进行加减。当移动到左边界时让其向右移动,其他方向类似。
最后,当前扫描坐标和方块最表进行比较。当扫描x最表大于方块的x最表并且小于方块的长度时候,显示。y方向类似。