ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:479.16KB ,
资源ID:7197849      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7197849.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(北邮数电实验报告 简易迷宫游戏.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

北邮数电实验报告 简易迷宫游戏.docx

1、北邮数电实验报告 简易迷宫游戏数字电路与逻辑设计实验简易迷宫游戏专 业: 电子信息工程姓 名: 班 级: 2012211102学 号: 班内序号: 设计课题的任务要求(一) 实验目的1. 熟练掌握 VHDL 语言和QuartusII 软件的使用;2. 理解状态机的工作原理和设计方法;3. 掌握利用 EDA 工具进行自顶向下的电子系统设计方法;(二) 相关知识本实验主要利用状态机来设计实现一个简易迷宫系统,本系统分为控制器与受控电路两部分。控制器主要控制整个系统按设定的工作方式实现点阵、计时器、数码管工作的通与断,并使用逻辑判断判决小人是否移动与否和移动的方向。同时本实验也运用到了包括分频器、计

2、数器、数码管、点阵等相关知识。主要利用六位数码管显示30s计时和小人移动步数,用点阵显示开机画面、迷宫地图、小人移动过程和游戏失败、胜利的相应画面。(三) 实验任务基本要求:1、 用88点阵进行游戏显示。2、 迷宫游戏如图1所示,采用双色点阵显示,其中红色LED为迷宫墙壁,绿色LED表示人物。通过BTN0BTN3四个按键控制迷宫中的人物进行上下左右移动,使人物从起始点出发,走到迷宫的出口,游戏结束3、 普通计时模式:通过按键BTN7启动游戏,必须在30秒内找到出口,否则游戏失败,用两个数码管进行倒计时显示。游戏胜利或者失败均要在88点阵上有相应的画面出现。4、 迷宫中的人物在行走过程中,如果碰

3、到墙壁,保持原地不动提高要求:1. 多种迷宫地图可以选择。2. 在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不计算步数,计步结果用数码管显示。3. 增加了计时显示的精确度,让倒计时精确到0.01s4.增加了开机画面,当按下START开始键后,点阵上开始显示“GO- 6-5-4-3-2-1”的开始画面。系统设计(四) 设计思路此程序利用自顶向下的设计思想。首先要考虑实现基本功能所需要哪些模块,倒计时的功能要用数码管来实现,地图的显示和迷宫游戏中动画的交互要用88点阵来实现,方向的选择和开始游戏需要独立按键来显示,这些都是最顶层的模块。然后,要实现这些模块,第一需要适当的时钟频率来

4、驱动,这就要完成一个分频器,根据点阵、数码管以及独立按键各自的特征完成相应频率的分配。实现倒计时功能的时候,需要一个计时器在每秒改变一次数码管的显示状态,于是还需要一个计时器模块。而数码管动态扫描需要相应的LED灯亮灭,这就需要先定义好了显示相应数字的时候对应八段LED的高低电平状态。点阵的显示控制原理和数码管类似,都是一个较高频率的动态扫描过程,只是代码量更大。其次,也是该程序最关键的地方就是绿色小人移动的控制。题干中说明小人撞墙后原地不动,不撞墙的时候进行移动。这就需要我们判断是否撞墙。经过和同学的商讨,我绝对将点阵坐标化,而小人所处的位置用(x,y)表示并实时的更新,然后将墙壁坐标封装好

5、,当下一步的坐标在墙壁坐标的集合中则判定为撞墙,否则根据方向进行移动。而终点坐标也都是提前用代码设定好的,这样通过坐标显示出点阵应该进行的下一画面。到此为止,该实验的基本功能都已经规划得较为清晰。对于提高要求,我通过一个拔码开关控制初始迷宫地图的选择,在程序中加入一个输入信号来选择相应地图;在程序中添加两个计数变量,分别表示步数的个位和十位,两者添加到判断撞墙与否的逻辑语句中,在数码管显示模块中增加两个数码管的显示便可实现。此外,为了丰富点阵界面,我还添加了开机画面,通过一个1s加1的变量扫描显示“GO- 6-5-4-3-2-1”;想到很多倒计时显示中个都精确到了0.01s甚至更精确,我又增加

6、两个数码管来显示倒计时的小数点后两位。(五) 总体框图1. 系统结构框图2. 逻辑划分方框图3. 控制模块流程图4. 状态转移图(六) 分块设计 点阵模块: 点阵模块主要分为点阵扫描显示模块、小人移动逻辑判断模块。扫描显示模块,主要是对迷宫地图、开机动画以及小人移动变化后的图案进行动态扫描,完成游戏交互。开机画面通过一个一秒更新一次的变量,然后通过case语句来完成扫描;地图图案的显示也是同样的方案,只不过要胜利或者失败的逻辑判断。小人移动的逻辑判断模块,主要通过坐标定位。首先将地图中墙壁的坐标位置封装好,然后将小人时刻的位置定义为(x,y),再根据按键对x,y进行变化,最后通过判断新的坐标是

7、否在封装好的墙壁集合中来进行移动与否的判决。如果移动则更新(x,y);如果不移动,则保持(x,y)不变。数码管显示模块: 数码管显示模块主要分为30s倒计时模块和小人移动步数计数模块 倒计时模块中将一个1KHZ的时钟信号进行四次的十分频,可以得到一个精确到0.01s的倒计时。每个变量都是十进制的数,再将它们传送到数码管动态扫描模块,便可以顺利地显示30s倒计时。 小人移动步数计数模块,定义两个计数变量count、count10分别表示计数的个位和十位,将其放在小人移动逻辑判断模块中,当逻辑判定为移动,则将count加一,当加到10的时候进位。再将两者传送到数码管动态扫描模块,就可以实时显示小人

8、移动的步数。按键防抖模块: 该程序再一开始开发的时候并没有加防抖模块,而是尽可能地找到一个最佳的按键扫描控制频率,使得既可以得到灵敏可靠的按键控制,又可以再长按一次后进行多步移动,这样可以方便用户的操作,一开始测试得到的按键扫描频率为5Hz。但是好像要求按键必须加防抖,并且为了提高按键输入可靠性,由于机械触点的弹性振动, 因而在按键闭合和断开的瞬间均会出现一连串的抖动,按键的抖动会造成按一次键产生的开关状态被 CPU 误读几次。 为了使 CPU 能正确地读取按键 状态,必须在按键闭合或断开时,消除产生的前沿或后沿抖动。一、 仿真波形及波形分析(七) 复位、开始()注:以下关于点阵显示的仿真都是

9、最开始测试用的模块,并不包含点阵动态显示的所有状态,只是挑选其中一些典型状态展示,而且点阵扫描红色和绿色是分开的。.复位:当按下复位键的时候,停止对点阵的扫描,点阵上无任务图形显示。开始:当按下开始键的时候,点阵开始进行行扫描,开始倒计时显示“GO- 6-5-4-3-2-1”,上图为点阵用红色LED显示“GO”。(二)点阵显示胜利、失败胜利:当玩家在30s之内到达了迷宫的终点,游戏结束并点阵显示“V”的标志。上图为当信号victory置高电平的时候,点阵开始行扫描,并将红色、绿色LED均点亮显示“V”,上图可明显地看出。失败:当玩家在30s之内没有到达迷宫的终点,游戏结束并且点阵显示“X”的标

10、志。上图为信号fail置高电平的时候,点阵开始行扫描,并将红色、绿色LED均点亮显示“X”,由上图可以明显地看出。(三)数码管倒计时数码管倒计时:实际上应该是四位数码管从30.00s倒计时,为了方便展示将倒计时的计数变量改成二进制,上图中输出信号ledshow代表数码管段选的信号,而ledstate代表数码管位选的信号,变量ledsao表示分五次对四位数字加上一个小数点进行扫描。上图红色圈中表示显示小数点,“00000001”表示小数点,而ledstate在“111110 111101 111011 110111 111011 ”五个状态之间循环表示对四位数字和一个小数点的显示。而ledsho

11、w显示相应的数字。(四)按键防抖按键防抖:keyin输入一个持续时间约为0.1s的按键信号并用高频时钟模拟抖动,keyout输出一个时钟周期的高电平。二、 源程序(注释)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY maze IS PORT( clk:IN STD_LOGIC; -总时钟 start,reset:IN STD_LOGIC; -开始和复位键 l,r,f,b,mapflag:IN STD_LOGIC;-BTN -b/r/f/b分别代表小人向左、右、前、后移动;mapfl

12、ag代表两种地图的选择 dotshow:OUT STD_LOGIC_VECTOR(23 DOWNTO 0); -点阵显示 ledstate:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -数码管状态 ledshow:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -数码管显示 END maze;ARCHITECTURE main of maze IS signal cnt : integer range 0 to 25000; -分频器的计数 signal cnt1 : integer range 0 to 25000000; signal cnt2

13、: integer range 0 to 5000000; signal clk_tmp : std_logic; -分频器的临时信号 signal clk_tmp1 : std_logic; signal tclk: std_logic; signal clk_tmp2 : std_logic; signal key_tmp0,key_tmp1,key_tmp2,key_tmp3:std_logic; signal row: std_logic_vector(7 downto 0); -点阵行状态 signal cul: std_logic_vector(15 downto 0); -点阵列

14、状态 signal aclk: std_logic; -点阵倒计时开机画面的时钟信号 signal binclk: std_logic; -按键时钟信号 shared variable tend : integer range 0 to 1; signal tostart : std_logic; -开始标志信号 signal preset : std_logic; -逻辑判断模块重置 signal dotreset : std_logic; -点阵模块重置 signal ledreset : std_logic; -数码管重置 signal treset : std_logic; -计时器重

15、置 signal pwork : std_logic; -逻辑判断模块工作 signal dotwork : std_logic; -点阵工作 signal ledwork : std_logic; -数码管工作 signal twork : std_logic; -计时器工作 signal worked : std_logic; signal vic : std_logic; - 成功 signal fal : std_logic ; - 失败 type nst is array(0 to 9)of std_logic_vector(7 downto 0); signal ledshowed

16、:nst; shared variable rowsao:integer range 0 to 9; -点阵的行扫描 shared variable ledsao :integer range 0 to 6; -数码管的扫描 shared variable daojishi :integer range 0 to 7; -开机动画倒计时扫描 shared variable dotsao :integer range 0 to 3; shared variable mapsao :integer range 0 to 9; shared variable x :integer range -7

17、to 0; -小人的坐标 shared variable y :integer range -6 to 1; shared variable count :integer range 0 to 9; -count和count10分别代表步数的个位和十位 shared variable count10 :integer range 0 to 9; shared variable timems :integer range 0 to 9; shared variable time001s :integer range 0 to 9; -以下分别代表30倒计时的位数 shared variable

18、time01s :integer range 0 to 9; shared variable time1s :integer range 0 to 9; shared variable time10s :integer range 0 to 9; begin -数码管显示高低电平初始化 ledshowed(1)=01100000; ledshowed(2)=11011010; ledshowed(3)=11110010; ledshowed(4)=01100110; ledshowed(5)=10110110; ledshowed(6)=10111110; ledshowed(7)=11100

19、000; ledshowed(8)=11111110; ledshowed(9)=11110110; ledshowed(0)=11111100;tdiv:process(clk,clk_tmp) - 计时器分频-1Kbegin if (clkevent and clk=1) then if cnt=24999 then cnt=0; clk_tmp= not clk_tmp; else cnt=cnt+1; end if; end if; tclk=clk_tmp;end process; adiv:process(clk,clk_tmp1) -点阵分频-1HZbegin if (clkev

20、ent and clk=1) then if cnt1=24999999 then cnt1=0; clk_tmp1= not clk_tmp1; else cnt1=cnt1+1; end if; end if; aclk=clk_tmp1;end process; usediv:process(clk,clk_tmp2) -按键控制判断分频-5HZbegin if (clkevent and clk=1) then if cnt2=4999999 then cnt2=0; clk_tmp2= not clk_tmp2; else cnt2=cnt2+1; end if; end if; b

21、inclk=clk_tmp2;end process; process(clk_fd) -防抖模块begin if (clk_fdevent and clk_fd=1) then key_tmp0 = keyin; key_tmp1 = key_tmp0; end if; end process; -利用信号赋值延时将前后信号相与完成防抖 key_tmp2 = key_tmp0 and key_tmp1; process(clk_fd ) begin if (clk_fdevent and clk_fd=1) then key_tmp3 = key_tmp2; keyout= not( key

22、_tmp2 ) and key_tmp3; end if; end process; end; -时钟上升沿输出一个时钟周期宽度的脉冲 control:process(clk,reset,start) -控制器 begin if (clkevent and clk=1) then if (start=1) then tostart=1;end if; if (reset=1 or tend=1) then preset=1; dotreset=1; ledreset=1; treset=1; tostart=0; dotwork=0; else preset=0; dotreset=0; le

23、dreset=0; treset=0; if(tostart=1)then dotwork=1; -启动点阵模块 end if; end if; end if; end process; a:process(aclk,dotreset) -点阵工作模块beginif (dotreset=1) then dotsao:=0;else if ( aclkevent and aclk=1) then if(vic=1 or fal=1)then if(dotsao=2)then dotsao:=dotsao+1; end if; end if; end if;end if;end process;p

24、rocess(tclk,dotreset)beginif (dotreset=1) then mapsao:=0;else if (tclkevent and tclk=1) then if(mapsao=9)then mapsao:=0; else mapsao:=mapsao+1; end if; end if;end if;end process; process(aclk,dotwork,worked,dotreset) beginif (dotreset=1) then daojishi:=0;else if (aclkevent and aclk=1 and dotwork=1 a

25、nd worked=0) then if(daojishi=7)then daojishi:=0; else daojishi:=daojishi+1; end if; end if;end if;end process; process(tclk,dotreset)begin if (dotreset=1) then rowsao:=0; else if (tclkevent and tclk=1) then if(rowsao=9)then rowsao:=0; else rowsao:=rowsao+1; end if; end if; end if;end process; proce

26、ss(clk,dotreset,dotwork,mapflag) -开机动画begin if (dotreset=1) then dotshow=000000000000000000000000; tend:=0;worked=0;twork=0;pwork case rowsao is when 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshow case rowsao is when 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshow case rowsao is

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1