
北京邮电大学数电实验——打地鼠.docx
25页2015-2016学年第一学期数字电路实验报告 实验名称: 打地鼠实验 学 院: 信息与通信工程学院 专 业: 电子信息工程 班 级: 班内序号: 学 号: 姓 名: 北京邮电大学 时间:2015年11月8日一、设计课题的任务要求1、 设计一个挑战反应速度的“打地鼠”游戏,采用用8×8 双色点阵显示游戏界面,其中游戏边界采用绿色LED 显示,随机出现的地鼠采用红色LED 显示,游戏有16 个洞穴,如图1 所示2、 游戏洞穴每次随机出现一个地鼠,每个地鼠的最长保持时间为2 秒,2 秒后随机出现下一个地鼠。
以4×4 键盘的按键代表锤子,16 个洞穴与16 个按键一一对应,一旦锤子在2 秒内击中地鼠,地鼠消失,数码管计分器分数加1 分;若锤子一直没有击中地鼠,2 秒后该地鼠消失用两个数码管显示游戏成绩,当游戏成绩达到10 分时游戏结束,点阵显示字符“V”3、 用两个数码管对整个游戏进行倒计时,当游戏时间超过59 秒而成绩未达到10 分时,游戏失败,点阵显示字符“X”4、 按复位键重新开始游戏,并开始倒计时二、系统设计1.设计思路用8*8双色点阵显示游戏界面,其中游戏边界使用6*6,红色LED灯表示地鼠出现,4*4键盘对应锤子,两个数码管显示游戏倒计时,两个数码管显示分数,当游戏成绩达到十分时游戏结束,点阵显示“V”,当游戏时间超过59秒而成绩未达到10分时,游戏失败,点阵实现“X”记分达到十分开始倒计时记分加一地鼠保持2秒锤子打中地鼠出现倒计时结束开始2. 总体框图 是 是复位游戏失败游戏成功 否 否 是3. 分块设计分数模块地鼠模块到计时模块键盘模块判断模块分频模块控制模块3、 仿真波形及波形分析 因按照原程序仿真时间过长,所以将原程序所有分频统一调小1000倍,从而实现仿真中60ms等于实际过程中60s的效果,并在过程中人为设置按键,复位和暂停观察仿真结果。
3.1 数码管扫描如图为键盘扫描波形因为6个数码管的管脚连接在一起,无法使其同时显示不同的数字,所以需要对数码管进行扫描,使不同的数码管在不同的时间亮起,显示不同的数字,并通过人眼的视觉暂留效应实现数字的清晰显示3.2 键盘扫描如图为键盘扫描波形tempclk3(1000Hz)每发生一次,kbrow的一位变为低电平,其余三位为高电平,表示扫描该行,并记录此时数值当kbrow的高位到低位依次变为低电平,表示进行了一次完整的扫描3.3 点阵扫描如图为点阵扫描波形Tempclk4(500Hz)每发生一次,row的一位变为低电平,其余七位为高电平,表示扫描该行,当row的高位到低位依次变为低电平,表示进行了一次完整的扫描3.4 田地边界如图为田地边界的显示(绿色LED灯)此处稍作说明的是,此程序中的边界与课题要求中稍有不同,占据点阵正中央的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_logic_unsigned.all;-----------------------------------------------------entity dadishu is port( 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_logic_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",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 ;signal clk_tmp : 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_vector(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 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);signal up: integer range 0 to 1:=0;signal counter3:integer range 0 to ; ----------------------------------------------------------------------------signal i: integer range 0 to 20;signal j: integer range 0 to 60; signal vx: integer。
