北邮数电综合实验报告.docx

上传人:b****5 文档编号:11875926 上传时间:2023-04-08 格式:DOCX 页数:20 大小:591.30KB
下载 相关 举报
北邮数电综合实验报告.docx_第1页
第1页 / 共20页
北邮数电综合实验报告.docx_第2页
第2页 / 共20页
北邮数电综合实验报告.docx_第3页
第3页 / 共20页
北邮数电综合实验报告.docx_第4页
第4页 / 共20页
北邮数电综合实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

北邮数电综合实验报告.docx

《北邮数电综合实验报告.docx》由会员分享,可在线阅读,更多相关《北邮数电综合实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

北邮数电综合实验报告.docx

北邮数电综合实验报告

北邮数电综合实验报告

点阵赛车游戏

 

学院:

信息与通信工程学院

专业:

通信工程

班级:

姓名:

学号:

班内序号:

 

一、设计课题的任务要求

用8×8点阵进行5秒倒计时显示,当5秒倒计时结束后,点阵显示赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。

用红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。

用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程,游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。

当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。

通过按键BTN0进行复位,控制点阵返回到初始状态。

二、系统设计

1、设计思路

这个过程乍一看蛮复杂的,但是当我经过仔细分析后发现,我的代码可以按照这个游戏的运行过程来写。

这个游戏分为4个状态,即倒计时,运行,成功和失败。

倒计时部分根据不同数字在点阵上的位置很容易设计出来,运行部分便是初始化赛道,赛车的位置,然后用按键来控制赛车运动,在这个过程中要不断判断赛车是否撞墙和到达终点,如果到达终点便进入第三个状态,成功,即显示“V”;若果撞墙便进入第四个状态,失败,即显示“X”。

在游戏运行的同时数码管还要计时。

2、总体框图

(1)系统结构图

 

(2)ASM图

 

(3)状态转移图

 

RESET

RESET

RESET

 

到终点

撞墙

 

(4)功能模块图

 

 

3、模块设计

(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”,即给点阵矩阵初始化显示此图形的数据。

(3)显示模块

因为所有状态不能同时显示,故循环显示电路分别扫描。

当时钟频率足够大时,根据视觉暂留则可看到较为稳定的画面。

点阵显示是在时钟频率1kHz下一行一行扫描,这样在不同时候就可以显示不同的图形,比如倒计时的5,4,3,2,1和赛道,赛车的位置;其次是数码管的显示,数码管首先有个控制计数的代码,此计数是在时钟频率1Hz下工作的,然后在时钟频率1kHz的控制下分别让两个数码管显示,此即为计时器的显示。

三、仿真波形及波形分析

倒计时波形

数码管显示及波形

点阵显示波形

四、源程序

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCARIS

PORT(

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);--数码管选通

DISPLAY:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)—数码管显示

);

ENDCAR;

ARCHITECTUREbehaveOFCARIS

SIGNALTEMP1:

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);

 

BEGIN

DIV1K:

PROCESS(CLK)--分频1kHz

BEGIN

IFCLK'EVENTANDCLK='1'THEN

IFTEMP1=49999THEN

TEMP1<=0;

ELSE

TEMP1<=TEMP1+1;

ENDIF;

IFTEMP1<25000THEN

CLK1K<='0';

ELSE

CLK1K<='1';

ENDIF;

ENDIF;

ENDPROCESS;

DIV1HZ:

PROCESS(CLK)--分频1Hz

BEGIN

IFCLK'EVENTANDCLK='1'THEN

IFTEMP2=49999999THEN

TEMP2<=0;

ELSE

TEMP2<=TEMP2+1;

ENDIF;

IFTEMP2<25000000THEN

CLK1HZ<='0';

ELSE

CLK1HZ<='1';

ENDIF;

ENDIF;

ENDPROCESS;

GAMERUN:

PROCESS(CLK1HZ,RESET)--游戏运行进程

BEGIN

IFRESET='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'THEN

CASESTATEIS

WHEN0=>

CASECOUNTIS--点阵倒计时

WHEN6=>COUNT<=5;

COLR7<="00000000";

COLR6<="00000000";

COLR5<="00000000";

COLR4<="00000000";

COLR3<="00000000";

COLR2<="00000000";

COLR1<="00000000";

COLR0<="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";

COLR1<="00001000";

COLR0<="00001000";

WHEN0=>COUNT<=6;

STATE<=1;

ENDCASE;

WHEN1=>

IFTIMEL=9THEN--数码管计时

TIMEL<=0;

IFTIMEH=5THEN

TIMEH<=0;

IFCY/=7THEN

STATE<=3;

ELSE

STATE<=2;

ENDIF;

ELSE

TIMEH<=TIMEH+1;

ENDIF;

ELSE

TIMEL<=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';

WHEN6=>COLG6(7-CX)<='1';

WHEN7=>COLG7(7-CX)<='1';

ENDCASE;

CASECONTROLIS--按键控制赛车

WHEN"100"=>CX<=CX-1;

WHEN"010"=>CY<=CY+1;

WHEN"001"=>CX<=CX+1;

WHENOTHERS=>NULL;

ENDCASE;

CASECYIS--判断移动后是否撞墙

WHEN0=>IFCOLR0(7-CX)='1'THENSTATE<=3;ELSECOLG0(7-CX)<='1';ENDIF;

WHEN1=>IFCOLR1(7-CX)='1'THENSTATE<=3;ELSECOLG1(7-CX)<='1';ENDIF;

WHEN2=>IFCOLR2(7-CX)='1'THENSTATE<=3;ELSECOLG2(7-CX)<='1';ENDIF;

WHEN3=>IFCOLR3(7-CX)='1'THENSTATE<=3;ELSECOLG3(7-CX)<='1';ENDIF;

WHEN4=>IFCOLR4(7-CX)='1'THENSTATE<=3;ELSECOLG4(7-CX)<='1';ENDIF;

WHEN5=>IFCOLR5(7-CX)='1'THENSTATE<=3;ELSECOLG5(7-CX)<='1';ENDIF;

WHEN6=>IFCOLR6(7-CX)='1'THENSTATE<=3;ELSECOLG6(7-CX)<='1';ENDIF;

WHEN7=>STATE<=2;

ENDCASE;

IFCY=7THENSTATE<=2;ENDIF;--判断移动后是否到达终点

WHEN2=>COLR7<="00000000";--到达终点后显示“V”

COLR6<="00000000";

COLR5<="00000000";

COLR4<="00000000";

COLR3<="00000000";

COLR2<="00000000";

COLR1<="00000000";

COLR0<="00000000";

COLG7<="00000000";

COLG6<="00000001";

COLG5<="10000010";

COLG4<="01000100";

COLG3<="00101000";

COLG2<="00010000";

COLG1<="00000000";

COLG0<="00000000";

WHEN3=>COLG7<="00000000";--撞墙后显示“X”

COLG6<="00000000";

COLG5<="00000000";

COLG4<="00000000";

COLG3<="00000000";

COLG2<="00000000";

COLG1<="00000000";

COLG0<="00000000";

COLR7<="00000000";

COLR6<="01000010";

COLR5<="00100100";

COLR4<="00011000";

COLR3<="00011000";

COLR2<="00100100";

COLR1<="01000010";

COLR0<="00000000";

ENDCASE;

ENDIF;

ENDPROCESS;

LSTSHOW:

PROCESS(CLK1K)--在点阵上显示倒计时、赛道、和赛车

BEGIN

IFCLK1K'EVENTANDCLK1K='1'THEN

CASEROWSIS

WHEN"11111110"=>COLR<=COLR0;COLG<=COLG0;ROW<=ROWS;ROWS<="11111101";

WHEN"11111101"=>COLR<=COLR1;COLG<=COLG1;ROW<=ROWS;ROWS<="11111011";

WHEN"11111011"=>COLR<=COLR2;COLG<=COLG2;ROW<=ROWS;ROWS<="11110111";

WHEN"11110111"=>COLR<=COLR3;COLG<=COLG3;ROW<=ROWS;ROWS<="11101111";

WHEN"11101111"=>COLR<=COLR4;COLG<=COLG4;ROW<=ROWS;ROWS<="11011111";

WHEN"11011111"=>COLR<=COLR5;COLG<=COLG5;ROW<=ROWS;ROWS<="10111111";

WHEN"10111111"=>COLR<=COLR6;COLG<=COLG6;ROW<=ROWS;ROWS<="01111111";

WHEN"01111111"=>COLR<=COLR7;COLG<=COLG7;ROW<=ROWS;ROWS<="11111110";

WHENOTHERS=>ROWS<="11111110";

ENDCASE;

ENDIF;

ENDPROCESS;

SHOWT:

PROCESS(CLK1K,TIMEH,TIMEL)--将计时译码至数码管上

BEGIN

CASETIMEHIS

WHEN5=>LIGHTH<="1011011";

WHEN4=>LIGHTH<="0110011";

WHEN3=>LIGHTH<="1111001";

WHEN2=>LIGHTH<="1101101";

WHEN1=>LIGHTH<="0110000";

WHEN0=>LIGHTH<="1111110";

WHENOTHERS=>LIGHTH<="0000000";

ENDCASE;

CASETIMELIS

WHEN9=>LIGHTL<="1111011";

WHEN8=>LIGHTL<="1111111";

WHEN7=>LIGHTL<="1110000";

WHEN6=>LIGHTL<="1011111";

WHEN5=>LIGHTL<="1011011";

WHEN4=>LIGHTL<="0110011";

WHEN3=>LIGHTL<="1111001";

WHEN2=>LIGHTL<="1101101";

WHEN1=>LIGHTL<="0110000";

WHEN0=>LIGHTL<="1111110";

WHENOTHERS=>LIGHTL<="0000000";

ENDCASE;

IFCLK1K'EVENTANDCLK1K='1'THEN--利用视觉暂留显示计时

CASEP_STATEIS

WHENL=>P_STATE<=H;

CAT<="111110";

DISPLAY<=LIGHTL;

WHENH=>P_STATE<=L;

CAT<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

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

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