1/17点阵赛车游戏学院:信息与通信工程学院专业:通信工程班级:姓名:学号:班内序号:2/17一、设计课题的任务要求用8×8点阵进行5秒倒计时显示,当5秒倒计时结束后,点阵显示赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。用红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程,游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。通过按键BTN0进行复位,控制点阵返回到初始状态。二、系统设计1、设计思路这个过程乍一看蛮复杂的,但是当我经过仔细分析后发现,我的代码可以按照这个游戏的运行过程来写。这个游戏分为4个状态,即倒计时,运行,成功和失败。倒计时部分根据不同数字在点阵上的位置很容易设计出来,运行部分便是初始化赛道,赛车的位置,然后用按键来控制赛车运动,在这个过程中要不断判断赛车是否撞墙和到达终点,如果到达终点便进入第三个状态,成功,即显示“V”;若果撞墙便进入第四个状态,失败,即显示“X”。在游戏运行的同时数码管还要计时。2、总体框图(1)系统结构图3/17(2)ASM图译码显示器分频器控制器计时器赛道及赛车CPRESETBTN1BTN2BTN3启动NY是否碰到边界边界是否到达终点边界显示“V”显示“×”计时移动是否复位是否复位YNNYNYN4/17(3)状态转移图(4)功能模块图显示存储器控制器方向控制模块计时器数码管分频器点阵显示倒计时移动显示“V”显示“X”RESETRESETRESET到终撞墙5/173、模块设计(1)分频模块分频器:因为原有低频时钟为50MHZ,如果直接用这个时钟信号同时实现计时和显示部分,故需两个分频器,分别将时钟频率分为1Hz和1kHz,1Hz用来控制倒计时和游戏运行过程中的计时,1kHz用来控制点阵和数码管的显示。(2)游戏模块刚开始的代码有一个判断是否复位的代码,如果RESET=1,将代码中定义的一些信号初始化,之后整个过程分为四个状态,即STATE可取0,1,2,3四个值。0处于倒计时状态,1处于用按键控制赛车运动的状态,2处于到达终点的状态,并且显示“V”,3处于失败的状态,并且显示“X”。当STATE=0时,游戏处于倒计时状态,倒计时五秒,利用五个数字在点阵上的不同位置初始化点阵,分别对应五个数字,在时钟1Hz下做倒计时五秒的工作。当STATE=1时,处于用按键控制赛车运动的状态,此期间分别用BTN1,BTN2,BTN3来控制赛车的右,前,左的运动方向,运动期间还要不断判断赛车是否撞到墙或者障碍物,以及判断赛车是否到达终点,一次来确定游戏是否进入STATE=2或STATE=3状态。当STATE=2时,要在点阵上显示“V”,即给点阵矩阵初始化显示此图形的数据。当STATE=3时,要在点阵上显示“X”,即给点阵矩阵初始化显示6/17此图形的数据。(3)显示模块因为所有状态不能同时显示,故循环显示电路分别扫描。当时钟频率足够大时,根据视觉暂留则可看到较为稳定的画面。点阵显示是在时钟频率1kHz下一行一行扫描,这样在不同时候就可以显示不同的图形,比如倒计时的5,4,3,2,1和赛道,赛车的位置;其次是数码管的显示,数码管首先有个控制计数的代码,此计数是在时钟频率1Hz下工作的,然后在时钟频率1kHz的控制下分别让两个数码管显示,此即为计时器的显示。三、仿真波形及波形分析倒计时波形数码管显示及波形点阵显示倒计时波形7/17点阵显示波形四、源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCARISPORT(CLK:INSTD_LOGIC;--时钟信号RESET:INSTD_LOGIC;--复位输入CONTROL:INSTD_LOGIC_VECTOR(2DOWNTO0);--赛车控制ROW:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--行控制输出COLR,COLG:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--列控制输出CAT:OUTSTD_LOGIC_VECTOR(5DOWNTO0);--数码管选通数码管显示01,02,03点阵列显示波形点阵行显示波形8/17DISPLAY:OUTSTD_LOGIC_VECTOR(6DOWNTO0)—数码管显示);ENDCAR;ARCHITECTUREbehaveOFCARISSIGNALTEMP1:INTEGERRANGE0TO49999;--分频信号SIGNALTEMP2:INTEGERRANGE0TO49999999;SIGNALCLK1K:STD_LOGIC;--频率1kHz时钟SIGNALCLK1HZ:STD_LOGIC;--频率1Hz时钟SIGNALTIMEH:INTEGERRANGE0TO5;--十位计数SIGNALTIMEL:INTEGERRANGE0TO9;--个位计数SIGNALLIGHTH:STD_LOGIC_VECTOR(6DOWNTO0);--十位数码管控制信号SIGNALLIGHTL:STD_LOGIC_VECTOR(6DOWNTO0);--个位数码管控制信号TYPEPRESENT_STATEIS(H,L);--自定义变量SIGNALP_STATE:PRESENT_STATE;SIGNALSTATE:INTEGERRANGE0TO3;--四个状态控制信号SIGNALCOUNT:INTEGERRANGE0TO6;--倒计时控制信号SIGNALCX,CY:INTEGERRANGE0TO7;--赛车坐标控制信号SIGNALROWS:STD_LOGIC_VECTOR(7DOWNTO0);--行控制信号SIGNALCOLR7,COLR6,COLR5,COLR4,COLR3,COLR2,COLR1,COLR0,--列控制信号COLG7,COLG6,COLG5,COLG4,COLG3,COLG2,COLG1,COLG0:STD_LOGIC_VECTOR(7DOWNTO0);BEGINDIV1K:PROCESS(CLK)--分频1kHzBEGINIFCLK'EVENTANDCLK='1'THENIFTEMP1=49999THENTEMP1=0;ELSETEMP1=TEMP1+1;ENDIF;IFTEMP125000THENCLK1K='0';ELSECLK1K='1';ENDIF;ENDIF;ENDPROCESS;DIV1HZ:PROCESS(CLK)--分频1HzBEGIN9/17IFCLK'EVENTANDCLK='1'THENIFTEMP2=49999999THENTEMP2=0;ELSETEMP2=TEMP2+1;ENDIF;IFTEMP225000000THENCLK1HZ='0';ELSECLK1HZ='1';ENDIF;ENDIF;ENDPROCESS;GAMERUN:PROCESS(CLK1HZ,RESET)--游戏运行进程BEGINIFRESET='1'THEN--复位和初始化STATE=0;COUNT=6;CX=2;CY=0;TIMEH=0;TIMEL=0;COLG7=00000000;COLG6=00000000;COLG5=00000000;COLG4=00000000;COLG3=00000000;COLG2=00000000;COLG1=00000000;COLG0=00000000;ELSIFCLK1HZ'EVENTANDCLK1HZ='1'THENCASESTATEISWHEN0=CASECOUNTIS--点阵倒计时WHEN6=COUNT=5;COLR7=00000000;COLR6=00000000;COLR5=00000000;COLR4=00000000;COLR3=00000000;COLR2=00000000;COLR1=00000000;10/17COLR0=00000000;WHEN5=COUNT=4;COLR7=00111100;COLR6=00100000;COLR5=00100000;COLR4=00111100;COLR3=00000100;COLR2=00000100;COLR1=00000100;COLR0=00111100;WHEN4=COUNT=3;COLR7=00100100;COLR6=00100100;COLR5=00100100;COLR4=00111100;COLR3=00000100;COLR2=00000100;COLR1=00000100;COLR0=00000100;WHEN3=COUNT=2;COLR7=00111100;COLR6=00000100;COLR5=00000100;COLR4=00111100;COLR3=00000100;COLR2=00000100;COLR1=00000100;COLR0=00111100;WHEN2=COUNT=1;COLR7=00111100;COLR6=00000100;COLR5=00000100;COLR4=00111100;COLR3=00100000;COLR2=00100000;COLR1=00100000;COLR0=00111100;WHEN1=COUNT=0;COLR7=00001000;COLR6=00001000;COLR5=00001000;COLR4=00001000;COLR3=00001000;COLR2=00001000;11/17COLR1=00001000;COLR0=00001000;WHEN0=COUNT=6;STATE=1;ENDCASE;WHEN1=IFTIMEL=9THEN--数码管计时TIMEL=0;IFTIMEH=5THENTIMEH=0;IFCY/=7THENSTATE=3;ELSESTATE=2;ENDIF;ELSETIMEH=TIMEH+1;ENDIF;ELSETIMEL=TIMEL+1;ENDIF;COLG7=00001110;--初始化赛道COLG6=00000000;COLG5=00000000;COLG4=00000000;COLG3=00000000;COLG2=00000000;COLG1=00000000;COLG0=00000000;COLR7=00011111;COLR6=00010001;COLR5=00010001;COLR4=00100010;COLR3=01000100;COLR2=10001000;COLR1=10001000;COLR0=10001000;CASECYIS--赛车坐标WHEN0=COLG0(7-CX)='1';WHEN1=COLG1(7-CX)='1';WHEN2=COLG2(7-CX)='1';WHEN3=COLG3(7-CX)='1';WHEN4=COLG4(7-CX)='1';WHEN5=COLG5(7-CX)='1';12/17WHEN6=COLG6(7-CX)='1';WHEN7=COLG7(7-CX)='1';ENDCASE;CASECONTROLIS--按键控制赛车WHEN100=CX=CX-1;WHEN010=CY=CY+1;WHEN001=CX=CX+1;WHENOTHERS=NULL;ENDCASE;CASECYIS--判断移动后是否撞墙WHEN0=IFCOLR0(7-CX)='1'THENSTATE=3;EL