北邮数电实验点阵赛车.docx
- 文档编号:9940838
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:18
- 大小:2.37MB
北邮数电实验点阵赛车.docx
《北邮数电实验点阵赛车.docx》由会员分享,可在线阅读,更多相关《北邮数电实验点阵赛车.docx(18页珍藏版)》请在冰豆网上搜索。
北邮数电实验点阵赛车
数字电路综合实验报告
点阵赛车游戏
学院:
信息与通信工程学院
班级:
2010211117班
姓名:
学号:
班内序号:
辅导老师:
袁东明
时间:
2012年11月
一、设计任务要求
二、系统设计
三、仿真波形及分析
四、源程序
五、功能说明
六、元器件清单及资源利用情况
七、故障及问题分析
八、总结和结论
一、设计任务要求
1、基本要求:
1.用8×8点阵进行5秒倒计时显示,如下图所示。
2.当5秒倒计时结束后,点阵显示下图所示的赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。
图中的红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。
3.用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程(即图2中的绿色位置),游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。
4.当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案。
5.通过按键BTN0进行复位,控制点阵返回到初始状态。
2、提高要求:
1.有多种游戏赛道可选,5秒倒计时显示后赛道随机出现。
2.赛车的初始位置随机出现。
3.在赛车行进过程中,赛道中随机出现障碍物(用8×8点阵中的一个LED表示),通过BTN1~BTN3三个按键的控制躲避障碍物,走完全程。
若赛车碰到障碍物和赛道,则游戏失败。
二、系统设计
1、设计框图
1、系统结构框图
本系统主要由四个模块组成,其中控制器用于控制程序运行、储存当前状态并控制输出显示,点阵用于显示游戏界面,数码管用于显示当前分数。
按钮输入用于输入控制信息。
2、逻辑划分方框图
3、系统流程图
4、MDS图
Te=toend到达终点Cr=crash撞车Ot=overtime
CD=countdownKI=keyboardinput
游戏运行状态的具体状态转移图
三、仿真波形及波形分析
说明:
为了得到仿真结果,仿真实验先将分频比降低再进行。
说明:
cat的波形说明,硬件运行过程中只选择5号和4号数码管,这两个数码管交替启动,分别显示时间秒数的个位和十位
说明:
游戏刚开始时,数码管显示00.对应的time_car序列为0111111
说明:
游戏运行一段时间后(5秒倒计时)计时模块开始计时。
上图中,数码管显示01秒,0对应序列为0111111,1对应于0000110。
下图是02秒的仿真图
说明:
点阵输出,列的输出为01111111,10111111,……,11111110
说明:
列的输出为00000100,00000100,00111100……对应于点阵图形5的输出。
从第二行开始输出。
四、源程序及注释
(由于代码过长,此处只显示top-levelentity,其余代码详见附件)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCARIS
PORT(
CLK_CAR,CLEAR_CAR:
INSTD_LOGIC;
ROW_CAR,COL_CAR:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
KEY_CAR:
INSTD_LOGIC_VECTOR(2DOWNTO0);
TIME_CAR:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
CAT_CAR:
OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);
ENDCAR;
---------------------------------------------------------
ARCHITECTUREGAMEOFCARIS
COMPONENTDIV_NIS--分频模块
PORT(
CLK_IN:
INSTD_LOGIC;---------时钟输入
CLEAR:
INSTD_LOGIC;---扫描,清零
CLK:
OUTSTD_LOGIC:
='0';----1000HZ游戏控制及点阵扫描频率
CLK1:
OUTSTD_LOGIC:
='0';----100HZ数码管扫描频率
CLK2:
OUTSTD_LOGIC:
='0'-----10HZ计时频率
);
ENDCOMPONENT;
COMPONENTANTI_SHAKINGIS--防抖模块
PORT(
CLK,KEY,CLK1:
INSTD_LOGIC;--clk为游戏控制频率clk1为防抖频率100hz
K_OUT:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTDISPLAYIS--显示模块
PORT(
CLK1,CLK,CLEAR:
INSTD_LOGIC;
COL,ROW:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--点阵的输出行与列
COL0_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);--游戏控制模块传给显示模块的点阵的列的数据
COL1_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);--
COL2_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);--
COL3_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);--
COL4_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
COL5_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
COL6_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
COL7_IN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
LED1_IN,LED2_IN:
ININTEGERRANGE0TO9;--LED计时模块传给显示模块的数据:
时间的秒数
CAT:
OUTSTD_LOGIC_VECTOR(5DOWNTO0);
SHUMA:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)--即AA-AF
);----数码管
ENDCOMPONENT;
COMPONENTGAME_CONTROLIS--游戏控制模块
PORT(
COL0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);--传给显示模块的数据点阵的列
COL1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL2:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL3:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL4:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL5:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL6:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
COL7:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
CLK:
INSTD_LOGIC;
STARTCOUNT:
OUTSTD_LOGIC;--传给计时模块的一个标志用来控制是否计时
TIMEOUT:
INSTD_LOGIC;--计时模块传给游戏控制模块的一个标志,说明是否超时
CLEAR:
INSTD_LOGIC;
KEYUP,KEYRIGHT,KEYLEFT:
INSTD_LOGIC);
ENDCOMPONENT;
COMPONENTTIMECOUNTIS
PORT(
CLK2,CLEAR:
INSTD_LOGIC;--10HZ
LED1_OUT,LED2_OUT:
OUTINTEGERRANGE0TO9;---传给显示模块的
STARTCOUNT:
INSTD_LOGIC;--用来控制是否计时
TIMEOUT:
OUTSTD_LOGIC--传给游戏控制模块的一个标志,说明是否超时
);
ENDCOMPONENT;
-------------------------------------------------------------
SIGNALKEY_TMP:
STD_LOGIC_VECTOR(2DOWNTO0);--以下皆为连接的中间信号
SIGNALCLK_TMP,CLK1_TMP,CLK2_TMP:
STD_LOGIC;
SIGNALCOL0_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL1_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL2_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL3_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL4_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL5_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL6_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCOL7_TMP:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALTIMEOUT_TMP:
STD_LOGIC;
SIGNALSTARTCOUNT_TMP:
STD_LOGIC;
SIGNALLED1_TMP,LED2_TMP:
INTEGERRANGE0TO9;---LED
SIGNALCLEAR:
STD_LOGIC;
-------------------------------------------------------------
BEGIN
D1:
DIV_NPORTMAP(CLK=>CLK_TMP,CLK1=>CLK1_TMP,CLK2=>CLK2_TMP,CLK_IN=>CLK_CAR,CLEAR=>CLEAR_CAR);--
------------------------------------------------
A1:
ANTI_SHAKINGPORTMAP(CLK=>CLK_TMP,CLK1=>CLK1_TMP,KEY=>KEY_CAR(0),K_OUT=>KEY_TMP(0));--
A2:
ANTI_SHAKINGPORTMAP(CLK=>CLK_TMP,CLK1=>CLK1_TMP,KEY=>KEY_CAR
(1),K_OUT=>KEY_TMP
(1));--
A3:
ANTI_SHAKINGPORTMAP(CLK=>CLK_TMP,CLK1=>CLK1_TMP,KEY=>KEY_CAR
(2),K_OUT=>KEY_TMP
(2));--
--------------------------------------------------
DP1:
DISPLAYPORTMAP(CLK=>CLK_TMP,CLK1=>CLK1_TMP,CLEAR=>CLEAR_CAR,SHUMA=>TIME_CAR,CAT=>CAT_CAR,
COL=>COL_CAR,ROW=>ROW_CAR,LED1_IN=>LED1_TMP,LED2_IN=>LED2_TMP,
COL0_IN=>COL0_TMP,COL1_IN=>COL1_TMP,COL2_IN=>COL2_TMP,COL3_IN=>COL3_TMP,
COL4_IN=>COL4_TMP,COL5_IN=>COL5_TMP,COL6_IN=>COL6_TMP,COL7_IN=>COL7_TMP
);--OK
----------------------------------------------------
T1:
TIMECOUNTPORTMAP(CLK2=>CLK2_TMP,CLEAR=>CLEAR_CAR,LED1_OUT=>LED1_TMP,LED2_OUT=>LED2_TMP,STARTCOUNT=>STARTCOUNT_TMP,TIMEOUT=>TIMEOUT_TMP);--
----------------------------------------------------
G1:
GAME_CONTROLPORTMAP(CLK=>CLK_TMP,CLEAR=>CLEAR_CAR,STARTCOUNT=>STARTCOUNT_TMP,TIMEOUT=>TIMEOUT_TMP,
KEYUP=>KEY_TMP
(1),KEYRIGHT=>KEY_TMP(0),KEYLEFT=>KEY_TMP
(2),
COL0=>COL0_TMP,COL1=>COL1_TMP,COL2=>COL2_TMP,COL3=>COL3_TMP,
COL4=>COL4_TMP,COL5=>COL5_TMP,COL6=>COL6_TMP,COL7=>COL7_TMP
);
----------------------------------------------------
ENDGAME;
五、实现功能说明
倒计时阶段,数码管不计时
60秒超时,游戏结束
碰赛道或障碍,游戏结束
跑到终点,游戏成功,显示完成时间
随机赛道,随机障碍,小车随机初始位置
按下复位键之后,游戏重新开始
六、元器件清单及资源利用情况
1、使用的元器件
芯片
EPM1270T144C5
按键
3个
Led点阵
8*8个单元
Led数码管
1个
2、资源利用
七、故障及问题分析
1,故障:
加了防抖模块后,按键变得非常不灵敏,怎么按都没有反应。
问题分析:
之前只考虑防抖的设计,在排除故障时,没有找出任何有价值的信息,防抖频率也是100hz,分频模块也没有出错,试着将防抖电路的频率改了一下,依旧没有用。
后来听课之后才明白,加了防抖模块外,还需要加上时钟同步,才能做成同步时序电路,才能有效地控制电路的运行。
修改了防抖模块代码后(由防抖频率进行防抖,游戏控制频率进行同步),游戏终于能够有效运行。
2,故障:
在不同的实验室进行实验,有时点阵显示正常,有时点阵全亮。
问题分析:
这是由于实验板的点阵设计不同导致的。
在将点阵管脚的行与列相互对换之后,终于能够显示正常。
但是有时出现的图案与设计的图案有90度角的偏差。
3,数码管显示乱码
问题分析:
数码管管脚可能连接不紧密,用力压一下数码管就显示正确了。
八、总结和结论
在做实验之前,我以为参考俄罗斯方块代码来做点阵赛车应该很容易。
但是后来上了两节课之后突然发现自己才仅仅看懂了俄罗斯方块的代码,第三节课就要检查代码了。
于是我抽空去了数电实验室泡了几个上午,终于做出来了。
也正因为这样,才发现各个实验室的实验板是不同的。
比如点阵的行与列的不同,有些板块的点阵有红绿颜色,而有些只有红色。
这次实验给我的感触最深就是,课前一定要做好准备,比如把以前的知识复习一遍。
再者,老师讲课的内容很重要,比如这次讲了状态机的设计,还有最后一节课的防抖电路和同步时钟电路,都对最终的设计有莫大的帮助。
只有这样,才能在实验的过程中少走弯路。
硬件编程语言不像软件轻松,它编译以及下载都需要比软件编译花的时间多,如果有些概念弄不清楚或者解决问题的方向不对,做实验摸索的时间就会大大增长,无形中也使实验过程变得繁琐,影响做实验的心态,是的事倍功半。
另外,由于波形仿真比硬件下载速度快,因此学会仿真,能够分析仿真结果的能力是必不可少的。
正因为如此,我在实验过程中才能加快速度,节省了宝贵的时间。
这次实验我学到了不少实用的知识,更重要的是在做实验的过程中,思考问题的方法,以及分析,解决问题的能力。
而且,这次实验还锻炼我在困难面前的耐性,让我学会了在一筹莫展时还能够冷静地分析问题。
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 点阵 赛车