您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 数电综合实验报告-贪吃蛇
北京邮电大学数电综合实验报告实验名称:简易贪吃蛇游戏机学院:信息与通信工程姓名:班级:学号:班内序号:一.设计课题的任务要求用一个8×8点阵作为基本显示屏,4个连续移动的的发光点表示一条蛇,用任意出现的一个亮点表示老鼠,用4个排成一条线的发光点表示“墙”,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,则游戏结束。(1).老鼠出现的地方是随机的,在某个地点出现的时间是5秒钟,如果5秒钟之内没有被吃掉,它就会在其它地方随机出现;(2).用数码管显示得分情况和游戏的剩余时间,每吃掉一只老鼠就加一分。二.系统设计1.设计思路采取模块化的设计思想,主要分为控制和显示模块,控制模块主要针对各种控制信号进行控制处理,比如蛇的移动,倒计时,方向控制等,而进行控制时,控制图形的变化的信号有很多,有外部按键输入,内部时钟驱动,判断的状态也比较多,蛇的位置,老鼠的位置,墙的位置等,在设计过程中将操作“串行化”,即利用高速时钟将判断和操作过程分为多个周期完成,简化设计。而显示模块主要完成鼠,蛇,墙以及分数,剩余时间的显示,而此模块要独立于显示内容,其内容与控制模块进行修改,这样使两个模块可以独立地进行工作,具有很好的扩展性和实现性。2.总体框图(1)系统机构图贪吃蛇控制电路游戏初始设置:墙、蛇身、鼠初始化方向控制时间、速度控制剩余时间显示点阵显示○○○○○○○○○○○○○○○○○○●○○●○○○○○○○●○○○○○○○●○○○○○○○●○○○○○○○○○○●●●●○○○○计分显示老鼠位置控制墙4点鼠蛇身4点(2)逻辑流程图流程图:否是是按下一次再次按下计时、计分开始,墙初始化60秒时间到鼠初始化位置并显示蛇身移动鼠位置重置上下左右蛇初始化位置并显示撞蛇撞边撞墙吃鼠5秒时间到否是否否否否是是是否是分数增加长度增加等待按键Start/pause是否按下ResetStart/pauseMDS图:startkeydowntimeou(3)功能模块图:CPWaitMovingRestartTimeoutResetdownMovingintoSnakeMovingintoboundaryChangedirectionEatingmouseNewmouse显示存储器控制器方向控制模块计时器计分器分频器点阵显示Start/pause控制模块Reset控制模块3.模块设计(1)分频模块:由于实验板上的时钟频率为50MHZ,相对于电路延时时间来说,频率太高,故需要分频将频率降低来适应器件的反应时间要求;同时用来扫描点阵和数码管的频率与用来控制的时钟信号频率是不同的,相对而言用来扫描显示的频率要相对低一些,用来扫描按键和控制的时钟频率要低一些,所以此处将50MHZ的频率分为1MHZ和2KHZ,1MHZ的频率用来扫描按键和进行信号控制,2KHZ用于扫描显示,在控制模块中,又进行了二次分频,用来控制蛇的移动,鼠步的减少,倒计时时间等,不选择直接在分频模块中将所有的所需时钟频率全部分出的原因是在不同的进程中可能会对同一控制信号进行修改,所以这样就会出现多重驱动的问题,然而在进程内部进行二次分频就可以避免出现这种情况。(2)游戏控制模块:这部分又可细分为四个小的模块:蛇状态判断模块,鼠随机产生模块,方向控制模块,蛇移动及时间控制模块。1.蛇状态判断模块:主要完成对蛇“死”“活”状态的修改,而产生状态变化的情况有:按下reset键,改变开始暂停键的状态,蛇撞墙,总计是时间到,以及游戏通关(即游戏总得分为3分即为通关),而这些情况中reset键的优先级最高,当按下reset键时蛇的状态都会被置为“死(0)”的状态,而当“start/pause”键状态为“1”的话蛇的状态将会被置成“活(1)”,蛇撞墙,总时间到,通关都会将蛇的状态置为“死(0)”。2.鼠随机产生模块:这部分主要完成产生新的老鼠坐标,思路是利用两个不同模值的计数器,分别对8取模,获得0到7之间的两个数作为新老鼠的横纵坐标,同时对产生的新左边进行判断,当和墙的坐标重合时进行修正,此处是将横坐标减一。而新老鼠的产生时刻是总计是时间到,鼠被吃掉,或蛇走十步后,刚开始是把这一部分单独作为一个线程,但是后来由于对鼠的产生标志信号的控制不是很好处理,所以这部分只是负责产生下次新老鼠的位置坐标,而真正的赋值操作在对蛇的控制状态线程里面。3.方向控制模块:主要对控制蛇移动方向的信号进行修改,敏感信号为reset键和按键扫描时钟,但reset键的优先级较高,当reset键按下时,方向控制信号将会被设置成默认的向右,而其他四个方向控制键的检测则是在时钟信号的驱动下进行,由于按键扫描时钟频率为1MHZ,相对较高,所以不会有很大的迟钝感觉。4.蛇移动和倒计时模块:由于此处设计的蛇移动时间间隔恰好是一秒,和倒计时的时间间隔一样,所以将这两个功能放在了一个进程中,这个进程中同时包含对蛇初始位置,总计时时间,鼠步的初始时间等初始化设置,原因也是为了避免出现双重驱动的问题。此处的时钟信号为1MHZ,在此线程内部进行了二次分频将其分为1HZ,用来控制蛇的移动以及时间计数,在1HZ时钟的驱动下进行剩余时间,剩余鼠步,以及蛇位置坐标的修改控制。(3)显示模块:此模块主要完成鼠,墙,蛇,分数,剩余时间的显示,因为要同时显示这几项,故需要进行动态扫描,即在某一时间段内只显示其中一位,程序中用一个模为六的计数器实现在不同的计数值下显示不同的项,分别如下:T=0时,扫描老鼠坐标T=1时,扫描蛇头坐标和右边第一个数码管为SCORE显示T=2时,扫描蛇身2坐标T=3时,扫描蛇身3坐标和左边第一个数码管为总计时高位计时显示T=4时,扫描蛇身4坐标。T=5时,扫描墙的坐标和左边第四个数码管为总计时的低位计时显示功能说明:1.游戏初始化:按下reset(btn0)键,会对鼠的位置,蛇的位置以及默认移动方向,游戏总时间进行初始化设置,此时分数显示为零,时间为六十秒。2.游戏开始和暂停:当初始化之后将sw0拨上去即为开始游戏,拨下来即为暂停,暂停后蛇,鼠的位置保持不变,分数时间保持不变,再次将sw0拨回去即可继续游戏。3.方向控制:btn7,btn6,btn5,btn4分别对应着上下左右四个方向。4.当蛇撞墙时,蛇死,游戏重启。5.当游戏总时间到时,游戏重启。6.当老鼠十秒后没有被吃掉将会出现在别的地方。7.当老鼠被蛇吃掉后将会出现新的老鼠,并且分数将会加一分。8.当吃鼠分数达到三分时,点阵将会全亮,分数固定显示,剩余时间位熄灭,表示游戏通关,按下reset键可重新开始游戏。三.仿真波形及波形分析仿真时的clk_kscan频率为clk_sscan的2倍,clk_kscan的内部分频比为1:100.(1)按下reset键后鼠,蛇的位置初始化鼠初始位置蛇初始位置墙位置Start=’0’,故蛇的位置没有变(2)蛇的位置右移(3)分数和时间的初始化显示Start=’1’蛇的位置向右移动初始化分数0初始化时间高位6初始化时间地位0(4)在仿真波形的设置中曾将direction设为“1000”,故蛇的移动方向变为向上,同时也可观察新老鼠的产生(5)在游戏过程中再次按按下reset键将会重启游戏产生新的鼠的坐标蛇向上移动再次复位后蛇鼠坐标重置(6)总得计时时间的变化四.源程序(1)分频模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydivisport(clk:instd_logic;clk_s,clk_k:outstd_logic);endentity;architecturediv_aofdivissignalcounter_sscan:integerrange0to24999;--分频得2khz时钟signalcounter_kscan:integerrange0to49;--分频得1mhz时钟begindiv_sscan1:process(clk)beginifclk'eventandclk='1'thenifcounter_sscan=24999thencounter_sscan=0;elsecounter_sscan=counter_sscan+1;剩余时间减一endif;endif;endprocessdiv_sscan1;div_sscan2:process(counter_sscan)beginifcounter_sscan12499then--占空比为50%clk_s='1';elseclk_s='0';endif;endprocessdiv_sscan2;div_kscan1:process(clk)beginifclk'eventandclk='1'thenifcounter_kscan=49thencounter_kscan=0;elsecounter_kscan=counter_kscan+1;endif;endif;endprocessdiv_kscan1;div_kscan2:process(counter_kscan)beginifcounter_kscan25thenclk_k='1';elseclk_k='0';endif;endprocessdiv_kscan2;enddiv_a;(2)主程序模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityTancsisport(clkk:instd_logic;--系统时钟start:instd_logic;--开始/暂停按键reset:instd_logic;--重启按键direction:instd_logic_vector(3downto0);--方向控制按键row:outstd_logic_vector(7downto0);--点阵的行输出col:outstd_logic_vector(7downto0);--点阵的列输出d_light:outstd_logic_vector(6downto0);--数码管的段选输出w_light:outstd_logic_vector(5downto0)--数码管的位选输出);endTancs;architecturetancs_aofTancsissignalclk_sscan:std_logic;--用于扫面显示的时钟信号signalclk_kscan:std_logic;--用于按键扫描的时钟信号signaltimeh:integerrange0to9;--剩余时间的高位signaltimel:integerrange0to9;--剩余时间的低位signalmousetime:integerrange0to9;--剩余老鼠时间signalscore:integerrange0to9;--得分signaltemp_show:integerrange0to5;--用于动态显示的计数器signaltemp_light:integerrange0to9;--用于暂存需要显示的数码的--段码signaltemp_turn:integerrange0to3;--用于方向控制的信号signalmcx:integerrange0to100;--用于随机产生老鼠横坐标的计数器signalmcy:integerrange0to200;--用于随机产生老鼠纵坐标的计数器signaltime_flag:std_logic;--剩余时间是否用完的标志位signalcounter_move:integerrange0to1499999;--内分频计数器signalstate:std_logic;--标志蛇当前状态,‘1’为活,‘0’为死signalsx0,sy0,sx1,sy1,sx2,sy2,sx3,sy3,--蛇的当前位置坐标wx,wy0,wy1,wy2,wy3,
本文标题:数电综合实验报告-贪吃蛇
链接地址:https://www.777doc.com/doc-4208626 .html