您好,欢迎访问三七文档
简易贪食蛇游戏机学院:信息与通信工程专业:电子信息工程班级:08101姓名:孙南星学号:08210004班内序号:4一.设计课题的任务要求用一个8×8点阵做为基本显示屏,4个连续移动的的发光点表示一条蛇,用任意出现的一个亮点表示老鼠,用4个排成一条线的发光点表示“墙”,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,则游戏结束。1.老鼠出现的地方是随机的,在某个地点出现的时间是蛇走15步的时间,如果15步之内没有被吃掉,它就会在其它地方随机出现;2.用数码管显示得分情况和游戏的剩余时间(时间满为0~49共50秒),每吃掉一只老鼠就加一分。二.系统设计1设计思路:根据8×8点阵共有64个点,设置含有64个状态的状态机。状态的转移方式由当前方向决定,由于设置蛇共有4个点,因而输出为4个状态。通过方向状态机控制“贪食蛇”移动的方向,通过移动状态机实现“贪食蛇”四个点(4个状态)位置的改变。后将此4状态输出到循环显示电路,通过计数器循环显示当前“贪食蛇”所在位置,通过方向控制键的随机性设置随机显示改变老鼠的位置,通过坐标判断来改变蛇的状态和得分。最后利用循环实现并行到串行的装换,后经译码电路输出。2总体框图:(1)系统结构图贪吃蛇控制电路游戏初始设置:墙、蛇身、鼠初始化方向控制时间、速度控制剩余时间显示点阵显示○○○○○○○○○○○○○○○○○○●○○●○○○○○○○●○○○○○○○●○○○○○○○●○○○○○○○○○○●●●●○○○○计分显示老鼠位置和时钟墙4点鼠蛇身4点总时间鼠15步时间(2)逻辑流程图流程图是计时、计分开始,墙初始化开始50秒总时间到鼠初始化位置并显示蛇身移动鼠位置重置上下左右蛇初始化位置并显示撞蛇撞边撞墙吃鼠15步时间到否是否否否否是是是否是分数增加MDS图(3)功能模块图显示存储器蛇身状态Sn总时间到计时计分重置,蛇身S0吃鼠撞墙、蛇身、边界蛇身状态Sn+1未撞墙、蛇身、边界鼠重置50秒总时间未到鼠15步时间到鼠时间未到鼠控制器方向控制模块计时器计分器分频器点阵显示3模块设计(1)分频模块+RESET鼠位控制模块:分频器:因为原有低频时钟为1MHZ,故11将时钟周期设为CLK的1024倍能比较好的识别和操作。其中,点阵显示扫描模块和数码管显示模块以CLK为时钟工作,贪食蛇的游戏过程设定是按CLK的1024倍时钟周期来运行。RESET控制和鼠位:RESET由SW1控制,当RESET置1时,鼠位初始化为最初值,蛇的死亡状态DEATH置为1,由于在不同进程中不能对同一信号赋值因此鼠位置TX、TY和蛇死亡状态DEATH都在该进程中赋值。两部分if语句:⑴.当总计时时间为满49秒时,蛇重置为活动状态DEATH=‘0’,当总计时时间为0秒时,蛇状态DEATH=‘1’,在总时间计时期间如果蛇撞到墙则蛇状态DEATH=‘1’。⑵.当蛇状态DEATH=‘1’,或是鼠15步倒计时时间到,或是蛇吃到鼠,则鼠的位置根据当前方向键的随机性来重新赋值。改模块曾经尝试将分频与控制模块分开成两个进程,但是增加了宏单元使用,为了实验的可完成性故将两个模块并为一个进程。(2)游戏模块:游戏初始化:时钟周期为clk的1024倍即TMP(9)。8*8的点阵共64位的状态机,蛇是输出4个状态的状态机。在游戏开始时,蛇、鼠的位置初始化,倒计时时钟、老鼠时钟、得分显示、蛇的初始运动方向向右。1.鼠:老鼠15步时钟倒计时。如果鼠被蛇吃掉则计分加1。2.总倒计时:一但总时间到或游戏重新开始,倒计时重新赋值。3.蛇:根据输入的方向键信号,改变方向控制信号TURN的只,进而改变蛇头坐标。蛇身坐标按照前一位置的坐标依次赋值。在这过程中判断:当蛇的输入方向与本身运动方向相对时,则蛇不改变运动方向,即蛇本来向上运动,方向向下的操作将不起作用。当蛇的坐标和运动方向会撞边时,蛇的生存状态改为死,游戏自动重启。(3)显示模块:因为所有状态不能同时显示,故循环显示电路分别扫描。CLK时钟下以6为周期循环,根据视觉暂留则可看到较为稳定的画面。T=0时,扫描老鼠坐标。T=1时,扫描蛇头坐标和左数第一个数码管为SCORE显示T=2时,扫描蛇身2坐标T=3时,扫描蛇身3坐标和左数第三个数码管为总计时高位计时显示T=4时,扫描蛇身4坐标。T=5时,扫描墙的坐标和左数第四个数码管为总计时的低位计时显示。功能说明:1游戏重置:拨码开关SW1置‘1’时,游戏重启。蛇位置、老鼠位置初始化,得分显示为0,倒计时显示为40.2方向控制:btn1、btn2、btn3、btn4、分别对应控制蛇的左、下、上、右来移动蛇身。3当蛇撞墙时,蛇死,游戏重启。4当蛇撞边时,蛇死,游戏重启。5当蛇吃到老鼠时,计分加1,老鼠改变位置。6当蛇在老鼠的时钟内未吃到老鼠时,老鼠改变位置。7当蛇在总时间倒计时时钟到时之时,游戏自动重启。三.仿真波形和波形分析此图为TMP(1)即2倍CLK分频时钟情况下的波形图。如图中所示,设置游戏玩家一直按向上按键,可观察到波形的行列值的变化。由于程序初始设计时行列和点阵行列不一致。○○○○○○○○●○○○○○○○○○○○○○○○●○○○○○○○○○○○○●○○●○○○○○○○○○○●○●○○●○○○●○○○○○○○○●○○○○○○○○○○○○○○○●○○○○●●●●○○○○○○○○○○○○○○○○○○●●●●○○○○○○○○○○○○为了解决这一问题在管脚下载的时候将行与列的位置进行了调整。墙墙蛇蛇从图中可以看出,数码管显示和数码管控制的得分、倒计时模块的情墙4点列坐标蛇4点列坐标鼠列坐标蛇4点列坐标蛇4点行坐标墙4点行坐标8方向控制向上蛇死亡后重置初始坐标数码管控制波形总计时49计分0况同时改变。四、源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCCTANISPORT(CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;--复位信号TURN_B:INSTD_LOGIC_VECTOR(3DOWNTO0);--方向选择ROW:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵行显示COL:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵列显示LIGHT:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--数码管显示LXC:OUTSTD_LOGIC_VECTOR(5DOWNTO0)--数码管控制);ENDCCTAN;ARCHITECTURECC_SNAKEOFCCTANISSIGNALTMP:STD_LOGIC_VECTOR(9DOWNTO0):=0000000000;--分频参数SIGNALTMPSHOW:INTEGERRANGE0TO5;--循环计数参数SIGNALTIMEH:INTEGERRANGE0TO4;--计总时50秒SIGNALTIMEL:INTEGERRANGE0TO9;SIGNALMOUSET:INTEGERRANGE0TO15;--计mouset15步SIGNALSCORE:INTEGERRANGE0TO4;--计分数4分SIGNALTMPLIGHT:INTEGERRANGE0TO9;--9位数码管显示参数SIGNALTURN:INTEGERRANGE0TO3;--运动方向SIGNALDEATH:STD_LOGIC;--DEATH为'1'时蛇死亡SIGNALSX0,SY0,SX1,SY1,SX2,SY2,SX3,SY3,--蛇4点坐标WX,WY0,WY1,WY2,WY3,--墙坐标TX,TY,TXT,TYT:INTEGERRANGE0TO7;--鼠的坐标BEGINWX=5;WY0=5;WY1=4;WY2=3;WY3=2;--墙坐标初始化DIV:PROCESS(CLK,RESET)BEGINIFRESET='1'THEN--复位操作DEATH='1';--设置蛇死亡状态TX=3;TY=4;--设置初始鼠位ELSIFCLK'EVENTANDCLK='1'THENTMP=TMP+1;--分频器分为最长2的十次方模长频率IFTIMEH=4ANDTIMEL=9THEN--当时间重置为满时,蛇为活动状态DEATH='0';ELSIFTIMEH=0ANDTIMEL=0THEN--TIMEOVER蛇死亡状态DEATH='1';ELSIFSX0=WXAND(SY0=WY0ORSY0=WY1ORSY0=WY2ORSY0=WY3)THEN--蛇撞到墙为死亡状态DEATH='1';ENDIF;IFDEATH='1'ORMOUSET=0OR(SX0=TXANDSY0=TY)THEN--如果鼠时间到或是蛇吃鼠TXT=TX;TYT=TY;IFTX=5THENTX=6;ELSIFTX+TURN-50THENTX=TX+TURN-5;ELSETX=TX+TURN+2;ENDIF;IFTY=7THENTY=0;ELSETY=TY+1;ENDIF;--IFTY+TURN-70THEN--TY=TY+TURN-7;--ELSETY=TY+TURN;--ENDIF;ENDIF;--随机鼠位ENDIF;ENDPROCESS;SNAKE:PROCESS(TMP(1),DEATH)--snake运行进程BEGINIFDEATH='1'THEN--游戏开始初始化MOUSET=15;--鼠时间初始化SCORE=0;--分数初始化TIMEH=4;TIMEL=9;--总计时初始化SX0=3;SY0=0;SX1=2;SY1=0;SX2=1;SY2=0;SX3=0;SY3=0;--蛇坐标初始化TURN=1;--初始方向设置向右ELSIFTMP(1)'EVENTANDTMP(1)='1'THENIF(MOUSET=0)THENMOUSET=15;ELSEMOUSET=MOUSET-1;随机鼠TY坐标,因宏单元不足,暂用每次随机时TY=TY+1;代替随机鼠TX坐标,玩家当时按下的方向键有一定随机性,用此来控制鼠坐标改变。ENDIF;--鼠15步倒计时IF(SX0=TXTANDSY0=TYT)THEN--吃鼠SCORE=SCORE+1;--计分MOUSET=9;ENDIF;IFTIMEL=0ANDTIMEH/=0THENTIMEL=9;TIMEH=TIMEH-1;ELSETIMEL=TIMEL-1;ENDIF;--50s计时CASETURN_BIS--按键和对应方向设置WHEN1000=IF(TURN/=2)THENTURN=0;ENDIF;--上WHEN0100=IF(TURN/=3)THENTURN=1;ENDIF;--右WHEN0010=IF(TURN/=0)THENTURN=2;ENDIF;--下WHEN0001=IF(TURN/=1)THENTURN=3;ENDIF;--左WHENOTHERS=TURN=TURN;ENDCASE;CASETURNISWHEN0=IF(SY0=7)THENTIMEH=0;TIMEL=0;--当蛇向下运动时向上不可用ELSESY0=SY0+1;ENDIF;--上WHEN1=IF(SX0=7)THENTIMEH=0;TIMEL=0;ELSESX0=SX0+1;ENDIF;--右WHEN2=IF(SY0=0)THENTIMEH=0;TIMEL=0;ELSESY0=SY0-1;ENDIF;--下WHEN3=IF(SX0=0)THENTIMEH=0;TIMEL=0;当蛇本身向下运动的时候,向上的方向控制不能运行。ELSESX0=SX0-1;ENDIF;--左WHENOTHERS=TURN=TURN;ENDCASE;SX3=SX2;SY3=SY2;SX2=SX1;SY2=SY1;SX1
本文标题:VHDL贪吃蛇报告
链接地址:https://www.777doc.com/doc-1864084 .html