1、 2015-2016 学年第一学期数字电路实验报告实验名称: 打地鼠实验 学 院: 信息与通信工程学院 专 业: 电子信息工程 班 级: 班内序号: 学 号: 姓 名: 北京邮电大学时间:2015 年 11 月 8 日一、设计课题的任务要求1、 设计一个挑战反应速度的“打地鼠”游戏,采用用 88 双色点阵显示游戏界面,其中游戏边界采用绿色 LED 显示,随机出现的地鼠采用红色 LED 显示,游戏有 16 个洞穴,如图 1 所示。2、 游戏洞穴每次随机出现一个地鼠,每个地鼠的最长保持时间为 2 秒,2 秒后随机出现下一个地鼠。以 44 键盘的按键代表锤子,16 个洞穴与 16 个按键一一对应,一
2、旦锤子在 2 秒内击中地鼠,地鼠消失,数码管计分器分数加 1 分;若锤子一直没有击中地鼠,2 秒后该地鼠消失。用两个数码管显示游戏成绩,当游戏成绩达到 10 分时游戏结束,点阵显示字符“V”。3、 用两个数码管对整个游戏进行倒计时,当游戏时间超过 59 秒而成绩未达到 10 分时,游戏失败,点阵显示字符“X”。4、 按复位键重新开始游戏,并开始倒计时。二、系统设计1.设计思路用 8*8 双色点阵显示游戏界面,其中游戏边界使用 6*6,红色 LED 灯表示地鼠出现,4*4 键盘对应锤子,两个数码管显示游戏倒计时,两个数码管显示分数,当游戏成绩达到十分时游戏结束,点阵显示“V”,当游戏时间超过 5
3、9 秒而成绩未达到 10 分时,游戏失败,点阵实现“X”。2. 总体框图是 是否否是3. 分块设计开始地鼠出现锤子打中 记分加一地鼠保持 2 秒 记分达到十分开始倒计时倒计时结束游戏成功 游戏失败复位3、 仿真波形及波形分析因按照原程序仿真时间过长,所以将原程序所有分频统一调小 1000 倍,从而实现仿真中 60ms 等于实际过程中 60s 的效果,并在过程中人为设置按键,复位和暂停观察仿真结果。3.1 数码管扫描分频模块键盘模块 分数模块到计时模块 地鼠模块控制模块判断模块如图为键盘扫描波形。因为 6 个数码管的管脚连接在一起,无法使其同时显示不同的数字,所以需要对数码管进行扫描,使不同的数
4、码管在不同的时间亮起,显示不同的数字,并通过人眼的视觉暂留效应实现数字的清晰显示。3.2 键盘扫描如图为键盘扫描波形。tempclk3(1000Hz)每发生一次,kbrow 的一位变为低电平,其余三位为高电平,表示扫描该行,并记录此时数值。当 kbrow 的高位到低位依次变为低电平,表示进行了一次完整的扫描。3.3 点阵扫描如图为点阵扫描波形。Tempclk4(500Hz)每发生一次,row 的一位变为低电平,其余七位为高电平,表示扫描该行,。当 row 的高位到低位依次变为低电平,表示进行了一次完整的扫描。3.4 田地边界如图为田地边界的显示(绿色 LED 灯)。此处稍作说明的是,此程序中的
5、边界与课题要求中稍有不同,占据点阵正中央的 6*6 边界,完全对称。3.5 地鼠出现如图为地鼠出现模块波形。可以看到,当未按下或正确按下按键时,colr(红色 LED灯)波形 2s 变化一次,即地鼠 2s 变化出现。当正确按下按键,波形立刻变化,即地鼠立刻变换位置。3.6 暂停如图为按下暂停键之后的波形。可以看到,点阵(colg 和 colr)不再亮起。程序暂停。3.7 复位如图为按下复位键之后波形。可以看到,colr 的波形按照初始时刻波形重新变化,表示游戏重新开始。4、 源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_log
6、ic_unsigned.all;-entity dadishu isport(clk: in std_logic;rst: in std_logic; -kbrow: in std_logic_vector(3 downto 0); kbcol:out std_logic_vector(3 downto 0); -键盘-row: out std_logic_vector(7 downto 0);colg: out std_logic_vector(7 downto 0); colr: out std_logic_vector(7 downto 0);-shumaguan:out std_log
7、ic_vector(6 downto 0);catout: out std_logic_vector(5 downto 0) ;-数码管-clear: in std_logic; -BTN0- 复位-mode: in std_logic );end entity;architecture a of dadishu is-TYPE matrix_index is array (29 downto 0) of std_logic_vector(15 downto 0);constant dishu : matrix_index:=( x“4000“,x“0800“,x“0001“,x“8000“,
8、x“0020“,x“0010“,x“0100“,x“0010“,x“8000“,x“0002“,x“4000“,x“0080“,x“0010“,x“0002“,x“0800“,x“4000“,x“0001“,x“0400“,x“0020“,x“8000“,x“0002“,x“0800“,x“0001“,x“1000“,x“0200“,x“0008“,x“4000“,x“0001“,x“0008“,x“0010“);signal cnt: integer range 0 to 10000;signal cnt2: integer range 0 to 50000000;signal clk_tm
9、p : std_logic;signal st1: std_logic_vector(7 downto 0); -点阵-signal data: std_logic_vector(7 downto 0);signal ling: std_logic_vector(1 downto 0);signal change: integer range 0 to 29;signal k: std_logic_vector(15 downto 0):=x“0000“;signal red: std_logic_vector(7 downto 0);signal location: std_logic_ve
10、ctor(7 downto 0);-signal scanand:std_logic_vector(7 downto 0);signal col: std_logic_vector(3 downto 0); signal cntscan:integer range 0 to 3; signal clk_tmp1:std_logic; signal key: std_logic_vector(15 downto 0):=x“1111“; -jianpan-signal counter1:integer range 0 to 3;signal counter2:integer range 0 to
11、 50000;signal n: std_logic_vector(15 downto 0);-signal co: std_logic_vector(6 downto 0);signal co1: std_logic_vector(6 downto 0); signal co2: std_logic_vector(6 downto 0); signal co3: std_logic_vector(6 downto 0); -记分signal co4: std_logic_vector(6 downto 0);signal cat: std_logic_vector(5 downto 0);s
12、ignal up: integer range 0 to 1:=0;signal counter3:integer range 0 to 25000000; -signal i: integer range 0 to 20;signal j: integer range 0 to 60; signal vx: integer range 0 to 2; signal stop: integer range 0 to 1 :=0; - game over-signal fuwei: integer range 0 to 1:=0; -复位beginling=“00“;- dianzhenprocess(clk,rst)beginif rising_edge(clk) and rst=0thenif cnt=10000 thencnt=0; clk_tmp= not clk_tmp;elsecnt=cnt+1;end if;end if;end process;process(clk_tmp1,up,rst,fuwei)variable count9:integer range 0 to 1000 :=0; begin