基于FPGA的VGA视频弹球游戏

这是2011下半年我在这边第一年的一个期末课程项目。课程是嵌入式系统。我利用一个FPGA开发板做了一个VGA视频输出的弹球游戏。自认为做得不错,课程拿了A+,也因为这个作业通过了暑期实习面试。现在拿出来分享。


平台:

该课程使用的是Sparten 3e starter board开发板。开发板信息及购买地址:http://www.digilentinc.com/Products/Detail.cfm?NavTop=2&NavSub=423&Prod=S3EBOARD&CFID=11126446&CFTOKEN=5eb3071295cc867b-F8FA2FD5-5056-0201-02D18B76539FBE9D


实现效果:

在这个开发板上我做了个弹球游戏。该弹球游戏有上下两个挡板互相弹球,一个挡板由板上按键控制,另一个挡板由一个PS/2键盘控制,视频通过开发板的VGA口输出到普通显示器上,同时板上液晶显示器显示比分。


实现思路:

PS/2接口,按键,液晶显示接口都是使用的现成的IP。

VGA显示接口是自己通过VHDL写的。

主程序是Xilinx Sparten 3e FPGA的Microblaze内核作为处理器上C语言编程实现的。软件编程使用了qp-nano状态机。(qp-nano:http://www.state-machine.com/qp/qpn/)


主要难点是VGA接口和软件实现。


VGA接口主要要弄清楚信号的时序。这个在开发板手册上有说明。我使用的是640x480 @60hz的分辨率,相应的信号模式间下图:


其次要显示图片就得有显存。显存我用的是FPGA内部的BRAM,速度快但容量小。由于Microblaze微处理器需要32KB的内存,我只剩下8KB的显存可用。由于BRAM一个字节还预留了个校验位,所以实际上可用空间是8K×9bit。一个像素只要3个bit,显示8种颜色足以。最后有效的显示区域为128×192。这个分辨率对于这个小游戏来说足够了,要知道gameboy只有160x144的分辨率,但照样有很多伟大的游戏。

还有个难点就是和软件的接口问题。Microblaze使用的是PLB接口。大部分接口部分的VHDL Xilinx已经帮你写好了。我只弄了两个寄存器,一个赋予要写的地址像素信息,一个控制写入。


软件相比VHDL来说就简单了许多,只要对上面设置好的寄存器写像素信息即可。我当时使用了个状态机控制游戏,具体怎么做忘了,实现起来应该不难。


实际效果:

实际运行效果我弄了个视频,如下:

(视频中那个人是我的partner,他主要负责了PS2键盘的控制部分,工作量跟我比小了很多)

frameborder="0" width="640" height="498" src="http://v.qq.com/iframe/player.html?vid=i0150qodz1d&tiny=0&auto=0" allowfullscreen="">



源代码:

源代码可以在我的GitHub里找到:

https://github.com/shallen320/Ping_pong_Sparten3e


报告:

最后附上我的课程报告。全英文的不翻译了,大家凑合看吧


VGA PingPong Game


Objective:

The goal of the project is to build a video game device on the Xilinx Spartan 3E Starter Board. In order to achieve this,we implement a VGA and PS/2 keyboard interface as the output and input of the game. Xilinx doesn’t provide any VGA interface in EDK, we make our own using VHDL. The PS/2 interface is ready made by Xilinx in EDK so we can directly use it.

 

The game is a 2 players game that one play versus another. Each player controls a paddle to bounce the ball to its rival.

  • 1
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值