课程名称:数字系统与课程设计
实验名称:打地鼠VHDL的实现
院系:吴健雄学院
学号:61006209
姓名:邵明驰
目录
1. 课题介绍----------------------------------------------------------------------------3
2. 具体实施方案----------------------------------------------------------------------3
3. 面板图--------------------------------------------------------------------------------3
4. 系统结构图--------------------------------------------------------------------------4
5. 状态流程图-------------------------------------------------------------------------6
6. 程序清单-----------------------------------------------------------------------------7
7. 各主要模块仿真结果波形---------------------------------------------------- 17
8. 课程设计总结---------------------------------------------------------------------18
一、课题介绍
本设计灵感来源于文曲星上风靡一时的打地鼠游戏,旨在一方面作为娱乐游戏,同时
可以锻炼人的反应速度。游戏开始后 4*4 的点阵中每隔一定秒数(由设计难度决定)会随
机点亮一盏,以供选手进行游戏。当一盏灯点亮时,在下一盏灯亮之前按下对应的键盘即可
得分,否则失分。游戏开始时难度初始值可设定,随后进行一分钟倒计时,一旦为 0 游戏结
束。 在规定时间内得分最高者胜出。
二、具体实施方案
界面用 4*4 的点阵实现,在点阵中用随机亮起的等表示探出的老鼠,
按键用键盘来实现,由键盘 4*4 的键对应相应的点阵中的地鼠,控制器通过读取用户的
按键及点阵输出代码并进行判断来相应的加减分。当玩家分数为零或者游戏时间倒计时置 0
时,游戏停止。在游戏过程中当玩家按了结束键之后推出进入游戏难度选择,这是用四个开
关输入的。
三、面板图:
Start
Stop
K1
K2
K3
K4
难度
得分
时间
1
5
9
D
2
6
A
00
E
3
7
B
F
4
8
C
C
G
输入:
输入名称
Start
stop
K1 K2 K3 K4
功能及操作说明
控制游戏开始结束,其中 start 是游戏总开关,start 置 1 时游戏时钟才
会走,游戏才可以开始。在 start 置 1 的前提下,若 stop 置 0 游戏开始,
stop 置 1 时时间、分数等均清零,恢复初始状态。
输入初始等级的四个开关,为二进制数,如 K1 K2 K3 K4 为 0100 时则
等级为 4 级,注意此输入只有在 stop 为 1 时才有效,即输入为初始等
级,一旦 stop 置 0 游戏开始后,置数无效,只有等下一次 stop 置 1 时
才能再次置入初始等级。
键盘
用作打地鼠的“榔头”,当某一盏灯亮时,在下一盏灯亮之前按下响应
键盘按钮即可加分,否则扣分。
输出:
输出功能
显示游戏当前难度等级
输出名称
七段码管 6
七段码管 4、3 显示玩家得分
七段码管 2、1 显示本局游戏剩余时间
4*4 点阵
每隔一段时间(随难度等级不同而变化)随机点亮其中一盏(熄灭前
面一盏)表示地鼠出现
四、系统结构图:
1. 总的系统框图
等 级 判 断
模块
键盘模块
分频模块
计数模块
随机数发
生模块
点阵
比较模块
计分模块
键盘输入
计时模块
2. 顶层结构图
等级、分频
随机数产生
OUTPUT
smc
Option Value
Location PIN_184
decoder_model
a[3..0]
y [6..0]
inst20
clk
INPUT
VCC
Option Value
Location PIN_28
shuru[3..0]
INPUT
VCC
Option Value
Location PIN_137
Location PIN_136
Location PIN_135
Location PIN_134
f enpinkaishi
clk
clk1
clk2
inst15
hz
clk
clk1
clk2
inst19
lev el[3..0]
lev el
clk
up
stop
shuru[3..0]
inst16
stop
Option Value
Location PIN_159
INPUT
VCC
key _r0
key _r1
key _r2
key _r3
Option Value
Location PIN_120
Option Value
Location PIN_121
Option Value
Location PIN_122
Option Value
Location PIN_123
INPUT
VCC
INPUT
VCC
INPUT
VCC
INPUT
VCC
keyboard
CP100Hz1
R3
R2
R1
R0
CP100Hz
inst14
A0
A1
A2
A3
A4
A5
A6
A7
C3
C2
C1
C0
g[0]
g[1]
g[2]
g[3]
g[4]
g[5]
g[6]
g[7]
key _c0
key _c1
key _c2
key _c3
OUTPUT
OUTPUT
OUTPUT
OUTPUT
g[7..0]
Option Value
Location PIN_124
Option Value
Location PIN_125
Option Value
Location PIN_126
Option Value
Location PIN_131
start
INPUT
VCC
Option Value
Location PIN_158
f enpin
clk
lev el[3..0]
clk1
clk2
4
t
s
n
i
T
O
N
inst5
count
suiji
Q[6..0]
reset
CLK
clk
addr[6..0]
Q[7..0]
inst1
inst2
comp
y 1
y 0
a[7..0]
b[7..0]
clk
inst
P[7..0]
STOP
SCORE
STOP1
clk
start
UP
DN
inst6
LOCK
G
CLK
DIN[7..0]
inst3
p[7..0]
Q[7..0]
Q[7..0]
P[7..4]
decoder_model
a[3..0]
y [6..0]
sc1[6..0]
inst12
decoder_model
P[3..0]
a[3..0]
y [6..0]
sc2[6..0]
VCC
Q[7..0]
LOCK
G
CLK
DIN[7..0]
inst8
COUNTTIME
START
CLK
START2
H[3..0]
L[3..0]
STOP
inst9
OR2
inst7
NOT
inst17
decoder_model
a[3..0]
y [6..0]
ti[6..0]
inst11
decoder_model
a[3..0]
y [6..0]
l[6..0]
inst10
inst13
time_h0
time_h1
time_h2
time_h3
time_h4
time_h5
time_h6
time_l0
time_l1
time_l2
time_l3
time_l4
time_l5
time_l6
ti[0]
ti[1]
ti[2]
ti[3]
ti[4]
ti[5]
ti[6]
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
l[0]
l[1]
l[2]
l[3]
l[4]
l[5]
l[6]
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
Option Value
Location PIN_107
Option Value
Location PIN_106
Option Value
Location PIN_105
Option Value
Location PIN_104
Option Value
Location PIN_103
Option Value
Location PIN_102
Option Value
Location PIN_101
Option Value
Location PIN_119
Option Value
Location PIN_118
Option Value
Location PIN_117
Option Value
Location PIN_116
Option Value
Location PIN_115
Option Value
Location PIN_114
Option Value
Location PIN_113
比较、计分
键盘输入
计时
显
示
模
块
LED
灯
OUTPUT
y [6..0]
Q[0]
Q[1]
Q[2]
Q[3]
Q[4]
Q[5]
Q[6]
Q[7]
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
sc1[0]
sc1[1]
sc1[2]
sc1[3]
sc1[4]
sc1[5]
sc1[6]
sc2[0]
sc2[1]
sc2[2]
sc2[3]
sc2[4]
sc2[5]
sc2[6]
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
OUTPUT
r0
r1
r2
r3
c0
c1
c2
c3
Option Value
Location PIN_23
Location PIN_21
Location PIN_20
Location PIN_19
Location PIN_18
Location PIN_17
Location PIN_16
Option Value
Location PIN_164
Option Value
Location PIN_165
Option Value
Location PIN_166
Option Value
Location PIN_167
Option Value
Location PIN_168
Option Value
Location PIN_169
Option Value
Location PIN_170
Option Value
Location PIN_173
score_h0
score_h1
score_h2
score_h3
score_h4
score_h5
score_h6
score_l0
score_l1
score_l2
score_l3
score_l4
score_l5
score_l6
Option Value
Location PIN_87
Option Value
Location PIN_86
Option Value
Location PIN_85
Option Value
Location PIN_84
Option Value
Location PIN_83
Option Value
Location PIN_82
Option Value
Location PIN_81
Option Value
Location PIN_99
Option Value
Location PIN_98
Option Value
Location PIN_97
Option Value
Location PIN_96
Option Value
Location PIN_95
Option Value
Location PIN_94
Option Value
Location PIN_93
显示
3. 各个模块的功能描述
A.分数判断模块
判断选手得分或失分主要是由一个比较器完成的,将系统传给LED灯的信号与选手输入的
信号作比较,相同则加分,否则扣分,这两个信号分别传给计分模块,从而完成系统判定得
分的工作。
B . 系统时钟模块
将内部 2MHz 的时钟分频为 1kHz、及游戏时钟,供以后程序适使用
C.键盘电路
主要通过产生行扫描,来识别用户的按键,电路中已经对按键进行了消抖。其提供给控
制器按键的编码。
D.等级判断模块
判断等级,若游戏未开始时,将等级设为初始值,游戏开始后则判断是否按对五次或按
错五次,并响应的加、减等级。
E.随机数产生模块
为使得测试结果的公平性,需要4*4等灯亮灭具有随机性,因而需要随机数产生过程,在
本方案中,采用伪随机数产生方法,即在ROM中存入随机表中的数据,游戏开始后采用一个
计数器不断从其中读取数据。
F.显示模块
用来将BCD码转化为可以在七段数码管中显示的。
G.计时模块
系统的计时部分需要一个能置初值的计数器即可,其控制信号应为Start,stop
五、状态流程图:
初始状态
设定难度
Start=1?stop=0?
No
No
游戏开始
Yes
No
Stop=0?
Yes
是否按对?
No
Yes
加分
No
减分
时间=0?分数=0?
Yes
游戏结束
UP,DN: IN STD_LOGIC;
P:
STOP: OUT STD_LOGIC);
END SCORE;
ARCHITECTURE BEHAVE OF SCORE IS
begin
process(clk,STOP1)
variable tmp:std_logic_vector(7 downto 0);
begin
if clk'event and clk='1' then
if STOP1='1' then
tmp:=tmp;
else
IF UP='1' THEN
TMP:=TMP+1;
IF(TMP(3 DOWNTO 0)="1010")THEN
--若游戏分数为零则出高
--如果 stop1=1
--保持分数不变
--如果加分等于 1
--分数加一
--如果分数低位为十
--低位变为零
--高位加一
六、程序清单
1. 分数判断模块
--该模块实现系统的分数计算
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SCORE IS
PORT(STOP1,clk,start:IN STD_LOGIC;
--stop1 为系统中间开始、结束信号,
--若分数或时间为零则置 1,clk 为游
戏时钟,start 为游戏清零键
OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--p 为分数高位、低位输出
--up 为加分信号,dn 为减分信号
TMP(3 DOWNTO 0):="0000";
TMP(7 DOWNTO 4):=TMP(7 DOWNTO 4)+1;
END IF;
ELSIF DN='1' THEN
--如果减分信号等于 1
IF(TMP(3 DOWNTO 0)="0000")THEN
TMP(3 DOWNTO 0):="1010";
TMP(7 DOWNTO 4):=TMP(7 DOWNTO 4)-1;
--如果分数低位等于十
--分数低位变为九
--高位减一
END IF;
TMP:=TMP-1;
END IF;
p<=tmp;
IF TMP="00000000"
THEN
--低位减一
--输出分数
--如果分数为零
STOP<='1';
ELSE STOP<='0';
END IF;
end if;
end if;
if start='1' then
tmp:="01000000";
p<=tmp;
--清零信号置一
--如果游戏开始键为 1
--分数显示为初始的 40 分
end if;
end process;
end BEHAVE;
2. 系统时钟分频
--将内部 2MHz 的时钟分频为 1kHz,供以后程序适使用
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity fenpinkaishi is
port(clk: in std_logic;
--输入的 2MHz 时钟
clk1:out std_logic; --输出的 2000Hz 时钟
clk2:out std_logic);--输出的 1000Hz 时钟
end fenpinkaishi;
architecture behave of fenpinkaishi is
signal x:std_logic;
begin
process(clk)
variable cnt:integer range 0 to 1000;
begin
if clk'event and clk='1' then
if
cnt<1000 then
cnt:=cnt+1;
--变量 cnt 小于 1000 时继续加一
--否则清零,翻转 x
else
cnt:=0;
x<=not x;
end if;
end if;
clk1<=x;
end process;
process(x)
variable y:std_logic;
begin
if x'event and x='1' then --x 变化则翻转 y 并输出