无敌防空兵
学号61010218
姓名姚顺
1、无敌防空兵
n 一款射击类小游戏,飞机扔炮弹炸防空兵,防空兵发射导弹摧毁敌机,保家卫国
2、课题背景:
n 问题:自己对VHDL语言还不够熟练掌握
n 应用背景:娱乐,放松身心
3、项目规划:
n 功能、指标、规模
v 基础部分:天空中会随即的飞机飞过,防空兵发射武器摧毁敌机。
v 防空兵可以左右移动,跳跃
v 敌军的轰炸机会发射炮弹以打击防空兵
v 敌军的火焰飞机会发射火焰一则是意图杀死防空兵,另一方面 可以烧毁地面,地面烧毁出不可进入,一旦进入则被杀死
v 天空中会有救援物资落下,包括加快子弹速度,增大子弹威 力,还有消灭目前空中所有飞机。
v 关卡模式:随着关卡增大,敌人飞机速度会不断加快,另外各个飞机的比例会有变化,主要表现为攻击型的飞机数目增大,另外飞机防御力也会增大。
v 另外整个游戏过程中会配有紧张的战斗音乐。
v 提高部分:挑战模式,在规定时间里消灭天空中所有飞机,挑战胜利可以获得道具,包括防弹,及武器改进。
v
n 面板(显示)、操作、规则
利用点阵板显示,设置七个按键,包括:
1、“启动”键:在游戏为启动前,按开始键后游戏开始。
2、“上下左右”的四个移动键:游戏中,可以利用上下左右键控制防空兵的飞行移动。
3、发射子弹键:按发射子弹键发射子弹。
4、切换子弹键:按该键能够在两种子弹之间来回切换。
5、暂停和开始键:按暂停键可以令游戏暂停,按开始键可以让暂停的游戏继续执行。
规则:
1.防空兵与敌机生命值都是3,每被击中一次生命值减一,直至为0,则此方输掉
2.若防空兵飞行时撞到敌机,则玩家输
4、实现方案:
n 核心问题分析
1.设计土地轮廓的形状,防空兵,武器,飞机形状,颜色等外观设计
2.飞机以及防空兵移动,发射子弹的控制
3.判断炸弹是否炸到防空兵,以及防空兵是否落入海里
4.飞机速度的控制,以及各种飞机的比例
5.装备奖励的随机设置
6.防空兵的生命值以及各种飞机的生命值
7.点阵板的实现
n 系统解决方案
1、防空兵的位置:用三个竖直的点阵上的点表示的防空兵位置,每个点的横纵坐标均用四位向量表示;
2、防空兵机飞机的移动:设计几个模块,分别表示防空兵和敌方战机。防空兵的移动本质就是其横或纵坐标加减一。或者是沿着土地轮廓相应的函数加减。敌方战机就是沿着一条或两条水平线移动。
3、子弹与炸弹位置:与防空兵一样用二维数组表示。
4、子弹发射与移动:当按下发射键后,子弹发射。而子弹的移动需由战车的移动方向确定。
5、生命值的确定:利用一个计数器来计数生命值,当被射中后计数器减一,当生命值为零时,防空兵被击毁。当落入海里后直接死亡。
6、点阵板的现实:由于防空兵和武器的位置都是用四位向量表示,故需译码后才能在点阵板上显示。
5、系统结构:
a) 系统框图系统结构框图
b) 模块功能描述模块功能描述
1、键盘模块:输出按键信息
2、玩家模块:控制玩家位置、生命值、发射炮弹
3、敌方战机模块:敌方战机移动、发射炸弹
4、子弹模块:控制武器位置、移动
5、生命值的确定:利用一个计数器来计数生命值,当被射中后计数器减一,当生命值为零时,死亡
总控制器:判断游戏胜负
6、显示模块:显示防空兵、飞机、武器等
c) 模块接口标注(参数、协议)
n 模块接口标注(参数、协议)
v 键盘模块:响应按键,输出特定的二进制码
v 输入
v Clk_scan:键盘扫描信号的时钟输入端
v Clk_xiaodou:键盘消抖时钟
v Clo[3..0]:键盘列信号输入端
v 输出
v down:按键信号,有按键时输出为高电平;
v change_bullet:切换炮弹信号,每按下一次切换一次炮弹类型;
v shot:发射炮弹信号,发射炮弹键,输出高电平;
v Row_out[3..0]:输出行扫描信号;
v Char_out[3..0]:对字母键按下的译码输出;
v Key_out[2..0]:对数字键2、6、5、7的译码输出(表示方向上、下,左、右);
v turn_on:表示游戏启动;
v quit:游戏推出信号;
v initial:游戏初始化信号;
v 时钟模块
v 输入
v Clk_in:2MHzTTL方波信号输入端
v 输出
v CLK_10000:输出10000Hz频率时钟
v CLK_1000:输出1000Hz频率时钟
v CLK_1:输出1Hz频率时钟
v CLK_2:输出2Hz频率时钟
v 玩家战车模块:控制坦克移动
v 输入
v Cha_clk_Mov:玩家战车移动速度的时钟信号输入端
v lose:游戏失败信号,高电平有效
v pause:暂停信号输入端,高电平有效
v start:游戏开始信号
v initial:初始化信号
v blood_down:防空兵生命值减少信号,高电平有效
v key_in[2..0]:方向键译码输入信号
v 输出
v A1xpos[3..0],A1ypos[3..0],A2xpos[3..0],A2ypos[3..0],A3xpos[3..0],A3ypos[3..0], A4xpos[3..0],A4ypos[3..0],:敌机四个点的横纵坐标输出信号
v go_dir[1..0]:防空兵向上飞行方向信号
v A_destroy:防空兵被毁信号,高电平有效
v Ownblood[3..0]:防空兵生命值
v
v 防空兵炮弹模块:控制炮弹移动,出现和消失,判断炮弹是否击中敌机
v 输入
v go_dir[1..0]:防空兵前进方向信号
v head_xpos[3..0],head_ypos[3..0]:防空兵头部横纵坐标
v B1x[3..0],B1y[3..0], B2x[3..0],B2y[3..0],B3x[3..0],B3y[3..0], B4x[3..0],B4y[3..0]:表示敌方B敌机的四个点的横纵坐标
v C1x[3..0],C1y[3..0], C2x[3..0],C2y[3..0],C3x[3..0],C3y[3..0], C4x[3..0],C4y[3..0]:表示敌方C敌机的四个点的横纵坐标
v shot:发射炮弹信号,高电平有效
v initial:初始化信号输入端,高电平有效
v bullet_type:防空兵的导弹类型信号
v b_mov_clk:导弹移动速度时钟
v 输出
v Bullet_dir:炮弹前进方向
v B_count:敌方B敌机被打中信号
v C_count:敌方C敌机被打中信号
v bullet1_show,bullet2_show:炮弹显示信号,高电平有效
v ob1xpos[3..0], ob1ypos[3..0], ob2xpos[3..0], ob2ypos[3..0]:防空兵两枚炮弹的横纵坐标
v
v
v
v 敌方飞机模块
v 输入
v head_xpos[3..0],head_ypos[3..0]:防空兵头部横纵坐标
v ob1xpos[3..0], ob1ypos[3..0], ob2xpos[3..0], ob2ypos[3..0]:防空兵两枚炮弹的横纵坐标
v Cha_clk_Mov:敌机移动速度的时钟信号输入端
v initial:初始化信号
v lose:失败信号
v start:开始信号输入端
v pause:暂停信号输入端,高电平有效
v B_destroy,C_destroy:敌方B、C战车被毁信号
v 输出
v B1xpos[3..0],B1ypos[3..0],B2xpos[3..0],B2ypos[3..0],C3xpos[3..0],C3ypos[3..0],B4xpos[3..0],B4ypos[3..0],:敌方B飞机四个点的横纵坐标输出信号
v C1xpos[3..0],C1ypos[3..0],C2xpos[3..0],C2ypos[3..0],C3xpos[3..0],C3ypos[3..0],C4xpos[3..0],C4ypos[ 3..0],:敌方C飞机四个点的横纵坐标输出信号
v Enemy_cha_num[3..0]:敌方飞机数量
v B_go_dir[1..0],C_go_dir[1..0]:敌方B、C飞机前进方向
v
v 敌方飞机炸弹模块
v 输入:
v B_go_dir[1..0],C_go_dir[1..0]:敌方B、C飞机前进方向
v B_head_x[3..0],B_head_y[3..0],C_head_x[3..0],C_head_y[3..0]:敌方B、C飞机的头部坐标
v Initial:初始化信号
v ene_bul_clk:敌机炸弹炮弹前进速度时钟
v start:开始信号输入端
v pause:暂停信号输入端,高电平有效
v initial:初始化信号输入端,高电平有效
v A1xpos[3..0],A1ypos[3..0],A2xpos[3..0],A2ypos[3..0],A3xpos[3..0],A3ypos[3..0], A4xpos[3..0],A4ypos[3..0]:防空兵的四个点的横纵坐标
v
v 输出
v blood_down:击中玩家战车信号,高电平有效
v B_bul_show,C_bul_show:B、C飞机炮弹显示信号
v B_bul_x[3..0],B_bul_y[3..0],C_bul_x[3..0],C_bul_y[3..0]:敌方飞机B、C炮弹横纵坐标
v
v
v 控制模块:判断是否有游戏输赢,时间倒计时等
v
v 输入
v ene_cha_num[3..0]:玩家防空兵生命值
v char_in[3..0]:字母译码输入端
v b1_mov_clk:防空兵第一种炮弹移动时钟
v b2_mov_clk: 防空兵第二种炮弹移动时钟
v change_bullet:切换炮弹信号
v B_count,Count:敌方B、C飞机被击中信号
v A_destroy: 防空兵被毁信号
v Initial:初始化信号
v Clk_1sec:频率为1Hz的时钟
v Turn_on:游戏启动信号
v A1x[3..0],A1y[3..0], A2y[3..0],A3x[3..0],A3y[3..0]
v A4x[3..0],A4y[3..0]:玩家飞机四个点的横纵坐标
v Ob1x[3..0],ob1y[3..0],ob2x[3..0],ob2y[3..0]:防空兵两枚炮弹的横纵坐标
v B1x[3..0], B 1y[3..0], B 2y[3..0], B 3x[3..0], B 3y[3..0]
v B 4x[3..0], B 4y[3..0]:敌方B飞机四个点的横纵坐标
v C1x[3..0], C 1y[3..0], C 2y[3..0], C 3x[3..0], C 3y[3..0]
v C 4x[3..0], C 4y[3..0]:敌方C飞机四个点的坐标
v
v 输出
v Time_h[3..0],Time_m,Time_l[3..0]:
v Start_show[3..0]:开机倒计时时间
v Bullet_type:玩家炮弹类型
v Game_pause:游戏暂停信号
v Game_lose:游戏失败信号
v Game_win:游戏胜利信号
v B_des:敌方B飞机被毁信号
v C_des:敌方C飞机被毁信号
v Game_start:游戏开始信号
v
v
v
v
v
v 点阵板列扫描模块:
v 输入:
v Clk_1000:点阵板列扫描时钟
v 输出:
v Dianzhencol[3..0]:点阵列扫描信号
v
v 点阵板列扫描译码模块:将四位列扫描信号译码成16位
v 输入:
v Dianzhencol[3..0]:点阵列扫描信号
v 输出
v Dianzhenscan[15..0]:译码后的点阵列扫描16位信号
v
v
v 比较模块:通过对比需要亮的点的横坐标是否与扫描的列坐标相等,若相等则输出需要亮的点纵坐标
v
v 输入
v xpos[3..0],ypos[3..0]:需要亮的点的横纵坐标
v dianzhencol[3..0]:点阵的列扫描信号
v 输出:
v oypos[3..0]:需要亮的点的纵坐标
v CR:输出的需要亮的点的纵坐标是否有效信号,高电平有效
v
v 四位纵坐标向量译码模块:由于点阵板的行选有16位,故需将四位纵坐标译码成16位
v
v 输入
v Ypos[3..0]:需要量的点的纵坐标
v CR:输出的需要亮的点的纵坐标是否有效信号,高电平有效
v 输出:
v Opos[15..0]:译码出的16位信号
v
v 显示模块:
v
v 输入:
v a,b,c,d,e,f,g,h,I,j,k,l,m,n,o,p:需要亮的防空兵、防空兵炮弹、地方飞机、飞机炸弹共十六个点的坐标
v GO:开机画面Go
v Smile:[15..0]:胜利后的笑脸的16位行信号
v three_3,two_2,one_1[15..0]:开机画面3、2、1倒计时的16位行信号
v start:游戏开始信号
v lose:游戏失败信号
v win:游戏胜利信号
v start_show[3..0]:开机画面时间
v 输出:
v Y[15..0]:点阵板的16位行信号
v
n
例如EP1C6Q240C8实验箱的输入输出的实际连线与管脚表
输入输出名称
|
芯片引脚号
|
实验箱标注
|
钉子线连接
|
KEY_ROW[0]
|
120
|
ROW1
|
无
|
KEY_ROW[1]
|
121
|
ROW2
|
无
|
KEY_ROW[2]
|
122
|
ROW3
|
无
|
KEY_ROW[3]
|
123
|
ROW4
|
无
|
KEY_COL[0]
|
PIN_124
|
COL1
|
无
|
KEY_COL[1]
|
PIN_125
|
COL2
|
无
|
KEY_COL[2]
|
PIN_126
|
COL3
|
无
|
KEY_COL[3]
|
PIN_131
|
COL4
|
无
|
CLK_2M
|
PIN_28
|
CLK
|
无
|
DIANZHENY[0]
|
PIN_158
|
P1
|
GL16
|
DIANZHENY[1]
|
PIN_159
|
P2
|
GL15
|
DIANZHENY[2]
|
PIN_160
|
P3
|
GL14
|
DIANZHENY[3]
|
PIN_161
|
P4
|
GL13
|
DIANZHENY[4]
|
PIN_162
|
P5
|
GL12
|
DIANZHENY[5]
|
PIN_163
|
P6
|
GL11
|
DIANZHENY[6]
|
PIN_164
|
P7
|
GL10
|
DIANZHENY[7]
|
PIN_165
|
P8
|
GL9
|
DIANZHENY[8]
|
PIN_166
|
P9
|
GL8
|
DIANZHENY[9]
|
PIN_167
|
P10
|
GL7
|
DIANZHENY[10]
|
PIN_168
|
P11
|
GL6
|
DIANZHENY[11]
|
PIN_169
|
P12
|
GL5
|
DIANZHENY[12]
|
PIN_170
|
P13
|
GL4
|
DIANZHENY[13]
|
PIN_173
|
P14
|
GL3
|
DIANZHENY[14]
|
PIN_174
|
P15
|
GL2
|
DIANZHENY[15]
|
PIN_175
|
P16
|
GL1
|
DIAN_Y2[0]
|
PIN_55
|
P59
|
RL16
|
DIAN_Y2[1]
|
PIN_56
|
P60
|
RL15
|
DIAN_Y2[2]
|
PIN_57
|
P61
|
RL14
|
DIAN_Y2[3]
|
PIN_58
|
P62
|
RL13
|
DIAN_Y2[4]
|
PIN_59
|
P63
|
RL12
|
DIAN_Y2[5]
|
PIN_60
|
P64
|
RL11
|
DIAN_Y2[6]
|
PIN_61
|
P65
|
RL10
|
DIAN_Y2[7]
|
PIN_62
|
P66
|
RL9
|
DIAN_Y2[8]
|
PIN_63
|
P67
|
RL8
|
DIAN_Y2[9]
|
PIN_64
|
P68
|
RL7
|
DIAN_Y2[10]
|
PIN_65
|
P69
|
RL6
|
DIAN_Y2[11]
|
PIN_66
|
P70
|
RL5
|
DIAN_Y2[12]
|
PIN_67
|
P71
|
RL4
|
DIAN_Y2[13]
|
PIN_68
|
P72
|
RL3
|
DIAN_Y2[14]
|
PIN_73
|
P73
|
RL2
|
DIAN_Y2[15]
|
PIN_74
|
P74
|
RL1
|
SCAN_Dianzhen[0]
|
PIN_176
|
P17
|
R1
|
SCAN_Dianzhen[1]
|
PIN_177
|
P18
|
R2
|
SCAN_Dianzhen[2]
|
PIN_178
|
P19
|
R3
|
SCAN_Dianzhen[3]
|
PIN_179
|
P20
|
R4
|
SCAN_Dianzhen[4]
|
PIN_180
|
P21
|
R5
|
SCAN_Dianzhen[5]
|
PIN_181
|
P22
|
R6
|
SCAN_Dianzhen[6]
|
PIN_182
|
P23
|
R7
|
SCAN_Dianzhen[7]
|
PIN_184
|
P24
|
R8
|
SCAN_Dianzhen[8]
|
PIN_21
|
EXP_07
|
R9
|
SCAN_Dianzhen[9]
|
PIN_20
|
EXP_08
|
R10
|
SCAN_Dianzhen[10]
|
PIN_19
|
EXP_09
|
R11
|
SCAN_Dianzhen[11]
|
PIN_18
|
EXP_10
|
R12
|
SCAN_Dianzhen[12]
|
PIN_17
|
EXP_11
|
R13
|
SCAN_Dianzhen[13]
|
PIN_16
|
EXP_12
|
R14
|
SCAN_Dianzhen[14]
|
PIN_15
|
EXP_13
|
R15
|
SCAN_Dianzhen[15]
|
PIN_14
|
EXP_14
|
R16
|
own_blood[0]
|
PIN_119
|
1A
|
无
|
own_blood[1]
|
PIN_118
|
1B
|
无
|
own_blood[2]
|
PIN_117
|
1C
|
无
|
own_blood[3]
|
PIN_116
|
1D
|
无
|
own_blood[4]
|
PIN_115
|
1E
|
无
|
own_blood[5]
|
PIN_114
|
1F
|
无
|
own_blood[6]
|
PIN_113
|
1G
|
无
|
own_blood[7]
|
PIN_108
|
1H
|
无
|
ene_number[0]
|
PIN_107
|
2A
|
无
|
ene_number[1]
|
PIN_106
|
2B
|
无
|
ene_number[2]
|
PIN_105
|
2C
|
无
|
ene_number[3]
|
PIN_104
|
2D
|
无
|
ene_number[4]
|
PIN_103
|
2E
|
无
|
ene_number[5]
|
PIN_102
|
2F
|
无
|
ene_number[6]
|
PIN_101
|
2G
|
无
|
ene_number[7]
|
PIN_100
|
2H
|
无
|
TimeL[0]
|
PIN_99
|
3A
|
无
|
TimeL[1]
|
PIN_98
|
3B
|
无
|
TimeL[2]
|
PIN_97
|
3C
|
无
|
TimeL[3]
|
PIN_96
|
3D
|
无
|
TimeL[4]
|
PIN_95
|
3E
|
无
|
TimeL[5]
|
PIN_94
|
3F
|
无
|
TimeL[6]
|
PIN_93
|
3G
|
无
|
TimeL[7]
|
PIN_88
|
3H
|
无
|
TimeM[0]
|
PIN_87
|
4A
|
无
|
TimeM[1]
|
PIN_86
|
4B
|
无
|
TimeM[2]
|
PIN_85
|
4C
|
无
|
TimeM[3]
|
PIN_84
|
4D
|
无
|
TimeM[4]
|
PIN_83
|
4E
|
无
|
TimeM[5]
|
PIN_82
|
4F
|
无
|
TimeM[6]
|
PIN_81
|
4G
|
无
|
TimeM[7]
|
PIN_80
|
4H
|
无
|
TimeH[0]
|
PIN_4
|
EXP_22
|
5A
|
TimeH[1]
|
PIN_5
|
EXP_21
|
5B
|
TimeH[2]
|
PIN_6
|
EXP_20
|
5C
|
TimeH[3]
|
PIN_7
|
EXP_19
|
5D
|
TimeH[4]
|
PIN_8
|
EXP_18
|
5E
|
TimeH[5]
|
PIN_11
|
EXP_17
|
5F
|
TimeH[6]
|
PIN_12
|
EXP_16
|
5G
|
TimeH[7]
|
PIN_13
|
EXP_15
|
5H
|
6、状态流程图:
系统工作状态流程
时钟
|
防空兵
|
键盘
|
点阵显示
|
海水,物资补给
|
子弹
|
飞机
|
判断是否爆炸
|
n
7、各主要模块仿真结果波形
n 各模块的仿真波形,详细注释输入输出功能端口
键盘模块仿真:
防空兵模块仿真:
防空兵导弹模块仿真:
敌机模块仿真:
敌机炸弹模块仿真
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
当前实现的功能:
1.防空兵与敌机和炮弹的显示
2.子弹的发射,及子弹类型的改变(单发和双发),判断是否击中或相撞
3.生命值的计数
4.生命值的数码管显示
5.游戏开始画面(GO),以及输赢的不同画面(红色哭脸与绿色笑脸)
6.开始暂停功能实现
差异详细注释:
1.防空兵是在整个平面上移动的,没有沿着一条预设的轨迹移动
2.飞机只有一种类型,没有类型的变化,也没有相应的产生奖励
3.只有一关,没能实现关卡模式
4.没有添加背景音乐
n 可以进一步发挥提高的部分
1.防空兵是在整个平面上移动的,没有沿着一条预设的轨迹移动
2.飞机只有一种类型,没有类型的变化,也没有相应的产生奖励
3.只有一关,没能实现关卡模式
4.没有添加背景音乐
n 课程设计体会
这算是大学里的第三次课程设计,但与前两次十分不一样,前两次都是老师定的题目,自己没有选择性,这一次我们基本上是实现了完全的独立自主吧!所以收获颇大。
从最初的第一次课程辅导,我就知道这条路上必将充满“艰辛”,首先自己在开始时候对这门语言一窍不通,一切都是从零开始,而且是完全的自学,我很喜欢这样的感觉,我觉得大学就要这样,自由的学习,找自己感兴趣的去做,这样才有动力,看了学长的许多优秀作品后,真的压力山大啊!再过选题这一关时就遇到了许多困难,说实话老师把关真的蛮严的哦!要么太简单要么太难,关键是还不能重复,的那个是算是绞尽脑汁吧!不过,不后悔,因为选题真的很重要,这直接关系到我们这一学的课程设计的各个方面,我也觉得自己选题还行,至少是一个自己蛮喜欢的游戏!
通过这次课程实践爱你,我收获最大的就是初步掌握了VHDL这门新的语言吧!而且是完全的自学,蛮有成就感的,呵呵!刚开始觉得做这样一个系统几乎是不可能的,但在看过一些指导书后,有了些眉目,顿时觉得豁然开朗,其实到最后我们整个程序中用的也就是那么几个语句,很多时候关键的往往就那么几个,抓住重点真的很重要 啊!这也算一种收获吧!
在整个设计过程中最烦的就是调试了,程序编好了,仿真什么的都没有问题,但到实物电路中就是问题频出,很让人头疼,特别是在最后的几天时间赶得特别紧,以后一定要吸取教训不能再纵容自己拖沓的性格了!
从完全不了解这么语言,完全不知道点阵板,到最后勉强完成任务,我总结了以下收获:
1、无论什么事,只要花了功夫去做,我们都可以做成,不放弃不抛弃
2、永远不能拖沓,永远记住“早起的鸟儿有虫吃”,早准备吃准备,最终都是要过那一关的,不要把所有的事都压到最后
3、善于向他人请教,老师同学都是很好的资源
9、参考文献
《VHDL语言设计及应用》姜立东等编著
北京邮电大学出版社