迷宫实验报告北邮.docx
- 文档编号:6020157
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:47
- 大小:229.52KB
迷宫实验报告北邮.docx
《迷宫实验报告北邮.docx》由会员分享,可在线阅读,更多相关《迷宫实验报告北邮.docx(47页珍藏版)》请在冰豆网上搜索。
迷宫实验报告北邮
数字电路与逻辑设计实验实验报告
简易迷宫实验
学院:
通信与信息工程学院
专业:
电子信息工程
姓名:
ABC
班级:
2012211103
学号:
2012212661
班内序号:
32
2014年11月07日
一、任务要求
1、基本要求:
1.用8×8点阵进行游戏显示。
2.迷宫游戏如图1所示,采用双色点阵显示,其中红色LED为迷宫墙壁,绿色LED表示人物。
通过BTN0~BTN3四个按键控制迷宫中的人物进行上下左右移动,使人物从起始点出发,走到迷宫的出口,游戏结束。
3.普通计时模式:
通过按键BTN7启动游戏,必须在30秒内找到出口,否则游戏失败,用两个数码管进行倒计时显示。
游戏胜利或者失败均要在8×8点阵上有相应的画面出现。
4.迷宫中的人物在行走过程中,如果碰到墙壁,保持原地不动。
2、提高要求:
1.多种迷宫地图可以选择。
2.在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不计算步数,计步结果用数码管显示。
3.为游戏增加提示音乐,在不同时间段采用不同频率的信号控制蜂鸣器发声报警。
4.增加其他游戏模式。
5.自拟其它功能。
2、系统设计
1、设计思路
该迷宫程序需要用到点阵、数码管,按键等器件。
其中,点阵用于显示迷宫地图及动画,数码管用于倒计时和记步显示,按键用于控制游戏中任务的上下左右移动及系统复位。
由于该程序涉及的元件较多,实现的功能较为复杂,直接编写一个模块来实现的难度较大,也不便于修改调试,因而我选择了分模块来写。
程序主要分为三大模块:
控制模块、显示模块和按键输入模块。
为保证各模块的正常工作,需加入分频模块来协调各模块的工作时序。
而显示模块包括点阵显示和数码管显示,需要用两个子模块分别实现。
最后,作为提高要求,我加入了音乐模块,作为游戏成功播放的音乐。
2、系统框图
3、分块设计
三、仿真波形及波形分析
1、分频模块(frequency)
实验板中心频率为50MHz,此模块采用串行分频,将50MHz先分为10KHz,用于扫描点阵,再将10KHz分频为10Hz,用来检测键盘输入信号,再将10Hz分频为1Hz的频率,用于倒计时。
如下图:
2、
控制模块(controller)
控制模块通过按键输入控制来实现人物在迷宫中移动。
采用10Hz频率,P_CHOOSE为迷宫选项,置0表示显示默认迷宫5,START为开始信号,游戏开始后,M_DOWN为向下移动,按键按下,遇到障碍,障碍信号STUCK置1,人物坐标OUT_X_G,OUT_Y_G不变。
M_LEFT为向左移动,按键按下,未遇到障碍,人物移动,OUT_X_G-1,第二次按下M_LEFT,遇到障碍,STUCK置1。
按下M_RIGHT,人物右移,OUT_Y_G-1。
按下M_UP,遇到障碍,STUCK置1。
COUNT信号实现记步功能,按下P_RST系统复位,记步值归0,游戏重新开始。
3、点阵显示模块(display)
点阵显示模块用来控制点阵显示开机动画(“迷”字),54321倒计时,迷宫地图显示及成功动画(笑脸),失败动画(哭脸)。
CLK_1HZ为5s倒计时时钟,CLK_10K为点阵扫描时钟,P_CHOOSE用于选择迷宫地图,置0说明显示默认迷宫,S_RESET为复位信号,S_START为游戏开始信号,TIME_UP为失败信号,游戏失败则显示哭脸,WIN为成功信号,游戏成功则显示笑脸。
4、数码管控制模块(segcontrol)
该模块通过1HZ时钟来控制数码管显示倒计时及人物移动步数,COUNT_OUTH,COUNT_OUTL为倒计时的高低位,STEP_OUTH,STEP_OUTL为步数的高低位,LOSE为失败信号,当倒计时的高低位均为0时,游戏失败。
5、数码管选通模块(segselect)
该模块通过10KHZ时钟来依次选通四个数码管。
6、数码管显示模块(segment)
该模块通过显示控制信号COUNT来控制数码管显示0到9。
7、音乐模块(yinyue)
该模块自身设定分频,当收到成功信号RESULT后,蜂鸣器按照乐谱旋律鸣响。
四、源程序
1、分频模块frequency
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfrequencyIS
PORT(CLK:
INSTD_LOGIC;--外部时钟信号
CLK_10K:
OUTSTD_LOGIC;--用于点阵扫描和数码管选通
CLK_10HZ:
OUTSTD_LOGIC;--用于按键扫描
CLK_1HZ:
OUTSTD_LOGIC);--用于数码管倒计时显示
END;
ARCHITECTUREbehaveOFfrequencyIS
SIGNALCNT1:
INTEGERRANGE0TO2499;
SIGNALCNT2:
INTEGERRANGE0TO490;
SIGNALCNT3:
INTEGERRANGE0TO8;
SIGNALCLK_TEMP1:
STD_LOGIC;
SIGNALCLK_TEMP2:
STD_LOGIC;
SIGNALCLK_TEMP3:
STD_LOGIC;
BEGIN
P1:
PROCESS(CLK)—产生10k信号
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT1=2499THEN
CLK_TEMP1<=NOTCLK_TEMP1;
CNT1<=0;
ELSE
CNT1<=CNT1+1;
ENDIF;
ENDIF;
ENDPROCESSP1;
CLK_10K<=CLK_TEMP1;
P2:
PROCESS(CLK_TEMP1)—产生10hz信号
BEGIN
IFCLK_TEMP1'EVENTANDCLK_TEMP1='1'THEN
IFCNT2=480THEN
CLK_TEMP2<=NOTCLK_TEMP2;
CNT2<=0;
ELSE
CNT2<=CNT2+1;
ENDIF;
ENDIF;
ENDPROCESSP2;
CLK_10HZ<=CLK_TEMP2;
P3:
PROCESS(CLK_TEMP2)—产生1hz信号
BEGIN
IFCLK_TEMP2'EVENTANDCLK_TEMP2='1'THEN
IFCNT3=8THEN
CLK_TEMP3<=NOTCLK_TEMP3;
CNT3<=0;
ELSE
CNT3<=CNT3+1;
ENDIF;
ENDIF;
ENDPROCESSP3;
CLK_1HZ<=CLK_TEMP3;
ENDBEHAVE;
2、控制模块controller
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcontrollerIS
PORT(CLK_10HZ:
INSTD_LOGIC;--按键扫描信号
P_RST:
INSTD_LOGIC;--复位信号
P_START:
INSTD_LOGIC;--开始信号
P_CHOOSE:
INSTD_LOGIC_VECTOR(3DOWNTO0);--迷宫选择信号
M_LEFT,M_RIGHT,M_UP,M_DOWN:
INSTD_LOGIC;--按键信号
OUT_STATE:
OUTSTD_LOGIC;--成功信号
OUT_STUCK:
OUTSTD_LOGIC;--遇到障碍信号
COUNT:
OUTINTEGERRANGE0TO99;--记步信号
OUT_Y_G:
OUTINTEGERRANGE0TO7;--移动点纵坐标
OUT_X_G:
OUTINTEGERRANGE0TO7);--移动点横坐标
END;
ARCHITECTUREbehaveOFcontrollerIS
SIGNALWIN_TEMP:
STD_LOGIC;
SIGNALSTUCK_TEMP:
STD_LOGIC;
SIGNALK_L,K_R,K_U,K_D:
STD_LOGIC;
SIGNALX:
INTEGERRANGE0TO7;
SIGNALY:
INTEGERRANGE0TO7;
SIGNALOUT_COUNT:
INTEGERRANGE0TO99;
SIGNALPPP:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCHANGE:
STD_LOGIC;
SIGNALI:
STD_LOGIC;
SIGNALTMP1,TMP2,TMP3,TMP4,TMP5,TMP6,TMP7,TMP8:
STD_LOGIC;--消抖时用的临时信号
BEGINP1:
PROCESS(CLK_10HZ,M_LEFT,M_RIGHT,M_UP,M_DOWN,TMP1,TMP2,TMP3,TMP4,TMP5,TMP6,TMP7,TMP8)--按键防抖
BEGIN
IF(CLK_10HZ'EVENTANDCLK_10HZ='0')THEN
TMP2<=TMP1;--前一时刻按键值
TMP1<=M_LEFT;--当前时刻按键值
TMP4<=TMP3;
TMP3<=M_RIGHT;
TMP6<=TMP5;
TMP5<=M_UP;
TMP8<=TMP7;
TMP7<=M_DOWN;
ENDIF;
K_L<=TMP1AND(NOTTMP2);--前一时刻为低电平,后一时刻为高电平,证明按键按下
K_R<=TMP3AND(NOTTMP4);
K_U<=TMP5AND(NOTTMP6);
K_D<=TMP7AND(NOTTMP8);
ENDPROCESS;
P2:
PROCESS(CLK_10HZ,P_RST,P_START,K_L,K_R,K_U,K_D,P_CHOOSE)—点的移动控制
BEGIN
IF(P_RST='1')THEN
OUT_COUNT<=0;
CASEP_CHOOSEIS--点的初始位置赋值
WHEN"0100"=>
X<=7;Y<=7;
--STUCK_TEMP<='0';
WHEN"0001"=>
X<=0;Y<=0;
--STUCK_TEMP<='0';
WHENOTHERS=>
X<=7;Y<=6;
--STUCK_TEMP<='0';
ENDCASE;
ELSIF(P_START='0')THEN
OUT_COUNT<=0;
PPP<=P_CHOOSE;--点的初始位置赋值
CASEP_CHOOSEIS
WHEN"0100"=>
X<=7;Y<=7;
--STUCK_TEMP<='0';
WHEN"0001"=>
X<=0;Y<=0;
--STUCK_TEMP<='0';
WHENOTHERS=>
X<=7;Y<=6;
--STUCK_TEMP<='0';
ENDCASE;
ELSE
IF(CLK_10HZ'EVENTANDCLK_10HZ='1')THEN
STUCK_TEMP<='0';
IFPPP=P_CHOOSETHENCHANGE<='0';--每次切换迷宫都要给移动点重新赋初值
ELSECHANGE<='1';PPP<=P_CHOOSE;
ENDIF;
IFCHANGE='1'THEN
CASEP_CHOOSEIS--点的初始位置赋值
WHEN"0100"=>
X<=7;Y<=7;
WHEN"0001"=>
X<=0;Y<=0;
WHENOTHERS=>
X<=7;Y<=6;
ENDCASE;
ELSE
ENDIF;
IF(K_L='1')THEN—如果按下左移键
--OUT_COUNT<=OUT_COUNT+1;
CASEP_CHOOSEIS
WHEN"0001"=>
IF(((Y=0)AND(X=0))—障碍点判断
OR((Y=1)AND(X=1))
OR((Y=2)AND(X=3ORX=6))
OR((Y=3)AND(X=1))
OR((Y=4)AND(X=1ORX=3ORX=6))
OR((Y=5)AND(X=4ORX=6))
OR((Y=6)AND(X=1ORX=6)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X-1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0010"=>
IF(((Y=0)AND(X=3))—障碍点判断
OR((Y=1)AND(X=1ORX=3))
OR((Y=2)AND(X=1ORX=6))
OR((Y=3)AND(X=2ORX=4ORX=6))
OR((Y=4)AND(X=1))
OR((Y=5)AND(X=3))
OR((Y=6)AND(X=1)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X-1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0100"=>
IF(((Y=0)AND(X=1))—障碍点判断
OR((Y=1)AND(X=1))
OR((Y=2)AND(X=6))
OR((Y=3)AND(X=1ORX=4))
OR((Y=4)AND(X=1ORX=4))
OR((Y=5)AND(X=1))
OR((Y=6)AND(X=5))
OR((Y=7)AND(X=6)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X-1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"1000"=>
IF(((Y=6)AND((X=7)OR(X=2)OR(X=1)))—障碍点判断
OR((Y=5)AND((X=4)OR(X=3)))
OR((Y=1)AND((X=6)OR(X=5)OR(X=4)OR(X=3))))THEN
X<=X-1;OUT_COUNT<=OUT_COUNT+1;
ELSE
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
WHENOTHERS=>
IF(((Y=6)AND((X=7)OR(X=2)OR(X=1)))
OR((Y=5)AND((X=5)OR(X=6)))
OR((Y=1)AND((X=6)OR(X=5)OR(X=4)OR(X=3))))THEN
X<=X-1;OUT_COUNT<=OUT_COUNT+1;
ELSE
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
ENDCASE;
ENDIF;
IF(K_R='1')THEN—如果右移键按下
--OUT_COUNT<=OUT_COUNT+1;
CASEP_CHOOSEIS
WHEN"0001"=>
IF(((Y=0)AND(X=1))
OR((Y=1)AND(X=6))
OR((Y=2)AND(X=4ORX=6))
OR((Y=3)AND(X=6))
OR((Y=4)AND(X=1ORX=4ORX=6))
OR((Y=5)AND(X=4ORX=6))
OR((Y=6)AND(X=4ORX=6)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0010"=>
IF(((Y=0)AND(X=3))
OR((Y=1)AND(X=1ORX=6))
OR((Y=2)AND(X=1ORX=6))
OR((Y=3)AND(X=2ORX=4ORX=6))
OR((Y=4)AND(X=6))
OR((Y=5)AND(X=4)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0100"=>
IF(((Y=0)AND(X=1))
OR((Y=1)AND(X=6))
OR((Y=2)AND(X=6))
OR((Y=3)AND(X=2ORX=6))
OR((Y=4)AND(X=1ORX=4))
OR((Y=5)AND(X=6))
OR((Y=6)AND(X=6))
OR((Y=7)AND(X=7)))THEN
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
X<=X+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"1000"=>
IF(((Y=6)AND((X=6)OR(X=1)))
OR((Y=5)AND((X=3)OR(X=2)))
OR((Y=1)AND((X=2)OR(X=5)OR(X=4)OR(X=3))))THEN
X<=X+1;OUT_COUNT<=OUT_COUNT+1;
ELSE
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
WHENOTHERS=>
IF(((Y=6)AND((X=6)OR(X=1)))
OR((Y=5)AND((X=4)OR(X=5)))
OR((Y=1)AND((X=2)OR(X=5)OR(X=4)OR(X=3))))THEN
X<=X+1;OUT_COUNT<=OUT_COUNT+1;
ELSE
X<=X;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
ENDCASE;
ENDIF;
IF(K_U='1')THEN—如果上移键按下
--OUT_COUNT<=OUT_COUNT+1;
CASEP_CHOOSEIS
WHEN"0001"=>
IF(((Y=0)AND(X=0))
OR((Y=1)AND(X=1ORX=2ORX=5))
OR((Y=3)AND(X=2ORX=5))
OR((Y=4)AND(X=1ORX=3))
OR((Y=6)AND(X=2ORX=3ORX=4ORX=6)))THEN
Y<=Y;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
Y<=Y+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0010"=>
IF(((Y=1)AND(X=3ORX=4ORX=5))
OR((Y=4)AND(X=1ORX=2ORX=5ORX=6))
OR((Y=6)AND(X=2ORX=3ORX=4ORX=5ORX=6ORX=7ORX=1)))THEN
Y<=Y;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
Y<=Y+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"0100"=>
IF(((Y=1)AND(X=1ORX=2ORX=3ORX=4ORX=5))
OR((Y=3)AND(X=2ORX=5ORX=6))
OR((Y=5)AND(X=1ORX=2ORX=3ORX=4))
OR((Y=6)AND(X=5))
OR((Y=7)AND(X=6ORX=7)))THEN
Y<=Y;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ELSE
Y<=Y+1;OUT_COUNT<=OUT_COUNT+1;
ENDIF;
WHEN"1000"=>
IF(((X=2)AND((Y=1)OR(Y=2)OR(Y=3)OR(Y=4)OR(Y=5)))
OR((X=4)AND((Y=3)OR(Y=4)))
OR((X=6)AND((Y=1)OR(Y=2)OR(Y=3)OR(Y=4)OR(Y=5))))THEN
Y<=Y+1;OUT_COUNT<=OUT_COUNT+1;
ELSE
Y<=Y;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
WHENOTHERS=>
IF(((X=2)AND((Y=1)OR(Y=2)OR(Y=3)OR(Y=4)OR(Y=5)))
OR((X=4)AND((Y=3)OR(Y=4)))
OR((X=6)AND((Y=1)OR(Y=2)OR(Y=3)OR(Y=4)OR(Y=5))))THEN
Y<=Y+1;OUT_COUNT<=OUT_COUNT+1;
ELSE
Y<=Y;STUCK_TEMP<='1';OUT_COUNT<=OUT_COUNT;
ENDIF;
ENDCASE;
ENDIF;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 实验 报告