第 1 页
可编程逻辑实验之打地鼠游戏报告
目录
一、设计任务与要求·······························3
二、总体框图··································3
2.1 总体框图·······························3
2.2 设计思路及各模块功能·······················3
2.2.1 设计思路····························3
第 2 页
2.2.2 各模块功能···························4
三、模块功能实现·······························4
3.1 分频器模块······························4
3.2 伪随机数产生模块······························5
3.3 点阵扫描模块······························6
3.4 按键去抖模块·····························10
3.5 计分模块······························11
3.6 状态机模块·····························13
3.7 数码管显示模块·······························14
四、仿真图 ······························ 15
五、实物图 ······························ 17
六、游戏说明书·······························18
6.1 前言·································18
6.2 运行说明·······························18
6.3 评分规则·······························18
七、心得体会······················································18
第 3 页
一、 设计目标
利用 16×16 的点阵,设计一个挑战反应速度的“打地鼠”游戏机。目标:地
鼠比较随机的出现在点阵设置好的格子里,以按键代表锤子,击中地鼠,一旦
击中,数码管计分器分数增加。按复位键重新开始游戏。
二、 总体框图
2.1、打地鼠游戏机的总体框图如下图一所示:
图一:设计总体框图
2.2 设计思路及各模块功能
2.2.1 设计思路
通过产生伪随机数在点阵上随机出现地鼠(实际标志为一个“十”字)(实
际效果显示为 2×4 总共八个地鼠产生的位置),八个按键对应八只地鼠的位
置,然后当地鼠出现的时候,按下正确的按键位置,则能加一分,按错不加
第 4 页
分。当满 7 分就通关,重新回到游戏初始显示 GO 字样的界面,Reset 键直接
将界面复位至初始界面。为了增加一些难度,我的按键和对应的地鼠位置恰好
是上下颠倒了,增加趣味性。时钟是把 24M 的基频分成 5 赫兹按键扫描信
号、1 赫兹随机数产生信号、1200 赫兹的点阵扫描信号。
2.2.2 各模块功能介绍:
——分频器模块
把 24M 的基频分成 5HZ 按键扫描信号、1HZ 随机数产生信号、1200HZ
的点阵扫描信号。
——伪随机数产生模块
以 1HZ 的频率产生伪随机数,使得地鼠出现位置随机。
——点阵扫描模块
在 1200HZ 时钟信号下,根据当前状态不断刷新显示点阵。
——按键去抖模块
由于按键会产生抖动,因此采用一个时钟频率为 5HZ 的 D 触发器来消除
按键抖动
——计分模块
接收来自键盘控制模块的信号,正确一次加一分。
——状态机模块
八个地鼠出现的位置对应八个状态,加上初始状态,一共九个状态,通过
这个模块实现状态的变化。
——数码管显示模块
通过数码管,将计分模块的计分结果显示出来。
第 5 页
三:模块功能实现
由于我一开始想尝试一个文件写很多进程,因此我把除了按键去抖模块是
写在另一个文件之外,其余的都是写在一个文件里面,因此我每个模块的代码
只是一部分。
3.1 分频器模块
把 24M 的基频分成 5HZ 按键扫描信号、1HZ 随机数产生信号、1200HZ
的点阵扫描信号。对应的部分代码如下:
signal smclk: std_logic;--点阵扫描的时钟频率
signal Rm_clk: std_logic;--随机数产生的时钟频率
signal key_clk: std_logic;--按键去抖的时钟频率
process(clock)--分频产生按键扫描的时钟信号
variable key_timer :integer range 0 to 2400000;
begin
if rising_edge(clock) then
if (key_timer=2400000) then
key_timer:=0; key_clk<=not key_clk;--产生 5 赫兹的
时钟频率扫描
else key_timer:=key_timer+1;
end if;
end if;
end process;
process(clock)--分频产生随机数的时钟信号
variable Rm_timer :integer range 0 to 12000000;
begin
if rising_edge(clock) then
if (Rm_timer=12000000) then
Rm_timer:=0; Rm_clk<=not Rm_clk;--频率是 1 赫兹
else Rm_timer:=Rm_timer+1;
end if;
end if;
end process;
process(clock)--分频产生点阵扫描的时钟
variable timer :integer range 0 to 10000;
begin
if rising_edge(clock) then