当前位置:文档之家› 数电实验报告

数电实验报告

数字逻辑与数字电路实验报告

实验名称 简易迷宫游戏 一、 设计课题的任务要求 题目:简易迷宫游戏 设计并实现一个简易迷宫游戏机。

【基本要求】: 1、用 8×8 点阵进行游戏显示。 2、迷宫游戏如图 1 所示,采用双色点阵显示,其中红色LED 为迷宫墙壁,绿色LED表示人物。通过BTN0~BTN3 四个按键控制迷宫中的人物进行上下左右移动,使人物从起始点出发,走到迷宫的出口,游戏结束。 3、普通计时模式:通过按键BTN7 启动游戏,必须在30 秒内找到出口,否则游戏失败。用两个数码管进行倒计时显示。游戏胜利或者失败均要在8×8 点阵上有相应的画面出现。 4、迷宫中的人物在行走过程中,如果碰到墙壁,保持原地不动。 【提高要求】: 1、多种迷宫地图可以选择。 2、在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不计算步数,计步结果用数码管显示。 3、为游戏增加提示音乐,在不同时间段采用不同频率的信号控制蜂鸣器发声报警。 4、增加其他游戏模式。 5、自拟其它功能。

二、 系统设计(包括设计思路、总体框图、分块设计) 设计思路: 依据题目要求,在实验中需要使用到8*8双色点阵输出迷宫图案,使用数码管输出计步步数和倒计时时间,使用蜂鸣器发出警报。由于实验要求需要使用到大量的按键输入。所以需要在输入输出模块中需要按键消抖模块。实验的输出模块共有点阵输出模块,数码管输出模块,蜂鸣器输出模块,在数码管和点阵输出中需要使用到扫描输出的概念。在游戏进行中需要实时判断并且记录人的位置,需要进行记时,计步,所以在整个系统中需要使用状态机进行当前状态转换,控制整个程序。所以在核心实现模块中包括行走模块,状态输出模块,计步模块,计时模块。 输入部分:消抖模块 时钟部分:多级分频器 控制部分:倒计时器,计步器,行走模块,状态机 输出模块:点阵输出模块,数码管输出模块,蜂鸣器输出模块 总体框图:

总体框图 系统详细框图 实际电路连接图

状态转移图 系统流程图

分块设计: 1. 分频器 实验使用的实验板能产生50MHz的时钟信号,利用分频器产生各种频率的时钟,作为各个模块的时钟输入。本实验需要的频率较多,为节约资源,分频器采用多级分频的原理,产生250MHz作为数码管扫描和点阵扫描信号,产生1000Hz作为按键消抖以及状态转移的时钟,产生1Hz作为计时器的时钟信号。 2. 按键消抖 机械按键会产生机械抖动,这种抖动会造成按键信号的重复输入,所以我们要消除这种机械抖动。按键消抖将高电平持续时间少于8us的按键信号,作为抖动信号舍弃,只有按键信号的高电平持续时间长于8us的信号作为真正的按键输入,去除按键抖动。 3. 计时器 本计时器需要实现两个功能,一是游戏开始前的5秒倒计时,以及游戏过程中的30秒倒计时。为了方便在数码管以及点阵显示,输出信号不再是一个整数,而是分为个位、十位分别输出,这就要求在计时器内部为两个级联的计数器,为别对个位、十位分别计数。第一级计数得到个位数,第二级计数得到十位数。 4. 状态机 为了方便各个模块在不同的游戏阶段有不同的动作,我将整个游戏分为9个状态,由各种控制信号输入的控制下进行状态转移。总体支配整个游戏进程。状态机实现使用了三进程描述,结构更加清楚。 5. 行走模块 行走模块是整个游戏的核心模块。上、下、左、右的控制信号由按键输入经过消抖和转换之后进入行走模块,行走模块按照当前的输入,判断即将走到的地方是否为终点,到达终点时则发出―win‖信号,若不是终点则判断是否为迷宫的墙,如果是墙,发出0.1s的撞墙信号,如果不是墙则发出修改坐标,并且发出行走信号。将下一状态的坐标输出到点阵使得点阵能正确输出人的位置。 6. 计步器 根据行走模块输出的行走信号进行计数,也需要在进行级联计数器,分别得到个位数与十位数。第一级计数得到个位数,第二级计数得到十位数。 7. 数码管输出 数码管为共阴极扫描输出,并且分别各使用2位显示计步步数,以及倒计时时间。 8. 点阵输出 根据不同的状态输出不同的点阵图案。点阵输出时为节省有限的管脚资源,使用了扫描输出,逐行扫描,依据扫描计数输出当前的行选信号,红色点阵,绿色点阵。 9. 蜂鸣器 根据行走模块输出的撞墙信号输出频率为1000Hz的声音。

三、 仿真波形及波形分析

1. 多级分频器仿真波形:

从上面3张图可以看出clk-out1是clk的5分频,clk-out2是clk-out1的5分频,clk-out3是clk-out2的5分频,实现了多级分频器的功能 2. 按键消抖模块仿真: 从图中可以看出在按键按下时间持续不到5个周期时,则认为是按键抖动,在按下时间超过5个周期时,则认为是一次有效的按键输入,实现了消抖功能

3. 模6计数器仿真

4. 模8计数器仿真 5. 方向转换电路仿真: 原地不动即up、 down、 lefting、 righting没有输入对应dir―000‖,向上走对应―001‖,向下走对应―010‖,向左走对应―011‖,向右走对应―100‖ 6. 点阵输出模块仿真 当输入状态为―0000‖,点阵输出选择地图的画面。 当输入状态为―0001‖时,点阵输出地图1的画面。 当输入状态为‖0010―时,点阵输出地图2的画面。 当输入状态是‖0011‖时,根据时间输入,点阵分别输出1、2、3、4、5 当输入状态是‖0100‖时,根据时间输入,点阵分别输出1、2、3、4、5

当输入状态是‖0101―,点阵输出红色与绿色双色图案,显示地图1及当前小人位置。 当输入状态是‖0110―,点阵输出红色与绿色双色图案,显示地图1及当前小人位置。 当输入状态为‖0111―,点阵输出赢的图案。 当输入状态为‖1000―时,点阵输出输的图案。 7. 数码管输出模块仿真

数码管在1,2位输出当前计时器的输出,在第4,5位输出当前计步器的输出。 8. 蜂鸣器输出模块仿真

当输入状态为‖0101―或‖0110―时,在使能信号有效时,蜂鸣器输出1000Hz的声音 9. 计步模块仿真 当行走信号有效时,个位与十位分别计数。 10. 计时模块仿真

当输入状态为‖0011―时,进行5s倒计时,倒计时结束以后,给出ready信号,状态机从状态‖0011―转移到‖0101―,计数器进行30s倒计时,在初始化计数值为30之后,ready信号置无效,30s倒计时结束后给出fail信号。 当输入状态为‖0100―时,进行5s倒计时,倒计时结束以后,给出ready信号,状态机从状态‖0100―转移到‖0110―,计数器进行30s倒计时,在初始化计数值为30之后,ready信号置无效,30s倒计时结束后给出fail信号。

11. 状态机仿真 状态机控制状态转移,状态0为起始状态,每个状态都可以复位到状态0,状态0时输入maze1,转到状态1,输入maze2转入状态2,在状态1输入maze2转入状态2,输入start转入状态3,当处于状态2时,输入maze1转入状态1,输入start转入状态4,在状态3,4时,输入ready信号时分别进入状态5,6,在状态5,6输入win信号转入状态7,输入fail信号转入状态8。

12. 行走模块仿真

在输入状态5,6时,为行走状态,在行走过程中,正常行走产生行走信号便于计数,撞墙则产生较长时间的撞墙信号,便于蜂鸣器发出声音,到达终点产生win信号,x1,y1为当前位置坐标输出。

四、 源程序(要有注释) --fenpinqi library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity fenpinqi is port ( clk : in std_logic; clk_out1 : out std_logic;--250kHz clk_out2 : out std_logic;--1000Hz clk_out3 : out std_logic—1Hz ); end entity; architecture a of fenpinqi is signal tmp1: integer range 0 to 99;--fenpinbi actually 200 smg&dianzhen signal tmp2: integer range 0 to 124;--fenpinbi actually 250 quiver signal tmp3: integer range 0 to 499;--fenpinbi actually 1000 timecounting signal clktmp1: std_logic; signal clktmp2: std_logic; signal clktmp3: std_logic; begin p1: process (clk) --200, the frequency out is 250kHz begin if (clk'event and clk='1') then if tmp1=99 then tmp1<=0; clktmp1<= not clktmp1; else tmp1<=tmp1+1; end if; end if; end process p1; p2: process (clktmp1) --250, the frequency out is 1kHz begin if (clktmp1'event and clktmp1='1') then if tmp2=124 then tmp2<=0; clktmp2<= not clktmp2; else tmp2<=tmp2+1; end if; end if; end process p2; p3: process (clktmp2) -- 1000, the frequency out is 1Hz begin if (clktmp2'event and clktmp2='1') then if tmp3=499 then tmp3<=0; clktmp3<= not clktmp3; else tmp3<=tmp3+1; end if; end if; end process p3; clk_out1<=clktmp1; clk_out2<=clktmp2; clk_out3<=clktmp3; end a;

相关主题