logo资料库

打地鼠游戏设计程序VHDL.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
课程名称:数字系统与课程设计 实验名称:打地鼠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 并输出
分享到:
收藏