数字电路实验打地鼠游戏设计与实现.docx
- 文档编号:3984709
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:23
- 大小:128.22KB
数字电路实验打地鼠游戏设计与实现.docx
《数字电路实验打地鼠游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《数字电路实验打地鼠游戏设计与实现.docx(23页珍藏版)》请在冰豆网上搜索。
数字电路实验打地鼠游戏设计与实现
信息与通信工程学院
数字电路实验报告
题目:
打地鼠游戏的设计与实现
姓名:
班级:
学号:
班内序号:
指导教师:
实验日期:
一、设计课题的任务与要求………………………………………………………03
二、系统设计………………………………………………………………………3
2.1设计思路………………………………………………………………03
2.2总体框图………………………………………………………………03
2.3分块设计………………………………………………………………03
三、仿真波形及波形分析…………………………………………………………4
3.1分频器…………………………………………………………………04
3.2随机数产生模块………………………………………………………04
3.3防抖模块………………………………………………………………05
3.4点阵显示模块…………………………………………………………05
3.5键盘控制模块…………………………………………………………06
3.6计分模块………………………………………………………………06
3.7计时模块………………………………………………………………06
3.8译码器模块……………………………………………………………07
四、源程序…………………………………………………………………………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随机数产生模块
clk:
500Hz时钟信号
num:
4位二进制随机数
score:
得分信号
波形分析:
1.通过12个自制D触发器的连接及其中4位的异或,产生12位的二进制随机数,从中取出4位作为地鼠位置的随机数。
2.通过计500Hz信号1000次,从而控制地鼠持续2秒。
3.只要打中地鼠,即接收到得分的脉冲信号,立即产生新的随机数。
3.3防抖模块
clk:
500Hz时钟信号
keyin:
键盘输入信号
keyout:
键盘输出信号
reset:
复位信号
波形分析:
当输入信号持续时间小于6个时钟周期(即12ms)时,视为抖动不输出。
当信号持续时间多于6个时钟周期时,视为正常按键,输出。
3.4点阵显示模块
图一
图二
图三
clk:
500Hz时钟信号
col:
点阵的列
failed:
失败信号
num:
地鼠位置
raw:
点阵的行
reset:
复位信号
win:
胜利信号
波形分析:
1.游戏正常进行时,点阵根据num显示地鼠位置,如图一,num为0001,点阵在第0行,第1列显示地鼠,显示6*6的游戏边界。
2.游戏胜利时,如图二,点阵根据win信号显示绿色‘V’。
3.游戏失败时,如图三,点阵根据failed信号显示红色‘X’。
3.5键盘控制模块
clk:
500Hz时钟信号
col:
键盘的列
num:
地鼠位置
raw:
键盘的行
score:
得分信号
波形分析:
为便于仿真,将第3行的按键全部按下。
当地鼠位置为12时,地鼠处在第3行和第0行的位置,此时扫描键盘第0列,得到匹配行信号,证明打到地鼠,输出score信号。
以此类推,同行的14,13,15也输出score信号。
3.6计分模块
gewei:
计分模块的个位
reset:
复位信号
score:
得分信号
scoreover:
得到10分的信号
shiwei:
计分模块的十位
波形分析:
每接收一个得分信号,个位加一分,直到记到10分,进位,十位变1,个位变0,。
同时输出scoreover信号,代表计到10分。
3.7计时模块
clk:
1Hz的时钟信号
gewei:
计时的个位
reset:
复位信号
shiwei:
计时的十位
timeover:
游戏时间结束信号
波形分析:
复位后,十位的预制值为6,个位的预制值为0,每过一秒个位减一。
当个位十位都为0时,输出timeover信号,表示游戏时间结束。
3.8译码器模块
cat:
数码管扫描信号
clk:
500Hz的时钟信号
in_score_0:
得分的个位
in_score_1:
得分的十位
in_time_0:
计时的个位
in_time_1:
计时的十位
output:
数码管七段显示信号
reset:
复位信号
波形分析:
Cat从111110到110111循环,4个数码管被循环点亮,如图所示,这4个数码管分别对应得分的个位,得分的十位,时间的个位,时间的十位。
四、源程序
4.1分频器模块
libraryieee;
useieee.std_logic_1164.all;
entityfenpinqiis
port(
clk:
instd_logic;--时钟输入
reset:
instd_logic;--复位信号
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<='0';
count1<=0;
else
if(clk'eventANDclk='1')then
ifcount1=49999then
clk_500Hz_tmp<=notclk_500Hz_tmp;
count1<=0;
else
count1<=count1+1;
endif;
endif;
endif;
endprocess;
clk_500Hz<=clk_500Hz_tmp;--将50M做100000分频得到500Hz
process(clk_500Hz_tmp)
begin
ifreset='0'then
clk_1Hz_tmp<='0';
count2<=0;
else
if(clk_500Hz_tmp'eventANDclk_500Hz_tmp='1')then
ifcount2=249then
clk_1Hz_tmp<=notclk_1Hz_tmp;
count2<=0;
else
count2<=count2+1;
endif;
endif;
endif;
endprocess;
clk_1Hz<=clk_1Hz_tmp;--将500Hz做500分频得到1Hz
enda;
4.2随机数产生模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
ENTITYsjssIS
PORT(
clk_500Hz:
INSTD_LOGIC;--时钟输入
reset:
INSTD_LOGIC;--复位信号
nowscore:
INintegerrange0to9;--当前分数
D:
OUTstd_logic_vector(4DOWNTO0);--数据输出
score:
INSTD_LOGIC--加分信号
);
ENDsjss;
ARCHITECTUREaOFsjssIS
SIGNALfeedback0:
STD_LOGIC;
SIGNALclk_500Hz0:
STD_LOGIC;
SIGNALrandom_reg0:
std_logic_vector(4DOWNTO0);
SIGNALcount2_0:
std_logic_vector(4DOWNTO0);
SIGNALscore_old0:
STD_LOGIC;
BEGIN
feedback0<=random_reg0(4)xorrandom_reg0(0);--将random_reg0第4位与第1为异或赋给种子feedback0
clk_500Hz0<=clk_500Hz;
p1:
PROCESS(clk_500Hz0,reset,nowscore)
variablecount1:
integerrange0to999;--计数1000,输出持续时间达到2s
BEGIN
ifnowscore=0ornowscore=1then
IF(reset='0')THEN
random_reg0<=(OTHERS=>'1');
ELSE
IF(clk_500Hz0='1'ANDclk_500Hz0'event)THEN
random_reg0<=random_reg0(random_reg0'high-1downto0)&feedback0;random_reg0--将后三位与种子feedback进行合并
ifscore='1'then
ifscore_old0='0'then
count1:
=999;--加分信号上升沿到来时,更改随机数
endif;
endif;
score_old0<=score;
ifreset='0'then
count1:
=0;
else
ifcount1=999then--2s计时时间到,更换随机数
count1:
=0;
count2_0<=random_reg0;
else
count1:
=count1+1;
endif;
endif;
endif;
endif;
endif;
endprocess;
enda;
4.3防抖模块
libraryIEEE;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityfangdouis
port(
clk,reset:
instd_logic;--时钟信号与复位信号
keyin:
instd_logic_vector(3downto0);--键盘输入信号
keyout:
outstd_logic_vector(3downto0)--键盘输入信号
);
endfangdou;
architectureaoffangdouis
begin
process(clk,reset,keyin)
variablecount:
integerrange0to7;
begin
if(reset='0')then
count:
=0;
keyout<="1111";
elsif(clk'eventANDclk='1')then
ifcount=7then--按键时间超过六个时钟周期,则输出
count:
=0;
casekeyinis
when"1110"=>keyout<="1110";
when"1101"=>keyout<="1101";
when"1011"=>keyout<="1011";
when"0111"=>keyout<="0111";
whenothers=>keyout<="1111";
endcase;
else
ifkeyin/="1111"then
count:
=count+1;
else
count:
=0;
keyout<="1111";
endif;
endif;
endif;
endprocess;
enda;
4.4点阵显示模块
libraryieee;
useieee.std_logic_1164.all;
entitydisplayis
port(
clk:
instd_logic;
display_raw:
outstd_logic_vector(7downto0);--点阵的行
display_col:
outstd_logic_vector(0to9);--点阵的列
num_raw:
inintegerrange0to3;--地鼠的行坐标
num_col:
inintegerrange0to3;--地鼠的列坐标
win:
instd_logic;--胜利信号
failed:
instd_logic;--失败信号
reset:
instd_logic--复位信号
);
enddisplay;
architectureaofdisplayis
TYPEmouse_arrayisArray(3downto0)ofstd_logic_vector(0to3);
signalmouse:
mouse_array;
begin
process(clk)
variablecount:
integerrange0to5;
begin
ifreset='0'then
count:
=5;
display_col<="0000000000";
display_raw<="00000000";
else
if(clk'eventANDclk='1')then
ifcount=5then
count:
=0;
else
count:
=count+1;
endif;
endif;
foriin0to3loop
mouse(i)<="0000";
endloop;--循环赋值,将整个点阵置‘0’
mouse(num_raw)(num_col)<='1';--将地鼠所在位置置‘1’
casecountis
when0=>display_col<="1111110000";display_raw<="10111111";
when1=>display_col<="100001"&mouse(3);
display_raw<="11011111";
when2=>display_col<="100001"&mouse
(2);
display_raw<="11101111";
when3=>display_col<="100001"&mouse
(1);
display_raw<="11110111";
when4=>display_col<="100001"&mouse(0);
display_raw<="11111011";
when5=>display_col<="1111110000";display_raw<="11111101";
whenothers=>display_col<="0000000000";display_raw<="00000000";
endcase;
ifwin='1'then
casecountis
when0=>display_col<="0000000000";display_raw<="10111111";
when1=>display_col<="1000010000";display_raw<="11011111";
when2=>display_col<="1000010000";display_raw<="11101111";
when3=>display_col<="0100100000";display_raw<="11110111";
when4=>display_col<="0011000000";display_raw<="11111011";
when5=>display_col<="0000000000";display_raw<="11111101";
whenothers=>display_col<="0000000000";display_raw<="00000000";
endcase;
endif;--胜利显示绿色‘V’
iffailed='1'ANDwin='0'then
casecountis
when0=>display_col<="0000000000";display_raw<="10111111";
when1=>display_col<="0000001001";display_raw<="11011111";
when2=>display_col<="0000000110";display_raw<="11101111";
when3=>display_col<="0000000110";display_raw<="11110111";
when4=>display_col<="0000001001";display_raw<="11111011";
when5=>display_col<="0000000000";display_raw<="11111101";
whenothers=>display_col<="0000000000";display_raw<="00000000";
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字电路 实验 地鼠 游戏 设计 实现