最近做完了电子课设,题目是基于FPGA的游戏。苦于资料难找,在此分享一波入门级资料。
大概分为VGA显示模块、PS2模块、以及游戏设计。这篇主要讲一下如何用VGA做显示附,赠程一路走来的序源码。
关于VGA显示的原理这里就不细讲了,网上有很多相关讲解。
来点干货,VGA显示的方式大概可以分为三种:
1.直接操作像素点绘图
在VGA_Pattern函数中,输入变量是屏幕上的行列值,输出是红绿蓝的色度值0~15的16个数。当oRed,oGreen,oBlue,都为零时,出现颜色为黑色。都为15时出现的颜色为白色,其他色度都可以通过设置三个变量数值来实现。
2.把图片存在ROM里然后调用
首先,将要显示的图片保存成bmp文件的格式,然后用BmpToMif软件转换成mif文件,生成的这个文件就可以导入ROM,在VGA中显示。显示图片时,需要调用一个Rom IP核。保存该mif文件。这个操作要考虑板子ROM的空间。
3.在RAM里面用数组生成图像或字符,然后调用
可以考虑通过一个通用的RAM_set模块来一次性设置一个字符对应的寄存器的值。以显示两个字符为例(字符颜色白色,背景黑色),通过Verilog声明一个长度为14的8位寄存器数组reg [7:0] p[13:0],因为两个字符占用2*7*8=14*8个像素,所以p[i][j]=0表示第i+1列第j+1行像素为黑色,反之1为白色。这样的话,就可以分别把p[13:7]、p[6:0]通过RAM_set来设置。RAM_set模块可以根据要显示的不同字符的字模给寄存器赋不同的值。
其实3和1是同一种
来具体解释一下方法2
附录,如何生成mif文件并写入ROM
方法1:利用Quartus自带的mif编辑器
优点:对于小容量RAM可以快速方便的完成mif文件的编辑工作,不需要第三方软件的编辑;
缺点:一旦数据量过大,一个一个的输入会使人崩溃;
使用方法:在quartus中,【file】/【new】,选择Memory Initialization file,弹出如下窗口:
Number of words:可寻址的存储单元数
words size:存储单元宽度
根据自己的需求进行选择
然后点击“OK”.
- 在表格中输入初始化数据;
- 右键单击左侧地址值,可以修改地址和数据的显示格式;
- 表中任一数据的地址=列值+行值,如图中蓝色单元的地址=24+4=28;
对每个单元填写初始值之后,将文件保存即可。
方法2:利用mif软件来生成
无论使用什么编辑器,必须保证mif文件的格式如下:冒号左边是地址,右边是数据;分号结尾;我使用的是名为BmpToMif的软件。
将MIF写入ROM:
在Quartus中点击Tools-MegaWizad Plug IN Managers,选择Create a new custommegafuntion variation.然后选择板子系列Clcyone 3,所用语言Verilog HDL,在memory compiler选择想要的ROM PORT,选个路径并取名字(要带.v的后缀生成v文件),设置位宽和深度。(
(为了方便,上面的图来自网络)
之后在调用该IP核就可以在VGA上显示图片。
然后放一下干货,这些是在altera DE0板子上实现的VGA显示
VGA的demo程序--链接:https://pan.baidu.com/s/1K0QX_4A7tnvPOvy_d7cz0g 密码:lnrs
VGA的图片显示--链接:https://pan.baidu.com/s/1NsTJXJmxEEn9mLZCn2R2PQ 密码:3asv
VGA显示字符--链接:https://pan.baidu.com/s/1OameDRMFMh7mW3RgzFbtKw 密码:d65r
基于FPGA的打地鼠小游戏初级--链接:https://pan.baidu.com/s/1LFHIW7EwArn5qhr34OjgBg 密码:8dq8
后面还会继续修改完善的~~