数字电路实验打地鼠游戏设计与实现Word文档格式.docx
《数字电路实验打地鼠游戏设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字电路实验打地鼠游戏设计与实现Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
3.4点阵显示模块…………………………………………………………05
3.5键盘控制模块…………………………………………………………06
3.6计分模块………………………………………………………………06
3.7计时模块………………………………………………………………06
3.8译码器模块……………………………………………………………07
4、源程序…………………………………………………………………………07
4.1分频器…………………………………………………………………07
4.2随机数产生模块………………………………………………………08
4.3防抖模块………………………………………………………………10
4.4点阵显示模块…………………………………………………………10
4.5键盘控制模块…………………………………………………………12
4.6计分模块………………………………………………………………13
4.7计时模块………………………………………………………………14
4.8译码器模块……………………………………………………………15
五、功能说明及资源利用情况…………………………………………………016
六、故障及问题分析……………………………………………………………016
七、总结与结论……………………………………………………………………17
一、设计任务与要求
1、设计一个挑战反应速度的“打地鼠”游戏,采用用8×
8双色点阵显示游戏界面,其中游戏边界采用绿色LED显示,随机出现的地鼠采用红色LED显示,游戏有16个洞穴。
2、游戏洞穴每次随机出现一个地鼠,每个地鼠的最长保持时间为2秒,2秒后随机出现下一个地鼠。
以4×
4键盘的按键代表锤子,16个洞穴与16个按键一一对应,一旦锤子在2秒内击中地鼠,地鼠消失,数码管计分器分数加1分;
若锤子一直没有击中地鼠,2秒后该地鼠消失。
用两个数码管显示游戏成绩,当游戏成绩达到10分时游戏结束,点阵显示字符“V”。
3、用两个数码管对整个游戏进行倒计时,当游戏时间超过59秒而成绩未达到10分时,游戏失败,点阵显示字符“X”。
4、按复位键重新开始游戏,并开始倒计时。
二、系统设计
2.1设计思路
地鼠显示:
4*4的红色点阵
边界显示:
6*6的绿色点阵
结束画面:
绿色的“V”形胜利画面,红色的“X”形失败画面
计时和计分显示:
各用2个数码管,共4个数码管
锤子控制:
4*4的键盘
开关控制:
1个拨码开关
用拨码开关开始游戏,6*6绿色点阵常亮,红色点阵亮的位置表示地鼠出现,按下相应的键盘即算打中,计1分,记到10分游戏结束显示绿色“V”。
游戏时间共计60秒,时间为0,分数未到10分,游戏结束显示红色“X”。
用50MHz作为基本信号源,分频得到500Hz和1Hz。
2.2总体框图
2.3分块设计
A.游戏准备模块:
1.随机数产生模块:
将一个4位的二进制数的第一位与最后一位进行异或运算后,作为随机数种子,并且每次运算完将前三位与种子进行合并,产生周期为21的伪随机数,通过计数控制地鼠持续2秒,通过返回的得分信号改变得分后地鼠的位置。
B.游戏核心模块:
1.点阵显示模块:
用于显示地鼠和边界,以及结束时胜利或失败的画面。
2.键盘控制模块:
通过对地鼠对应位置的列进行扫描,比较返回的键盘行信号,打到地鼠即输出得分脉冲信号。
C.进程显示模块:
1.计分模块:
通过接收得分脉冲信号,进行计分,每次开始预制值为‘0’。
2.计时模块:
使用1Hz的时钟信号进行倒计时,每次减1,开始时预制值为‘60’。
D.辅助模块:
1.分频器模块:
将50MHz的信号分频成1Hz用于计时和500Hz用于其他功能。
2.防抖模块:
用500Hz的信号进行计数,只有持续6个时钟周期以上的按键信号才会进入按键控制模块,从而达到防抖的作用。
3.译码器模块:
将计分和计时模块传来的信号进行译码,输出到数码管,实现计分和计时的显示。
三、仿真波形及波形分析
3.1分频器模块
clk:
50MHz的时钟信号
clk_1Hz:
1Hz的时钟信号
clk_500Hz:
500Hz的时钟信号
reset:
复位信号
波形分析:
为便于仿真,这里clk使用的是周期为1us的信号,clk_500Hz为clk的10分频信号,clk_1Hz为clk_1Hz的6分频信号。
实际中的分频器是先将50MHz信号进行100000分频,得到500Hz信号,再对500Hz信号进行500分频得到1Hz信号。
3.2随机数产生模块
500Hz时钟信号
num:
4位二进制随机数
score:
得分信号
1.通过12个自制D触发器的连接及其中4位的异或,产生12位的二进制随机数,从中取出4位作为地鼠位置的随机数。
2.通过计500Hz信号1000次,从而控制地鼠持续2秒。
3.只要打中地鼠,即接收到得分的脉冲信号,立即产生新的随机数。
3.3防抖模块
keyin:
键盘输入信号
keyout:
键盘输出信号
当输入信号持续时间小于6个时钟周期(即12ms)时,视为抖动不输出。
当信号持续时间多于6个时钟周期时,视为正常按键,输出。
3.4点阵显示模块
图一
图二
图三
col:
点阵的列
failed:
失败信号
地鼠位置
raw:
点阵的行
win:
胜利信号
1.游戏正常进行时,点阵根据num显示地鼠位置,如图一,num为0001,点阵在第0行,第1列显示地鼠,显示6*6的游戏边界。
2.游戏胜利时,如图二,点阵根据win信号显示绿色‘V’。
3.游戏失败时,如图三,点阵根据failed信号显示红色‘X’。
3.5键盘控制模块
键盘的列
键盘的行
为便于仿真,将第3行的按键全部按下。
当地鼠位置为12时,地鼠处在第3行和第0行的位置,此时扫描键盘第0列,得到匹配行信号,证明打到地鼠,输出score信号。
以此类推,同行的14,13,15也输出score信号。
3.6计分模块
gewei:
计分模块的个位
scoreover:
得到10分的信号
shiwei:
计分模块的十位
每接收一个得分信号,个位加一分,直到记到10分,进位,十位变1,个位变0,。
同时输出scoreover信号,代表计到10分。
3.7计时模块
计时的个位
计时的十位
timeover:
游戏时间结束信号
复位后,十位的预制值为6,个位的预制值为0,每过一秒个位减一。
当个位十位都为0时,输出timeover信号,表示游戏时间结束。
3.8译码器模块
cat:
数码管扫描信号
in_score_0:
得分的个位
in_score_1:
得分的十位
in_time_0:
in_time_1:
output:
数码管七段显示信号
Cat从111110到110111循环,4个数码管被循环点亮,如图所示,这4个数码管分别对应得分的个位,得分的十位,时间的个位,时间的十位。
四、源程序
4.1分频器模块
libraryieee;
useieee.std_logic_1164.all;
entityfenpinqiis
port(
clk:
instd_logic;
--时钟输入
reset:
--复位信号
clk_1Hz:
outstd_logic;
--1Hz输出
clk_500Hz:
outstd_logic--500Hz输出
);
endfenpinqi;
architectureaoffenpinqiis
signalclk_500Hz_tmp:
std_logic;
signalclk_1Hz_tmp:
std_logic;
signalcount1:
integerrange0to49999;
signalcount2:
integerrange0to249;
begin
process(clk)
begin
ifreset='
0'
then
clk_500Hz_tmp<
='
;
count1<
=0;
else
if(clk'
eventANDclk='
1'
)then
ifcount1=49999then
=notclk_500Hz_tmp;
else
=count1+1;
endif;
endprocess;
clk_500Hz<
=clk_500Hz_tmp;
--将50M做100000分频得到500Hz
process(clk_500Hz_tmp)
clk_1Hz_tmp<
count2<
if(clk_500Hz_tmp'
eventANDclk_500Hz_tmp='
ifcount2=249then
=notclk_1Hz_tmp;
=count2+1;
clk_1Hz<
=clk_1Hz_tmp;
--将500Hz做500分频得到1Hz
enda;
4.2随机数产生模块
useieee.std_logic_arith.all;
ENTITYsjssIS
PORT(
INSTD_LOGIC;