北邮数电综合实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

点阵赛车游戏

学院:信息与通信工程学院专业:通信工程

班级:

姓名:

学号:

班内序号:

一、设计课题的任务要求

用8×8点阵进行5秒倒计时显示,当5秒倒计时结束后,点阵显示赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。用红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程,游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。通过按键BTN0进行复位,控制点阵返回到初始状态。

二、系统设计

1、设计思路

这个过程乍一看蛮复杂的,但是当我经过仔细分析后发现,我的代码可以按照这个游戏的运行过程来写。这个游戏分为4个状态,即倒计时,运行,成功和失败。倒计时部分根据不同数字在点阵上的位置很容易设计出来,运行部分便是初始化赛道,赛车的位置,然后用按键来控制赛车运动,在这个过程中要不断判断赛车是否撞墙和到达终点,如果到达终点便进入第三个状态,成功,即显示“V”;若果撞墙便进入第四个状态,失败,即显示“X”。

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

2、总体框图

(1)系统结构图

(2)ASM 图

译码显示器

分频器

控制器 计时器

赛道及赛车

CP

RESET BTN1

BTN2 BTN3

启动

N

Y

是否碰到边界

显示“×”

计时

移动

是否复位是否复位

Y

N

N

Y

N

Y

N

(4)功能模块图

显示存储器

控制器 方向控制模块

计时器

数码管

分频器

点阵显示

倒计时

移动

显示“V ”

显示“X ”

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的控制下分别让两个数码管显示,此即为计时器的显示。

三、仿真波形及波形分析

倒计时波形

数码管显示及波形

点阵显示倒计时波形

点阵显示波形

四、源程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CAR IS PORT(

CLK:IN STD_LOGIC; --时钟信号 RESET:IN STD_LOGIC;--复位输入 CONTROL:IN STD_LOGIC_VECTOR(2 DOWNTO 0);--赛车控制 ROW:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制输出 COLR,COLG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--列控制输出

CAT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);--数码管选通

数码管显示01,02,03

点阵列显示波形

点阵行显示波形

DISPLAY:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)—数码管显示

);

END CAR;

ARCHITECTURE behave OF CAR IS

SIGNAL TEMP1:INTEGER RANGE 0 TO 49999;--分频信号

SIGNAL TEMP2:INTEGER RANGE 0 TO 49999999;

SIGNAL CLK1K:STD_LOGIC;--频率1kHz时钟

SIGNAL CLK1HZ:STD_LOGIC; --频率1Hz时钟

SIGNAL TIMEH:INTEGER RANGE 0 TO 5;--十位计数

SIGNAL TIMEL:INTEGER RANGE 0 TO 9;--个位计数

SIGNAL LIGHTH:STD_LOGIC_VECTOR(6 DOWNTO 0);--十位数码管控制信号

SIGNAL LIGHTL:STD_LOGIC_VECTOR(6 DOWNTO 0);--个位数码管控制信号

TYPE PRESENT_STATE IS (H,L);--自定义变量

SIGNAL P_STATE:PRESENT_STATE;

SIGNAL STATE:INTEGER RANGE 0 TO 3;--四个状态控制信号

SIGNAL COUNT : INTEGER RANGE 0 TO 6;--倒计时控制信号

SIGNAL CX,CY:INTEGER RANGE 0 TO 7;--赛车坐标控制信号

SIGNAL ROWS:STD_LOGIC_VECTOR(7 DOWNTO 0);--行控制信号

SIGNAL COLR7,COLR6,COLR5,COLR4,COLR3,COLR2,COLR1,COLR0,--列控制信号

COLG7,COLG6,COLG5,COLG4,COLG3,COLG2,COLG1,COLG0:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN

DIV1K:PROCESS(CLK) --分频1kHz

BEGIN

IF CLK'EVENT AND CLK = '1' THEN

IF TEMP1 = 49999 THEN

TEMP1 <= 0;

ELSE

TEMP1 <= TEMP1 + 1;

END IF;

IF TEMP1 < 25000 THEN

CLK1K <= '0';

ELSE

CLK1K <= '1';

END IF;

END IF;

END PROCESS;

DIV1HZ:PROCESS(CLK) --分频1Hz

BEGIN

相关文档
最新文档