北邮数电实验打地鼠游戏的设计与实现实验报告.docx

上传人:b****8 文档编号:11034714 上传时间:2023-02-24 格式:DOCX 页数:42 大小:829.90KB
下载 相关 举报
北邮数电实验打地鼠游戏的设计与实现实验报告.docx_第1页
第1页 / 共42页
北邮数电实验打地鼠游戏的设计与实现实验报告.docx_第2页
第2页 / 共42页
北邮数电实验打地鼠游戏的设计与实现实验报告.docx_第3页
第3页 / 共42页
北邮数电实验打地鼠游戏的设计与实现实验报告.docx_第4页
第4页 / 共42页
北邮数电实验打地鼠游戏的设计与实现实验报告.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

北邮数电实验打地鼠游戏的设计与实现实验报告.docx

《北邮数电实验打地鼠游戏的设计与实现实验报告.docx》由会员分享,可在线阅读,更多相关《北邮数电实验打地鼠游戏的设计与实现实验报告.docx(42页珍藏版)》请在冰豆网上搜索。

北邮数电实验打地鼠游戏的设计与实现实验报告.docx

北邮数电实验打地鼠游戏的设计与实现实验报告

 

数字电路与逻辑设计实验(下)

实验报告

 

课题名称:

打地鼠游戏的设计与实现

学院:

电子工程学院

班级:

2013211202

姓名:

学号:

 

 

一.设计课题及任务要求

1.课题名称:

打地鼠游戏的设计及实现

2.任务要求:

1)设计“打地鼠”游戏,采用8X8双色点阵显示游戏界面,其中游戏边界采用绿色LED显示,随机出现的地鼠采用红色LED显示,游戏有十六个洞穴。

2)洞穴每次随机出现一个地鼠,每个地鼠最长保持时间为2秒,2秒后随机出现下一个地鼠,以4x4键盘的按键代表锤子,16个洞穴对应16个锤子,一旦锤子在2秒内击中地鼠,则地鼠消失,数码管计分器加1分,若锤子没有击中地鼠,则两秒后地鼠消失,用两个数码管显示游戏成绩,成绩到达10分时,游戏结束,点阵显示“V”。

3)用两个数码管对整个游戏进行倒计时,当游戏超过59秒而成绩未达到10分时,游戏失败,点阵显示“X”。

4)按复位键重新开始游戏,并开始倒计时。

二.系统设计

1.设计思路:

采用自顶向下的设计原则。

首先对游戏的状态进行判断,整个游戏共应该有四种状态,重置状态,游戏状态,游戏成功状态,游戏失败状态。

然后由这四种状态对其他模块进行控制。

所以控制模块置于整体框图的中心,然后再考虑这四个状态分别由什么输入控制。

·重置状态:

当拨动开关置高电平时,整个游戏进行重置,此时计分数码管应该有计分的初始显示,即00分,点阵显示重置画面,而计时的数码管置数60准备开始倒计时,当拨动开关置低电平时,游戏正式开始,转入游戏状态。

·游戏状态:

此时计分数码管计分,倒计时数码管进行倒计时,点阵显示游戏界面,即6x6的绿色边界以及一个随机出现的红色地鼠。

若在倒计时结束之前,计分数码管显示10分,则转入游戏成功状态,若倒计时结束时,尚未达到十分,则转入游戏失败状态。

·游戏成功状态:

此时倒计时数码管停止计时,计分数码管显示10分,点阵显示绿色“V”。

·游戏失败状态:

此时倒计时数码管和计分数码管不再继续工作,而点阵显示红色“X”。

2.整体分析:

综上分析以及结合实际,得出整个工程大致需要的模块为:

分频模块、倒计时模块、计分模块、数码管显示模块、点阵显示模块、状态控制模块、随机地鼠生成模块、键盘输出模块。

3.整体设计框图:

三.分模块设计

1.分频模块设计

1)需求分析:

整个工程共需要四个频率,地鼠出现的频率为2秒一个,即需要一个0.5Hz的频率,而倒计时一秒减小一个十进制数,所以需要一个1HZ的频率,数码管的扫频和点阵的扫频为1000Hz,键盘防抖模块的扫频为100Hz,所以我采用级联分频的方式,将实验室25MHz的频率先通过25000倍分频分为1000Hz,再将1000Hz频率十分频分为100Hz,再将100Hz一百分频为1Hz,再讲1Hz频率分为0.5Hz。

2)模块代码:

3)模块仿真波形

为减少仿真时长,仿真时将分频系数依次调为2,3,4,实现分频依次为3分频,4分频,5分频。

仿真波形如图所示,可由仿真波形看出分频模块实现分频功能。

2.倒计时模块:

1)功能分析:

倒计时模块由状态控制模块控制。

重置状态时,进行置数60,游戏状态时,进行减计数,输出分为高位和低位,由上升沿出发,每个上升沿,个位数减一,个位数减至0时,个位数变成9,十位数减一。

然后高位和低位进行七段数码管译码输出,设立一个计时结束标识,以反馈控制状态,当个位十位都为0时,倒计时结束,flag=1,否则,flag=0。

2)模块代码:

entitycounteris--实体定义

port(clk:

instd_logic;

c_state:

instd_logic_vector(1downto0);

nixie_1:

outstd_logic_vector(7downto0);--高位译码输出

nixie_2:

outstd_logic_vector(7downto0);--地位译码输出

gameover:

outstd_logic--计时结束flag

);

endcounter;

architecturecounter_1ofcounteris

signalcount_d:

integerrange0to6;--十位信号

signalcount_o:

integerrange0to9;--个位信号

begin

counting:

--倒计时进程

process(clk)

begin

if(c_state="00")then—重置状态置数60

count_d<=6;

count_o<=0;

gameover<='0';--flag置0

elsif(c_state="01")then

if(clk'eventandclk='1')then

if(count_d=0andcount_o=0)then

gameover<='1';

elsif(count_o=0)then—地位为0,高位减一,低位变9

count_d<=count_d-1;

count_o<=9;

else

count_o<=count_o-1;

endif;

endif;

endif;

endprocess;

nixie_present:

--译码输出进程

process(count_d,count_o)

begin

if(c_state="00")then–重置状态译码显示全灭

nixie_1<="00000000";

nixie_2<="00000000";

elsif(c_state="10"orc_state="11")then—游戏结束八段全亮

nixie_1<="11111111";

nixie_2<="11111111";

elsif(c_state="01")then—游戏状态显示十进制倒计时计数

casecount_dis

when6=>nixie_1<="01111101";--高位译码

when5=>nixie_1<="01101101";

when4=>nixie_1<="01100110";

when3=>nixie_1<="01001111";

when2=>nixie_1<="01011011";

when1=>nixie_1<="00000110";

when0=>nixie_1<="00111111";

whenothers=>nixie_1<="00000000";

endcase;

casecount_ois

when9=>nixie_2<="01101111";--低位译码

when8=>nixie_2<="01111111";

when7=>nixie_2<="00000111";

when6=>nixie_2<="01111101";

when5=>nixie_2<="01101101";

when4=>nixie_2<="01100110";

when3=>nixie_2<="01001111";

when2=>nixie_2<="01011011";

when1=>nixie_2<="00000110";

when0=>nixie_2<="00111111";

whenothers=>nixie_2<="00000000";

endcase;

elsenull;

endif;

endprocess;

endcounter_1;

3)模块仿真

·重置状态下,高位输出6,由数码管译码输出可以看出高位输出正确。

·重置状态下,计时低位输出0。

·游戏失败时,计时低位输出为全亮

·游戏进行中,低位每遇到一个时钟上升沿就自减1译码输出,仿真波形中游戏状态持续的时间只有五个时钟周期,所以显示低位变换了五次,而高位没有变换,仿真实现功能。

然后看state=10状态,即游戏成功时候,译码管输出显示全亮,即停止计时。

当游戏进行到失败状态时,flag置1。

由仿真波形可以看出,状态控制模块控制倒计时模块的功能得以实现。

3.计分模块

1)功能分析:

计分模块由状态控制模块控制,输出反馈控制状态。

重置状态,计分数码管置零。

游戏状态,当锤子敲中地鼠,计分加一,计分加至十时,反馈输出为1,控制状态模块将状态转换为游戏成功模块。

时间结束时,计分不够十,反馈输出为0,结合倒计时模块的计分输出反馈为1,共同控制状态模块将状态转换为游戏失败状态。

计分模块由三部分组成,分别是判断是否得分模快,该模块将地鼠位置坐标与键盘坐标进行比较,当坐标吻合,即击中地鼠时,输出高电平,否则输出低电平,输出为一个由高低电平组成的脉冲。

其次是得分计数模块,得分计数模块的输入信号为判断模块的输出信号,在游戏状态时,当有高电平输入时,计分加一,当没有高电平输入时,计分不变,同时设立一个输出flag,作为状态转换的反馈输入信号,当计分为十,则输出1,将状态转为游戏成功态,当计分不足十时,输出0,继续游戏或游戏失败。

其次是显示模块,将计分的分数译码输出在数码管上显示。

2)模块代码:

·判断模块

·得分计数模块

·显示输出模块

3)模块仿真

·重置状态计分显示为00,flag=0

·游戏状态,判断击中输出一次高电平,计分输出加1,flag=0

·成功状态,flag=1,计分不变

·游戏失败状态,flag=0,计分结束

·显示模块仿真,成功实现译码功能。

由计分模块(含判断模块,得分模块,显示模块)的仿真波形可以看出,计分模块实现由不同状态控制不同计分模块的功能,在数码管上成功译码显示,并且输出flag反馈控制状态,计分模块功能得到实现。

 

4.数码管控制模块

1)功能分析:

由题目要求可知,需要在实验板上显示4个数字,其中两个管子显示得分,两个管子显示倒计时。

但由于七段数码管一次只能显示一个,所以需要一个高频的扫描控制,依次点亮每个数码管,然后利用视觉暂留的效果,使得看起来有四个数码管同时点亮。

在此设置第一二个数码管为计分显示,第三四个数码管为倒计时显示。

该模块较小,由信号控制写在顶层文件中,不单独再写一个文件模块。

2)模块代码:

nixie_scan:

process(link_clk_1kh)—用顶层文件定义的信号来传递

begin

if(link_clk_1kh'eventandlink_clk_1kh='1')then--1kHZ--时钟进行扫描

caselink_out_scan_nixieis

when"011111"=>link_out_scan_nixie<="101111";out_nixie<=out_point_nixie_2;

--第二个数码管显示计分地位

when"101111"=>link_out_scan_nixie<="110111";out_nixie<=nixie_tube_1;

--第三个数码管显示计时高位

when"110111"=>link_out_scan_nixie<="111011";out_nixie<=nixie_tube_2;

--第四个数码管显示计时低位

when"111011"=>link_out_scan_nixie<="011111";out_nixie<=out_point_nixie_1;

--第一个数码管显示计分高位

whenothers=>link_out_scan_nixie<="011111";out_nixie<=out_point_nixie_1;

endcase;

endif;

endprocess;

5.控制模块

1)功能分析:

该模块主要实现状态转换状态,由之前的分析可以看出整体工程的点阵显示模块,计分模块和倒计时模块均受状态的控制,而状态的判断又由计分模块和倒计时模块的反馈输出共同控制。

计分/倒计时

Reset=1

1/0or1/1

0/1

0/0

状态编号

00

10

11

01

状态

重置

游戏成功

游戏失败

游戏进行状态

2)模块代码

3)模块仿真

由仿真波形可以看出当reset=1时,state输出为00;

当reset=0时,由计时反馈和计分反馈决定状态的转换

计时为1,计分为0时,state输出为11,代表游戏失败。

计时为1,计分为1时,state输出为10,代表游戏成功。

计时为0,计分为0时,state输出为01,代表游戏进行中。

计时为0,计分为1时,state输出为10,代表游戏成功。

由该模块的仿真波形可以看出,该模块实现状态控制功能。

 

6.随机地鼠生成模块

1)功能分析:

该模块需要满足最多两秒内产生一个地鼠,当地鼠被击中时,被击中的地鼠消失,在新的地方生成新的地鼠,所以此处设置一个信号new,将得分信号与2秒的时钟信号进行异或,然后通过new信号的上升沿生成新的随机序列,随机序列为7downto0的一组向量,由倒数两位随机决定地鼠坐标的行输出,由倒数三四位决定地鼠列坐标的输出。

需要实现的效果是得分后,即地鼠被击中后,便产生一个新的地鼠,而地鼠未被击中时,上升沿由2秒时钟信号触发,即两秒生成一个新的地鼠。

同样,该模块同样受到状态的控制。

当重置状态时,初始序列设为10011010。

游戏进行状态时,则根据上述判断产生新的地鼠。

2)模块代码

entityr_series_generatoris

port(

r_state:

instd_logic_vector(1downto0);--状态控制

clk:

instd_logic;--1秒的时钟信号输入

catch:

instd_logic;--得分信号脉冲输入

row_out:

outstd_logic_vector(3downto0);--地鼠坐标行输出

column_out:

outstd_logic_vector(3downto0));--地鼠坐标列输出

endr_series_generator;

architecturebehavioralofr_series_generatoris

signalr_series:

std_logic_vector(7downto0);--随机序列

signalmice_time:

std_logic;--2秒的时钟信号

signaltrick:

std_logic;--判断是否被击中的信号

begin

mouse_time:

process(clk)--将1秒的时钟信号分频为2秒的时钟信号

begin

if(clk'eventandclk='1')then

if(mice_time='1')then

mice_time<='0';

elsif(mice_time='0')then

mice_time<='1';

elsemice_time<='0';

endif;

endif;

endprocess;

trick<=mice_timexorcatch;--设立该信号对击中进行判断

series_generate:

--生成随机序列

process(trick)

begin

if(r_state="00")then--游戏一旦被重置,随机序列进行初始

r_series<="10011010";

elsif(r_state="01")then--游戏状态,由得分信号的上升沿触发新的地鼠

if(trick'eventandtrick='1')then--由标识的上升沿进行触发

r_series<=r_series(6downto0)&(r_series(0)xorr_series(7));--随机序列的产生

endif;

endif;

output_r:

--随机坐标输出序列

process(r_series)--通过随机序列随机变换的后四位随机坐标

begin

caser_series(1downto0)is--后两位随机行坐标

when"00"=>row_out<="0001";

when"01"=>row_out<="0010";

when"10"=>row_out<="0100";

when"11"=>row_out<="1000";

whenothers=>row_out<="0000";

endcase;

caser_series(3downto2)is--倒数三四位随机列坐标

when"00"=>column_out<="0001";

when"01"=>column_out<="0010";

when"10"=>column_out<="0100";

when"11"=>column_out<="1000";

whenothers=>column_out<="0000";

endcase;

endprocess;

endbehavioral;

3)模块仿真:

·在重置状态下,随机序列初始化,此时行列输出值固定都0100

·游戏进行状态中,随机序列由输入时钟信号和捕捉信号异或后得到的信号触发,产生随机输出

由仿真波形可以看到该模块的功能得以实现。

7.点阵显示模块

1)功能分析:

同样,由整机的状态来设计各个状态下点阵的显示界面

重置状态,设计开机画面,开机时点阵显示笑脸。

游戏进行状态,显示游戏画面,即绿色6X6边界,中间闪烁一个随机出现的地鼠。

游戏成功状态,显示胜利画面,绿色字母“V”。

游戏失败状态,显示失败画面,红色字母“X”。

2)点阵显示原理:

原理图:

实验室使用的点阵为共阴点阵,当A行电平输入为0,B列电平输入为1时。

对应的A行B列处的点被点亮,实验室使用的点阵为双色点阵,当输出的列为red时,点亮红色的点,当输出的列为green时,点亮绿色的点,当红绿同时输出,则显示橙色。

由于要显示的画满并不只是几个行列不交叠的点,而是复杂的图案,所以选择行扫描的方式对点阵进行显示,行不断用高频信号进行逐行扫描(此处用1KHZ),利用人眼的视觉暂留,只要周期足够小,看起来就像是一个稳定的图案。

而且采用逐行扫描远比逐点扫描占用FPGA资源要少。

3)模块代码:

·实体定义部分

·开机画面显示

通过行扫描实现—重置状态

·游戏进行界面显示

·游戏胜利状态显示

·游戏失败模块

4)模块仿真

·重置状态。

行输出显示为逐行扫描,列输出逐行对应一个输出向量组,组成一个笑脸图形。

·游戏状态,红色列输出由地鼠的随机坐标控制,逐行扫描,只有一个点亮,即红色的随机地鼠。

实现随机地鼠的显示

·游戏状态,绿色列输出。

在游戏状态下,通过逐行扫描,对应列输出6*6绿色边界。

·游戏成功状态,绿色列输出,显示“v”。

·游戏失败状态,红色列输出,显示“X”。

由该模块的仿真可以看出,在各个状态,模块实现对应功能。

 

8.键盘模块

1)功能分析:

该模块由两个部分组成,其一为键盘消抖模块,其二为按键确定模块。

2)原理分析

·键盘消抖:

通常开关为机械开关,断开或闭合时,由于机械触点的弹性作用,在闭合和断开的瞬间有一连串的抖动,为了消除其带来的影响而进行消抖模块的设置。

·按键确定模块:

为了实现判断按键的位置,以便进一步判断键盘坐标与地鼠坐标是否对应,以输出得分脉冲给计分模块。

所以判断按键位置使一步非常重要的步骤,按键的确定和点阵的显示原理有着相似之处,均是逐行或逐列扫描,以确定具体坐标,此处我采用的是键盘列扫描,即通过时钟信号让列的低电平逐行变化,当有行坐标输入为低电平时,确定行与列的输出,假设第一行电平为0,则规定行输出为1110,而列输出即为当时的扫描列坐标,通过这样的方式将按键按位置转换为一个二维数组输出。

然后将确定的坐标输入到消抖模块中进行消抖,消抖后输出的坐标为最终按键坐标,输入判断得分模块与地鼠坐标进行比较。

键盘扫描原理图:

当行和列的电平均为0时,判断为该行该列的按键被按下,即可确定按键坐标。

3)模块代码:

·判断模块

·消抖模块代码

4)模块仿真

·消抖模块

·逐列扫描,列输出

在行输入为1110时,即判断出是第4行被按下时,输出行坐标为0001,输出列坐标为当前的列坐标,取反输出是为了在得分判断模块与地鼠的坐标对应,因为地鼠坐标里面只有一个高电平,而键盘坐标却只有一个低电平,所以将键盘坐标取反。

在航输入为1111时,即没有任何一行的按键被按下时,列坐标输出显示1111,行坐标输出为0000(1111取反)。

由仿真波形可以看出按键判断模块实现了该模块的需求。

9.总体模块

1)元件实例连接分析

写完各个模块之后,需要用信号来实现将各个模块连接在一起。

各个模块在顶层文件中相互控制,通过反馈和加计数等方式实现整个工程的总体功能。

我采用的是元件实例化的方式,让各个分模块在总工程里各司其职。

内部用信号进行间接。

具体逻辑为:

·分频模块的三个级联输出分别为1khz,100hz,1hz,将1khz接入点阵的扫描模块的输入,将100hz的输出接入键盘模块的扫描和防抖模块,将1hz的输出接入倒计时模块和随机地鼠生成模块,再在随机地鼠模块内部进行一次分频,将1hz分为0.5hz。

分频模块的输入为实验板的晶振输入。

·倒计时模块的输入接1Hz的分频和状态控制模块的输出,由状态模块的输出控制倒计时模块的工作。

两个输出端为数码管显示输出和游戏结束标识,两个七段数码管显示输出接入顶层文件中的数码管显示模块,通过数码管显示,游戏结束标识输出接入状态控制模块,对状态模块进行反馈控制。

·计分模块的输入为得分脉冲输入和状态输入,得分脉冲由判断模块输出,即打中就输出高电平形成脉冲在得分模块进行累加。

计分模块的输出为累加的分数输出和游戏结束标识,得分输出模块输入进得分显示模块译码转换为七段数码管输出,再输入到顶层文件的数码管扫描模块进行输出。

计分模块的另一输出为游戏结束标识,输入到游戏状态控制模块对状态进行反馈控制。

·数码管控制模块,数码管控制模块置于顶层文件内部,负责将得分和计时通过扫描和视觉暂留的效果同时显示在四只数码管上。

·控制模块的输出只有一个端口,是一个1downto0的向量组,代表四种不同的状态,分别输入进随机地鼠生成模块,点阵显示模块,倒计时模块,计分模块,通过四种状态分别控制上述模块进行工作。

而控制模块的输入为复位键输入和计时模块输出的倒计时结束标识

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1