学号:61009224
姓名:李柄汝
1、申请题目:基于FPGA的坦克游戏
n 坦克游戏
n 实现相互攻击,以消灭敌人为目的
2、课题背景:
n 存在问题、应用背景
n 基于以前流行的小霸王电子游戏机中的经典游戏改编而来,此游戏简单易于上手,益智并可锻炼手部操作。
3、项目规划:
n 功能、指标、规模
使用16×16的点阵板作为显示屏幕,游戏初始化后可显示准备的开始界面,在游戏结束后led灯亮起,红色灯代表胜利,绿色灯代表失败。
可显示三辆坦克,一辆是由玩家控制,其他两辆是敌方坦克自动在屏幕移动。敌方坦克由内部的程序控制,可以自动搜索到玩家坦克的位置,然后向玩家坦克移动,在发现自己和玩家坦克在一条直线上时,可以以一定的时间间隔发射子弹,向玩家坦克射击。
玩家可以通过逻辑电平控制坦克上下左右移动,躲避敌方坦克的子弹,或发射子弹击毁敌方坦克。当己方被击中时游戏失败,当对方两辆坦克被击中时游戏胜利。
敌方坦克和玩家坦克相撞后,敌方胜利。
n 面板(显示)、操作、规则
利用点阵板显示,设置五个按键,包括:
1、“开始”键:在游戏为开始前,按开始键后游戏开始。
2、“上下左右”的四个移动键:游戏中,可以利用上下左右键控制坦克的移动。
3、发射子弹键:按发射子弹键发射子弹。
规则:
1、游戏中有一辆坦克由人控制攻击其他两辆,对方的两辆坦克则会自动朝玩家控制的坦克运动,并发射子弹攻击。
2、每辆坦克被子弹击中就消失,即被击毁。敌方的两辆坦克互相射击无效。
3、玩家坦克和敌方坦克相撞,坦克撞毁消失,敌方获胜。敌方坦克相撞不撞毁。
4、如果被玩家控制的坦克被击中,则玩家失败。若对方的坦克都被击中消失,则此时玩家获胜。
n 输入、输出接口
除五个控制键外,还有两个判断敌我胜利的led显示,win灯亮起代表胜利,lose代表失败。
4、实现方案:
n 核心问题
a. 设计坦克形状,并且有利于坦克位置的记录
b. 记录坦克面朝方向,以控制子弹飞行方向
c. 坦克的产生和消失,子弹的产生和消失
d. 综合各方面判断游戏失败与否
e. 判断敌我坦克是否相撞,以及敌方坦克自己相撞不影响游戏
f. 敌方坦克的自动搜索和靠近
g. 点阵板的显示问题
n 解决方案
A. 用一个点代表坦克,以两个四位的二进制编码来记录当前坦克的位置,比如,当坦克初始化的时候,我方坦克的位置矢量为0111和0111,代表坦克横坐标为x=7,纵坐标为y=7
B. 由于坦克在平面上运动,故有四个方向,以一个两位二进制来记录,如dir[2..0],当向右的时候为00,以此类推
C. 坦克的产生和消失由一个使能信号控制,当符合产生条件时坦克显示,当被击中时使能信号消失,坦克消失。同理,子弹也由此产生,当按下shot时子弹显示,但到达边缘或击中时子弹消失。
D. 当敌方两辆坦克均被击中时我方胜利,当己方坦克被击中或者相撞时敌方获胜。
E. 分析我方坦克与敌方坦克的位置坐标,当有一个坦克与我方坦克重合时发出相撞信号
F. 以我方坦克为中心,将屏幕区域分为八块,并且编码为000,001,010,……111,根据敌方坦克所处区域进行实时判断,从而做出内部指令的操作一靠近我方坦克。
G. 采用列扫描的方式来显示图形。在设计中,由于坦克和子弹的坐标都是利用4位的向量来表示,所以在输入到点阵板上显示时要经过一个译码模块来将4为向量译为16为的向量,例如“0001”译为“0000000000000010”。同时由于每个坦克和子弹都有自己独立的坐标记录向量,所以要将这些信息同时显示到点阵板上就要把有相同纵坐标的位置的横坐标的16位向量按位或,所以要经过过一个比较模块来选择当前扫描行的行信号输入到点阵板中。
5、系统结构:
n 系统框图
n 模块功能描述
n 模块接口标注(参数、协议)
v 分频模块,输入10khz时钟信号,输出二分频,十分频等时钟信号
己方坦克模块:clk:时钟信号端
cs:坦克使能端
right,left,up,down:控制坦克移动信号
mytanx_x,mytank_y:坦克位置信号输出
dir[1..0]:坦克方向输出端
敌方坦克:
clk:时钟信号端
cs:坦克使能端
m_x,m_y:我方坦克位置输入,便于敌方坦克搜索
entank_x,entank_y:敌方坦克位置输出
shot:发射子弹信号
dir[1..0]:坦克方向输出端
敌方坦克2:各信号同上
我方子弹控制:
shot:发射子弹信号
m_x,m_y:我方坦克位置输入
en_x,en_y en_x1,en_y1:敌方坦克位置
dir[1..0]:我坦克方向
敌方坦克子弹:
shot:发射子弹信号
m_x,m_y:我方坦克位置输入
en_x,en_y:敌方坦克位置
dir[1..0]:坦克方向
enb_x,enb_y:子弹位置
clean:子弹清除信号
count:击中信号
选择信号通道:xpos,ypos:要显示的某点横纵坐标
Q:扫描列信号
Oxpos:通过的横坐标信号
译码模块:四位二进制输入,16位输出
相撞模块:三辆坦克坐标输入,相撞信号输出
例如EP1C6Q240C8实验箱的输入输出的实际连线与管脚表
输入输出名称
|
芯片引脚号
|
实验箱标注
|
钉子线连接
|
CLK
CS
DOWN
LEFT
LOSE
RIGHT
SHOT
UP
WIN
X[0]
X[1]
X[2]
X[3]
X[4]
X[5]
X[6]
X[7]
X[8]
X[9]
X[10]
X[11]
X[12]
X[13]
X[14]
X[15]
Y[0]
Y[1]
Y[2]
Y[3]
Y[4]
Y[5]
Y[6]
Y[7]
Y[8]
Y[9]
Y[10]
Y[11]
Y[12]
Y[13]
Y[14]
Y[15]
|
PIN_2
PIN_3
PIN_34
PIN_31
PIN_68
PIN_32
PIN_4
PIN_33
PIN_67
PIN_47
PIN_48
PIN_49
PIN_50
PIN_51
PIN_52
PIN_53
PIN_54
PIN_55
PIN_56
PIN_57
PIN_58
PIN_59
PIN_60
PIN_61
PIN_62
PIN_119
PIN_120
PIN_121
PIN_122
PIN_123
PIN_124
PIN_125
PIN_126
PIN_127
PIN_128
PIN_129
PIN_130
PIN_131
PIN_132
PIN_133
PIN_134
|
P39
P38
P32
P35
P6
P34
P37
P33
P7
P8
P9
P10
P11
P12
P13
P14
P15
P16
P17
P18
P19
P20
P21
P22
P23
P46
P47
P48
P49
P50
P51
P52
P53
P54
P55
P56
P57
P58
P59
P60
P61
|
全部用丁字线
|
|
|
|
无
|
|
|
|
无
|
|
|
|
|
6、状态流程图:
n 系统工作状态流程
v
n
7、各主要模块仿真结果波形
n 各模块的仿真波形,详细注释输入输出功能端口
Mytank
Enemytank
相撞模块:
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
在本次设计中,开始设计敌方坦克随机运动,随机发射子弹,在设计的过程以及玩实例游戏的过程中发现这样的设计思路华而不实,对于实际游戏趣味没有考虑,所以更改了敌方坦克的运动轨迹,改为敌方坦克通过实时的与我方坦克位置进行比较来向我方坦克靠近,并且当与我方坦克处于同一x轴或者Y轴时向我方发射子弹。
另外一个比较大的失误是由于子弹模块的使能信号比较复杂,无法在点阵板上进行稳定显示,只是在某些情况下会偶尔显示子弹效果,但总体上是失败的。
n 可以进一步发挥提高的部分
为了美观可以用七个点来代表坦克,不过这样会使点阵板显得拥挤
n 课程设计体会
这次课程设计从一开始的立项到最后的验收,历时一学期,从前期准备到后期的通宵设计每一个环境我都收获良多。
在前三周的理论课教学中,胡老师和黄老师力图把系统的概念传输给我们,让我们学会从整体上理解现代设计中的先进理念。一开始我以为这门课程就是上学期数字电路的简单延伸,但是经历前三周的理论课教学让我了解到虽然名称是数字系统,但是设计思路和方法都不是数字电路课程的简单延伸。首先是方法上,我不需要再用译码器等硬件来实现状态的转换,只需要用vhdl的语言编程就可以实现以前用一大堆电路才可以实现的状态转换。其次是通过老师简单的语言教学,我对于设计数字电路有了新的认识,利用编程也可以控制硬件电路。
在随后的立项中我一开始想法是声控搜索,但是在跟黄老师的交流中发现这个太依赖于外设电路而且比较困难,所以放弃改为了游戏设计。从清明节放假开始我算是正式开始了数字系统的设计,这个过程完全依靠自己学习自己摸索。先是从了解点阵板开始,进而开始对整个设计进行整体规划,而老师一直试图灌输给我们的层次化设计也在这一过程体现。
在设计过程中遇到了很多困难,首先是点阵板,一开始不知道怎么控制两个十六位的输入的点阵板,通过不断的翻书才渐渐学会先用四位矢量再译码的方式控制。另外在设计调试的过程中,一开始是仿真全部正确可是搭起实物电路什么也不显示,这是个很让人受挫的事情,可任务就在面前不得不坚持下来,通过不断地对程序修改对硬件电路检查,终于有一部分电路实现。而这也给困境中的我以很大动力。
不得不说,这次设计虽然学到很多,但还是有一个很大的遗憾,就是一项重要功能没有实现,虽然自己想方设法进行查证但是由于使能模块的复杂时序性,这一功能还是不够稳定或者说没有实现。为了解决这一问题,我放弃了坚持一个月的设计思路,在验收前一晚上临时改变,将所有程序推到重来,通宵重新编写了用矩阵方式做的设计(这一版本的设计附在附件里),显然一个月的调试没有解决的问题不大可能通过一晚上的整体改变而解决,这一版本同样问题出在了子弹模块上。直到最后也没有解决这一问题。
总体来说,在这一课程的学习中最大体会就是坚持,一个小问题就可能让你通宵几天来解决,而如果意志不够的话很容易失望甚至绝望,只有不断地坚持,告诉自己忍一下再调试才有可能解决这一问题。另外从设计本身来说的话我觉得我最大收获是学习了一门新的语言,它跟高级语言不一样,面对的是实际电路,不仅需要考虑算法还需要考虑实际实现的可能性,另一个收获就是将一个理念牢牢记在心中,层次化模块化设计,在利用模块间的信号协议来实现整体系统的功能。
9、参考文献
《vhdl语言程序设计及其应用》 姜立东 编著 北京邮电大学出版社