61010218无敌防空兵

发布者:系统管理员发布时间:2013-10-10浏览次数:15

无敌防空兵
         学号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语言设计及应用姜立东等编著
北京邮电大学出版社