点阵赛车游戏实验报告姓名班级学号一、要求和任务1.用8×8点阵进行5秒倒计时显示,如下图所示。2.当5秒倒计时结束后,点阵显示下图所示的赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。图中的红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。要求:用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程(即图2中的绿色位置),游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。通过按键BTN0进行复位,控制点阵返回到初始状态。提高要求:有多种游戏赛道可选,5秒倒计时显示后赛道随机出现。赛车的初始位置随机出现。在赛车行进过程中,赛道中随机出现障碍物(用8×8点阵中的一个LED表示),通过BTN1~BTN3三个按键的控制躲避障碍物,走完全程。若赛车碰到障碍物和赛道,则游戏失败。二、系统设计(包括设计思路、总体框图、分块设计)总体框图:三、仿真波形及波形分析Button0按下,点阵显示51秒后,点阵显示42后,点阵显示33秒后,显示24秒后,显示15秒后,数码管显示59两个向左按键,赛车碰壁,显示失败‘x’又复位之后,又54321减下来又开始重复。四、源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYsaicheISPORT(CLOCK:INSTD_LOGIC;button0,button1,button2,button3:INSTD_LOGIC;--四个按键:复位键、右、上、左ROW:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--控制车道的横向量COL_RED:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--控制车道的红色列向量COL_GREEN:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--控制车道的绿色列向量LIGHT:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--段选输出LIGHT_EN:OUTSTD_LOGIC_VECTOR(5DOWNTO0)--位选输出);ENDsaiche;ARCHITECTUREMLDOFsaicheISSIGNALCLK1hz,CLK_5K,CLK_1K,CLK_2K,CLK_100hz,CLK_200hz:STD_LOGIC;--1hz,5khz,1Khz,2Khz,100hz,200hz时钟信号SIGNALN:INTEGERRANGE0TO6;--产生随机赛道时的判断数SIGNALNUM:INTEGERRANGE0TO20;--0号赛道逐点扫描时点的序列SIGNALNUM1:INTEGERRANGE0TO19;--1号赛道逐点扫描时点的序列SIGNALNUM2:INTEGERRANGE0TO18;--2号赛道逐点扫描时点的序列SIGNALNUM3:INTEGERRANGE0TO22;--3号赛道逐点扫描时点的序列SIGNALT_HIGH:INTEGERRANGE0TO5;--倒计时高位SIGNALT_LOW:INTEGERRANGE0TO9;--倒计时低位SIGNALCOUNT200:INTEGERRANGE0TO250000;--各分频用的计数SIGNALCOUNT2:INTEGERRANGE0TO50000;SIGNALCOUNT3:INTEGERRANGE0TO50000;SIGNALCOUNT:INTEGERRANGE0TO50000000;SIGNALCOUNT1:INTEGERRANGE0TO10000;SIGNALCOUNT_100hz:INTEGERRANGE0TO500000;SIGNALtmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8:std_logic;--消抖时用的临时信号SIGNALCNT,CNT1:INTEGERRANGE0TO1000;SIGNALFAIL,SUCCESS,TIME_UP:STD_LOGIC;--FAILS赛车碰到车道的失败信号,SUCCESS赛车到终点的成功信号--TIME_UP60s时间到的失败信号SIGNALSTART:INTEGERRANGE0TO6;--START=154321计时到的开启信号SIGNALTIMES:INTEGERRANGE0TO7;--点阵显示状态判别信号SIGNALSEL:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALRST,DIRECTION_LEFT,DIRECTION_RIGHT,DIRECTION_UP:STD_LOGIC;--由四个按键经过消抖处理后,产生的四个控制信号TYPEDIANISARRAY(INTEGERRANGE)OFINTEGERRANGE0TO7;SIGNALSX,SY,SX1,SY1:INTEGERRANGE0TO7;--SX,SY赛车坐标,SX1,SY1障碍坐标CONSTANTWY:DIAN(0TO18):=(0,0,0,1,2,3,3,3,4,4,4,5,6,7,7,7,4,5,6);--0号赛道红绿色车道纵坐标,后三个是绿色车道纵坐标CONSTANTWX:DIAN(0TO18):=(0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,7,7,7);--0号赛道红绿色车道的横坐标,后三个是绿色车道横坐标CONSTANTWY1:DIAN(0TO17):=(1,0,1,0,1,2,1,2,4,5,6,7,7,6,5,5,3,4);--1号赛道红绿色车道纵坐标,后两个是绿色车道纵坐标CONSTANTWX1:DIAN(0TO17):=(0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,7,7);--1号赛道红绿色车道的横坐标,后两个是绿色车道横坐标CONSTANTWY2:DIAN(0TO16):=(1,2,1,1,2,3,4,5,4,5,6,6,5,6,7,7,6);--2号赛道红绿色车道纵坐标,后一个是绿色车道纵坐标CONSTANTWX2:DIAN(0TO16):=(0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,7);--2号赛道红绿色车道的横坐标,后一个是绿色车道横坐标CONSTANTWY3:DIAN(0TO20):=(1,1,1,1,0,0,0,0,6,6,6,6,6,6,6,6,1,2,3,4,5);--3号赛道红绿色车道的横坐标,后五个是绿色车道横坐标CONSTANTWX3:DIAN(0TO20):=(0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,7,7,7,7,7);--0号赛道红绿色车道的横坐标,后五个是绿色车道横坐标SIGNALSTATE:INTEGERRANGE0TO1;TYPEFIGUREISARRAY(INTEGERRANGE)OFINTEGERRANGE0TO9;SIGNALSHOW:FIGURE(9DOWNTO0);--数码显示BEGINp1:PROCESS(CLOCK)--分频部分BEGINIFCLOCK'EVENTANDCLOCK='1'THENCOUNT=COUNT+1;COUNT1=COUNT1+1;COUNT_100hz=COUNT_100hz+1;COUNT200=COUNT200+1;COUNT2=COUNT2+1;COUNT3=COUNT3+1;IFCOUNT=24999999THEN--1HZ分频CLK1hz='1';ELSIFCOUNT24999999ANDCOUNT=49999999THENCLK1hz='0';ELSIFCOUNT=50000000THENCOUNT=0;ENDIF;IFCOUNT2=9998THENCLK_1K='1';ELSIFCOUNT29998ANDCOUNT2=19997THENCLK_1K='0';ELSIFCOUNT2=19998THENCOUNT2=0;ENDIF;IFCOUNT3=24999THEN--1KHZ分频CLK_2K='1';ELSIFCOUNT324999ANDCOUNT3=49999THENCLK_2K='0';ELSIFCOUNT3=50000THENCOUNT3=0;ENDIF;IFCOUNT1=4999THEN--5KHZ分频CLK_5K='1';ELSIFCOUNT14999ANDCOUNT1=9999THENCLK_5K='0';ELSIFCOUNT1=10000THENCOUNT1=0;ENDIF;IFCOUNT_100hz=249999THEN--100HZ分频CLK_100hz='1';ELSIFCOUNT_100hz249999ANDCOUNT_100hz=499999THENCLK_100hz='0';ELSIFCOUNT_100hz=500000THENCOUNT_100hz=0;ENDIF;IFCOUNT200=124999THEN--200HZ分频CLK_200hz='1';ELSIFCOUNT200124999ANDCOUNT200=249999THENCLK_200hz='0';ELSIFCOUNT200=250000THENCOUNT200=0;ENDIF;ENDIF;ENDPROCESS;P2:PROCESS(CLK_100hz,button0,button1,button2,button3,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8)--消抖部分BEGINIF(CLK_100hz'eventANDCLK_100hz='0')THENtmp2=tmp1;tmp1=button0;tmp4=tmp3;tmp3=button1;tmp6=tmp5;tmp5=button2;tmp8=tmp7;tmp7=button3;ENDIF;RST=CLK_100hzANDtmp1AND(NOTtmp2);DIRECTION_RIGHT=CLK_100hzANDtmp3AND(NOTtmp4);DIRECTION_UP=CLK_100hzANDtmp5AND(NOTtmp6);DIRECTION_LEFT=CLK_100hzANDtmp7AND(NOTtmp8);ENDPROCESS;p0:PROCESS(CLK_1K)--产生随机数BEGINIFCLK_1K'EVENTANDCLK_1K='1'THENifTIMES=0THENN=N;ELSEIFN=6THENN=0;ELSEN=N+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;p3:PROCESS(CLK_2K)BEGINIFCLK_2K'eventANDCLK_2K='1'THENIFNUM=20THENNUM=0;ELSENUM=NUM+1;ENDIF;IFNUM1=19THENNUM1=0;ELSENUM1=NUM1+1;ENDIF;IFNUM2=18THENNUM2=0;ELSENUM2=NUM2+1;ENDIF;IFNUM3=22THENNUM3=0;ELSENUM3=NUM3+1;ENDIF;ENDIF;ENDPROCESS;p4:PROCESS(CLK_5K)BEGINifCLK_5K'EVENTANDCLK_5K='1'thenIFSEL=111THENSEL=000;ELSESEL=SEL+'1';ENDIF;ENDIF;ENDPROCESS;p5:PROCESS(CLK1hz,START,T_HIGH,T_LOW,SUCCESS,FAIL)--数码管显示判断部分BEGINIFSTART=5THEN