北京邮电大学数字电路实验迷宫游戏
低值易耗品的管理-最开心
数字电路综合实验报告
数字电路综合实验报告
学 院:信息与通信工程学院
班 级:
班内序号:
姓 名:
学 号:
选作题目:简易迷宫游戏
数字电路综合实验报告
一、 课题的任务要求
1、基本要求:
1)
用8×8点阵进行游戏显示。
2) 迷宫游戏如下图所示,采用双色点阵显示,其中红色LED为迷宫
墙壁,
绿色LED表示人物。通过BTN0~BTN3四个按键控制迷宫中的人物进
行上下左右
移动,使人物从起始点出发,走到迷宫的出口,游戏结束。
3) 普通计时模式:通过按键BTN7启
动游戏,必须在30秒内找到出口,否
则游戏失败,用两个数码管进行倒计时显示。游戏胜利或者失败均
要在
8×8点阵上有相应的画面出现。
4)
迷宫中的人物在行走过程中,如果碰到墙壁,保持原地不动。
2、提高要求:
1)
多种迷宫地图可以选择。
2) 在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不
计
算步数,计步结果用数码管显示。
3)
为游戏增加提示音乐,在不同时间段采用不同频率的信号控制蜂鸣器发
声报警。
4)
增加其他游戏模式。
5) 自拟其它功能。
二、
系统设计(包括设计思路、总体框图、分块设计)
1、整体设计思路:
通
过分析迷宫游戏的特点,将迷宫游戏的实现分为三大核心功能模块,一
是控制模块controller
,是整个游戏的“枢纽”,负责处理玩家的输入信号,控制
整个游戏阶段的跳转,游戏胜负的判断,以及
输出相应显示模块的控制信号。二
是计时兼数码管显示模块timer,负责倒计时以及倒计时的显示,
游戏已走步数
的显示,并产生蜂鸣器的控制信号。三是点阵显示模块lattice,通过接收控制模<
br>块的控制信号,控制不同游戏模式或状态下的点阵输出。其他次要模块主要为:
分频模块,防抖模
块,蜂鸣器驱动模块。
迷宫游戏的划分方框图如下:
图2.1
迷宫游戏的逻辑划分方框图
1 22
数字电路综合实验报告
2、
总体框图:
顶层连接图如下:
图2.2 系统顶层设计图
3、分块设计:
1)
控制模块(controller)
通过分析控制模块的随着游戏进程的状态变化,可将控制器分为七
个状态,分别是
①
WaitMsg:待机状态,等待玩家BTN0(进入游戏)的输入,跳转至
ChoModes。
② ChoModes:选择游戏模式状态,等待玩家BTN0(模式1)或BTN1
(模式2
)的输入,跳转至ChoLevel。
③ ChoLevle:选择游戏难度状态,等待玩家BTN0
(难度1)或BTN1
(难度2)的输入,跳转至ChoMaps。
④ ChoMaps:选
择游戏地图状态,等待玩家BTN0(地图1)、BTN1
(地图2)、BTN2(地图3)、BTN3
(随机选择)其中之一的输入,
跳转至Moving。
⑤ Moving:游戏状态,等待玩
家BTN0(上)、BTN1(下)、BTN2(右)、
BTN3(左)其中之一的输入,通过判断游戏
终止条件,如是否时间
到,步数用尽,或到达终点,来转移状态至Win,或Lose。
⑥
Win:游戏胜利状态,玩家在规定时间与步数内到达终点,等待玩
家BTN7(复位键)的输入,跳转
至WaitMsg。
⑦ Lose:游戏失败状态,时间用尽或步数到达上线,等待玩家BTN7(复位键)的输入,跳转至WaitMsg。
在任何状态下,只要收到BTN7(复位)的信号,状态都会转移到WaitMsg。
对应的逻辑流程图如下:
2 22
数字电路综合实验报告
图2.3 迷宫游戏控制器逻辑流程图
图2.4 controller模块元件图
2)
计时兼数码管显示模块(timer)
timer模块受到controller模块的控制,co
ntroller模块将传递游戏状
态信号、计时控制信号、游戏难度信号以及已走步数信号给time
r。timer
模块利用case选
择语句对相应的控制信号做出相应。并利用视觉暂留效
应,将时间与已走步数显示在数码管上。
3 22
数字电路综合实验报告
图2.5 timer元件图
以下是控制数码管显示的代码,负责同时显示时间和已走步数:
IF
cont_display =4 THEN –模为5的计数器,轮流显示5个数字
cont_display<=0;
cont_display<=
cont_display+1;
ELSE
END IF;
CASE cont_display IS –通过选择计数器的状态,来显示相应的数字
WHEN 0 =>
con_nixietube<= 时间的个位
con_nixietube<= 时间的十位
WHEN 1 =>
WHEN 2 =>
con_nixietube<= 已走步数的个位
WHEN 3 =>
con_nixietube<= 已走步数的十位
WHEN 4 =>
con_nixietube<= 已走步数的百位
END CASE;
3) 点阵显示模块(lattice)
Lattice模块
同样也受到controller模块的控制,controller模块将
传递游戏状态信号,游戏模
式信号,游戏地图信号,根据不同的游戏
阶段显示出不同的图案。其中迷雾模式的显示是一个小难点,首
先通
过判断y的值,给相邻两行赋上地图,其他置零,然后判断x的值给
相邻两行中的部分元素
置零,最后达到只显示坐标点周围一格内有地
图的显示的效果。
图2.6
lattice模块元件图
4 22
数字电路综合实验报告
迷雾显示部分代码如下:
CASE y IS -
--根据y的取值给临时列向量赋值,只给y临近三列赋值,其他为零,临时列向量最
终给输出向量赋值
WHEN 0 =>
colg_tmp0<=colg0;
colg_tmp1<=colg1;
WHEN 1 =>
colg_tmp0<=colg0;
colg_tmp1<=colg1;
colg_tmp2<=colg2;
WHEN 2 =>
colg_tmp1<=colg1;
colg_tmp2<=colg2;
colg_tmp3<=colg3;
WHEN 3=>
colg_tmp2<=colg2;
colg_tmp3<=colg3;
colg_tmp4<=colg4;
WHEN 4=>
colg_tmp3<=colg3;
colg_tmp4<=colg4;
colg_tmp5<=colg5;
WHEN 5=>
colg_tmp4<=colg5;
colg_tmp5<=colg5;
colg_tmp6<=colg6;
WHEN 6=>
colg_tmp5<=colg5;
colg_tmp6<=colg6;
colg_tmp7<=colg7;
WHEN 7=>
colg_tmp6<=colg6;
colg_tmp7<=colg7;
END
CASE;
CASE x IS
--根据x的值,对横向部分进行处理,只留下x临近三个的值,其他置零。
WHEN
0=>colg_tmp0(7 DOWNTO 2)<=
colg_tmp1(7 DOWNTO
2)<=
colg_tmp2(7 DOWNTO 2)<=
colg_tmp3(7
DOWNTO 2)<=
colg_tmp4(7 DOWNTO
2)<=
colg_tmp5(7 DOWNTO 2)<=
colg_tmp6(7
DOWNTO 2)<=
colg_tmp7(7 DOWNTO 2)<=
WHEN 1=>
5 22
数字电路综合实验报告
colg_tmp0(7
DOWNTO 3)<=
colg_tmp1(7 DOWNTO
3)<=
colg_tmp2(7 DOWNTO 3)<=
colg_tmp3(7
DOWNTO 3)<=
colg_tmp4(7 DOWNTO
3)<=
colg_tmp5(7 DOWNTO 3)<=
colg_tmp6(7
DOWNTO 3)<=
colg_tmp7(7 DOWNTO
3)<=
colg_tmp1(7 DOWNTO 4)<=
colg_tmp2(7
DOWNTO 4)<=
colg_tmp3(7 DOWNTO
4)<=
colg_tmp4(7 DOWNTO 4)<=
colg_tmp5(7
DOWNTO 4)<=
colg_tmp6(7 DOWNTO
4)<=
colg_tmp7(7 DOWNTO 4)<=
colg_tmp0(7
DOWNTO 5)<=
colg_tmp1(7 DOWNTO
5)<=
colg_tmp2(7 DOWNTO 5)<=
colg_tmp3(7
DOWNTO 5)<=
colg_tmp4(7 DOWNTO
5)<=
colg_tmp5(7 DOWNTO 5)<=
colg_tmp6(7
DOWNTO 5)<=
colg_tmp7(7 DOWNTO
5)<=
colg_tmp0(7 DOWNTO 6)<=
colg_tmp1(7
DOWNTO 6)<=
colg_tmp2(7 DOWNTO
6)<=
colg_tmp3(7 DOWNTO 6)<=
colg_tmp4(7
DOWNTO 6)<=
colg_tmp5(7 DOWNTO
6)<=
colg_tmp6(7 DOWNTO 6)<=
colg_tmp7(7
DOWNTO 6)<=
colg_tmp0(7)<='0';colg_tmp0(3
DOWNTO 0)<=
colg_tmp1(7)<='0';colg_tmp1(3
DOWNTO 0)<=
colg_tmp2(7)<='0';colg_tmp2(3
DOWNTO 0)<=
colg_tmp3(7)<='0';colg_tmp3(3
DOWNTO 0)<=
colg_tmp4(7)<='0';colg_tmp4(3
DOWNTO 0)<=
colg_tmp5(7)<='0';colg_tmp5(3
DOWNTO 0)<=
colg_tmp6(7)<='0';colg_tmp6(3
DOWNTO 0)<=
colg_tmp7(7)<='0';colg_tmp7(3
DOWNTO 0)<=
WHEN 2=>colg_tmp0(7 DOWNTO
4)<=
WHEN 3=>
WHEN 4=>
WHEN 5=>
WHEN 6=>
6 22
数字电路综合实验报告
colg_tmp0(4 DOWNTO 0)<=
colg_tmp1(4 DOWNTO
0)<=
colg_tmp2(4 DOWNTO 0)<=
colg_tmp3(4
DOWNTO 0)<=
colg_tmp4(4 DOWNTO
0)<=
colg_tmp5(4 DOWNTO 0)<=
colg_tmp6(4
DOWNTO 0)<=
colg_tmp7(4 DOWNTO
0)<=
colg_tmp0(5 DOWNTO 0)<=
colg_tmp1(5
DOWNTO 0)<=
colg_tmp2(5 DOWNTO
0)<=
colg_tmp3(5 DOWNTO 0)<=
colg_tmp4(5
DOWNTO 0)<=
colg_tmp5(5 DOWNTO
0)<=
colg_tmp6(5 DOWNTO 0)<=
colg_tmp7(5
DOWNTO 0)<=
WHEN 7=>
4)
分频模块(div_cl)
系统中的各个模块的输入时钟频率不全部相同,且得满足一定的
要
求,如点阵显示与数码管显示输入频率不能太高,实验板提供的
50Mhz频率太高,需要分频。为了保
证控制模块的控制信号能及时被
被控制模块接收,控制模块的时钟频率需要小于被控制模块。综合以上考虑,从50MHz的晶振频率分出1Hz供计时器用,500Hz供点阵显
示和数码管显示用,
50Hz供控制器模块用。
5) 防抖模块(anti_shake)
为了稳定玩家的输入信号,需要加入防抖模块。所用到的按键都需
要做防抖处理。
END
CASE;
图2.7 防抖模块元件图
7 22
数字电路综合实验报告
三、 仿真波形及波形分析
每个模块的分频系数不尽相同,不方便对整个系统进行仿真,因此
仅对
较为重要的控制器模块,计数器及数码管控制模块,点阵控制模块三个模块
进行仿真。
a) 控制器模块(lattice)的仿真:
输入信号设置:复位键置零,时间终止信号置零, 选择地图1
(turn_up=‘1’),
模式1(turn_up=‘1’),难度1(turn_up=‘1’),进入游戏后,
先向左(tu
rn_left=‘1’),后一直向下(turn_down=‘1’)
图3.1 控制器仿真输入信号设置
仿真结果:由下图可看出,输出游戏状
态(game_state_out)正常地跳
转,从待机状态(000)到选择模式(001),到选
择游戏难度(110),到选
择地图(010),最后到游戏进行状态(011)。
图3.2 游戏状态输出信号
控制器的状态也正常的跳转,从选择模式状态(ChoModes),到选择难
度状
态(ChoLevel),再到选择地图状态(ChoMaps),最后到游戏进行状态
(Moving
)
图3.3 控制器状态跳转
玩家坐标点的变化如下,与控制信号及相应地图保持一致:
图3.4 坐标值变化
在地图1上的运动轨迹如下(坐标原点在右上角):
8 22
数字电路综合实验报告
图3.5 运动轨迹
b)
点阵显示模块(lattice)的仿真:
1、进入待机状态,即game_state_in=”000”,如下图
图3.6 输入控制信号game_state_in=”000”
此时应输出设定的待机画面
图3.7 点阵绿色列控制向量
图3.8 点阵行控制向量
2、当进入游戏状态
输入设定为游戏模式为“01”
(普通模式),地图为“01”,当前坐标点为
x=2,y=2(从0到7),输入游戏状态由设定模式
到设定地图最后到游戏进行
时:
图3.9 输入信号设置
此时的应输出
第一副地图,以及在输出第三行时,输出信号colr为
“00000100”,如下图,colg来显
示地图(绿色),colr用来显示位置(红色)。
9 22
数字电路综合实验报告
图3.10输出信号
当输入的游戏模式为迷雾模式“10”,此时地图仅显示周围一部分,其
他设置不变,此时的输出如下
图,可清楚的看到只有坐标点上下左右一格有
显示
图3.11 输出信号
c) 计时器及数码管显示模块(timer)的仿真:
该模块负责计时以及将时间和已走步数用数码管显示出来。
检查是否能正常输出控制信号,输入信号如下图所示,输入的已走步数
为22,不计时状态。
图3.12 输入信号设置
此时的输出应是显示时间为“00”,显示已走步数为“022”.
10 22
数字电路综合实验报告
图3.13 输出信号
四、 功能说明及资源利用情况
1、功能说明:
1) 开机小动画,游戏胜利小动画以及游戏失败小动画
玩家从待
机模式,按下BTN0按键进入选择游戏模式阶段,此间有个
小动画(锁打开的渐变过程)。同时,当游
戏胜利或失败都有相应的动
画显示。
图4.1 待机界面
2)
两种游戏模式
① 为基本要求中的普通模式 。
②
迷雾模式,即只能看到相距一格的地图。
11 22
数字电路综合实验报告
图4.2
选择游戏模式界面
图4.3 迷雾模式界面
3)
4)
两种游戏难度
① 限制游戏时间为30s。
②
限制游戏时间为20s,限制游戏步数不超过30步。
三幅内置地图以及随机选地图功能
图4.4 选择地图界面
图4.5 地图1
图4.6 地图2
图4.7 地图3
5)
6)
倒计时报警功能
当时间仅剩1
0秒时,蜂鸣器会发出频率约为1Hz的声音。当仅剩5
秒时,蜂鸣器会发出频率约为0.5Hz的声音
。
能够统计已走步数
在所有模式中都支持统计已走步数,并用数码管显示。
12 22
数字电路综合实验报告
2、资源利用情况:
由上图可得,元器件利用率为76%。
五、 故障及问题分析
问题一:点阵显示不正常。
问题描述:点阵显示十分暗。
问题解决:经过询问老师
,发现输入频率太高,未经分频就将50MHz
接入,降低频率后显示正常。
问题二:数码管显示不正常。
问题描述:数码管需要显示五个数字,但没办法同时清晰的显示。
问题解决:与问题一的原因类似,输入时钟频率太高,调低频率之后解
决了问题。
问题三:点阵显示无法按照预定模式跳转。
问题描述:当游戏从选择游戏模式阶段到选
择游戏地图阶段,点阵没有
显示相应的选择画面,而是直接跳转到游戏进行时阶段。
问
题解决:通过分析,发现点阵显示模块输入的时钟频率远远小于控制
模块,导致控制模块发出的控制信号
,点阵显示模块没法及时的接受。通过调整
两个模块接入的时钟频率,顺利解决了问题。
问题四:timer模块仿真波形毛刺太多
问题解决:通过查阅资料,发现异步模式的代
码是造成大量冒险的主要
原因,将代码重写成同步的,毛刺就减少到可接受范围了。
13 22
数字电路综合实验报告
六、 总结和结论
在这次数电综
合实验中,我收获了很多,将上学期的知识运用到了实际,
丰富了独立设计一个小系统的经验。
1、自顶向下的程序设计思想
通过老师第一次课的教导以及
自己阅读教材,我觉得自顶向下的思想比
较适合设计迷宫游戏,于是决定采用这种编程思路。首先分析出
整个游戏主要的
功能模块,整体把握整个系统的流程,分析出每个功能模块的IO接口,然后再
具体实现每个模块的功能,其中控制模块是最重要的部分,它掌握着整个游戏的
流程,先实现控制模块,
再去实现其他模块,能让自己对整个程序有个更好的把
握。
2、初步明白了硬件编程语言与软件编程语言的区别
这次实验是我第一次运用HDL实现一
个小系统,因为之前一直习惯用C++
这种高级语言编程,在这次实验中也碰了一些壁。但最后也领悟到
了一些区别,
首先VHDL中的有些语句是不能综合的,比如除法就不能在硬件上直接实现,也
不能用下标带变量的向量直接给输出信号赋值。在自己写的第一版程序中就有许
多用到除法的地方,最后
只能想办法绕过了除法。其次,硬件编程要考虑时延、
冒险等问题。总之硬件编程要时刻关注自己写的代
码能不能在硬件上实现以及硬
件上的时序问题。
3、增强了仿真能力
老师
在第一次课上反复提醒我们软件仿真的重要性,自己在实验过程中深有
体会,在每个模块写好之后,我都
仔细仿真过了一遍。在第一次下载到板子之后,
虽然也出现了些问题,但主要都是分频等比较难用仿真解
决的问题。仿真也确实
为自己节约了很多花在实验室里的问题。
4、独立设计系统的经验 <
br>这次实验的代码量虽然也不过一千多行,但也算积累了自己设计,调试系统
的经验,增强了信心以
及排除困难的毅力。
七、 附录:源程序
考虑到篇幅的问题,仅附上控制器模块的代码,全部代码将在电子版中呈上。
Controller模块代码:
LIBRARY IEEE;
USE
_LOGIC_;
USE _LOGIC_;
USE _LOGIC_;
USE
C_;
ENTITY controller IS
14 22
数字电路综合实验报告
PORT(
timemsg:
IN STD_LOGIC; --timer模块的反馈信号
clk:
IN STD_LOGIC;
reset: IN STD_LOGIC;
--btn7
turn_up: IN STD_LOGIC;
--btn0
turn_down: IN STD_LOGIC;
--btn1
turn_right: IN STD_LOGIC;
--btn2
turn_left: IN STD_LOGIC;
--btn3
--对timer模块的控制信号
cont_time: OUT STD_LOGIC; --0表示停止计时,1表示开始计时
--已走步数
num_step_x: OUT INTEGER
RANGE 0 TO 9;
num_step_y: OUT INTEGER
RANGE 0 TO 9;
num_step_z: OUT INTEGER
RANGE 0 TO 9;
--对lattice模块的控制信号
game_state_out:OUT STD_LOGIC_VECTOR(2 DOWNTO
0);--游戏状态
maps: OUT
STD_LOGIC_VECTOR(1 DOWNTO 0); --地图选择
modes: OUT STD_LOGIC_VECTOR(1 DOWNTO
0);--模式xuanze
x: OUT INTEGER
RANGE 0 TO 7;--玩家位置横坐标
y: OUT
INTEGER RANGE 0 TO 7;--玩家位置纵坐标
);
END controller;
ARCHITECTURE behave
OF controller IS
TYPE Con_State IS (WaitMsg,C
hoLevel,ChoMaps,ChoModes,Moving,Win,Lose);
TYPE Map_Matrix IS ARRAY (0 TO 7)OF
STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL
state:Con_State;
SIGNAL x_de:INTEGER RANGE 0
TO 7;
SIGNAL y_de:INTEGER RANGE 0 TO 7;
SIGNAL destination:INTEGER RANGE 0 TO 77;
SIGNAL mapmatrix:Map_Matrix;
SIGNAL
x_temp:INTEGER RANGE 0 TO 7;
SIGNAL
y_temp:INTEGER RANGE 0 TO 7;
SIGNAL
num_step_xtmp:INTEGER RANGE 0 TO 9;
SIGNAL
num_step_ytmp:INTEGER RANGE 0 TO 9;
SIGNAL
num_step_ztmp:INTEGER RANGE 0 TO 9;
SIGNAL
random:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
PROCESS(clk) --
BEGIN
15 22
con_buzzer: OUT STD_LOGIC_VECTOR(2 DOWNTO
0);--蜂鸣器控制信号
level: BUFFER
STD_LOGIC_VECTOR(1 DOWNTO 0) --游戏难度
数字电路综合实验报告
IF
FALLING_EDGE(clk)THEN
IF random =
random<=
ELSE
random<= random +
'1';
END IF;
END IF;
END
PROCESS;
PROCESS(clk,reset,state)
--initial
VARIABLE
mapchoice:STD_LOGIC_VECTOR(1 DOWNTO 0);
VARIABLE con:STD_LOGIC;
BEGIN
IF
reset='1' THEN --复位
state<= WaitMsg;
game_state_out<=
cont_time<='0';
num_step_xtmp<=0;
num_step_ytmp<=0;
num_step_ztmp<=0;
modes<=
ELSIF
FALLING_EDGE(clk)THEN
CASE state IS
WHEN WaitMsg => --待机状态
game_state_out<=
cont_time<='0';
IF turn_up = '1' THEN
state<=ChoModes;
END IF;
WHEN ChoModes =>--选择游戏模式状态
game_state_out<=输出游戏状态信号:选择模式阶段
IF
turn_up = '1' THEN
modes<=
state<=ChoLevel;
ELSIF turn_down =
'1'THEN
modes<=
state<=ChoLevel;
END IF;
con:='1';
WHEN ChoLevel=> --选择游戏难度状态
game_state_out<= --输出游戏状态信号:选择难度阶段
IF turn_up='1'THEN
level<=
state<=ChoMaps;
16
22
数字电路综合实验报告
ELSIF
turn_down='1'THEN
level<=
state<=ChoMaps;
END IF;
WHEN ChoMaps => --选择游戏地图状态
game_state_out<=输出游戏状态信号:选择地区阶段
IF
turn_up ='1' THEN --map1
mapchoice:=
ELSIF turn_down ='1'
THEN --map2
mapchoice:=
ELSIF turn_right = '1' THEN --map3
mapchoice:=
ELSIF turn_left = '1'
THEN --随机
IF con='1'THEN
mapchoice:=random; con:='0';
END IF;
ELSE
mapchoice:=
maps<=
-- state<= ChoMaps;
END IF;
CASE mapchoice IS
WHEN
When
maps<= -- map1
mapmatrix<=(
y_temp<=6;
x_temp<=7;
y_de<=6;
x_de<=0;
state<= Moving;
num_step_xtmp<=0;
num_step_ytmp<=0;
num_step_ztmp<=0;
WHEN
17
22
数字电路综合实验报告
maps<= -- map2
mapmatrix<=(
y_temp<=1;
x_temp<=0;
y_de<=7;
x_de<=2;
state<= Moving;
num_step_xtmp<=0;
num_step_ytmp<=0;
num_step_ztmp<=0;
WHEN -- map3
maps<= -- map3
mapmatrix<=(
y_temp<=6;
x_temp<=0;
y_de<=0;
x_de<=3;
state<= Moving;
num_step_xtmp<=0;
num_step_ytmp<=0;
num_step_ztmp<=0;
END CASE;
WHEN Moving => --游戏进行时状态
game_state_out<=
cont_time<='1';
--开始计时
con_buzzer<=
IF level=难度级别2游戏结束条
件的判断
state<=Lose;
18 22
数字电路综合实验报告
END IF;
IF timemsg='1' THEN --时间到
state<=Lose;
ELSE
-- 根据输入更新玩家的位置,判断是否到达终点并统计已走步
数
IF turn_up = '1'THEN
IF
y_temp=7 AND mapmatrix(y_temp+1)(x_temp)='0' THEN
x_temp<=x_temp;y_temp<=y_temp+1;
IF num_step_xtmp=9
THEN
num_step_xtmp<=0;
num_step_xtmp<=num_step_xtmp+1;
ELSE
END IF;
IF num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ytmp<=0;
num_step_ytmp<=num_step_ytmp+1;
ELSIF
num_step_xtmp=9 THEN
END IF;
IF
num_step_ztmp=9 AND num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ztmp<=0;
state<=Lose;
ELSIF
num_step_ytmp=9 AND num_step_xtmp=9 THEN
num_step_ztmp<=num_step_ztmp+1;
END IF;
END IF;
ELSIF
turn_down = '1'THEN
IF
y_temp=0 AND mapmatrix(y_temp-1)(x_temp)='0' THEN
x_temp<=x_temp;y_temp<=y_temp-1;
IF num_step_xtmp=9
THEN
num_step_xtmp<=0;
num_step_xtmp<=num_step_xtmp+1;
ELSE
END IF;
IF num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ytmp<=0;
num_step_ytmp<=num_step_ytmp+1;
ELSIF
num_step_xtmp=9 THEN
END IF;
IF
num_step_ztmp=9 AND num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ztmp<=0;
state<=Lose;
19
22
数字电路综合实验报告
ELSIF
num_step_ytmp=9 AND num_step_xtmp=9 THEN
num_step_ztmp<=num_step_ztmp+1;
END IF;
END IF;
ELSIF turn_right = '1'THEN
IF x_temp=7 AND mapmatrix(y_temp)(x_temp+1)='0'
THEN
x_temp<=x_temp+1;y_temp<=y_temp;
IF num_step_xtmp=9 THEN
num_step_xtmp<=0;
num_step_xtmp<=num_step_xtmp+1;
ELSE
END IF;
IF num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ytmp<=0;
num_step_ytmp<=num_step_ytmp+1;
ELSIF
num_step_xtmp=9 THEN
END IF;
IF
num_step_ztmp=9 AND num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ztmp<=0;
state<=Lose;
num_step_ztmp<=num_step_ztmp+1;
ELSIF
num_step_ytmp=9 AND num_step_xtmp=9 THEN
END
IF;
END IF;
ELSIF turn_left =
'1'THEN
IF x_temp=0 AND
mapmatrix(y_temp)(x_temp-1)='0' THEN
x_temp<=x_temp-1;y_temp<=y_temp;
IF num_step_xtmp=9
THEN
num_step_xtmp<=0;
num_step_xtmp<=num_step_xtmp+1;
ELSE
END IF;
IF num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ytmp<=0;
num_step_ytmp<=num_step_ytmp+1;
ELSIF
num_step_xtmp=9 THEN
END IF;
IF
num_step_ztmp=9 AND num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ztmp<=0;
state<=Lose;
20
22
数字电路综合实验报告
ELSIF num_step_ytmp=9 AND
num_step_xtmp=9 THEN
num_step_ztmp<=num_step_ztmp+1;
END IF;
END IF;
END IF;
IF x_temp=x_de AND
y_temp=y_de THEN
state<=Win;
END IF;
END IF;
WHEN Win => --游戏胜利状态
con_buzzer<=
game_state_out<=
cont_time<='0';
WHEN Lose =>
--游戏失败状态
game_state_out<=
cont_time<='0';
END CASE;
END IF;
END PROCESS;
x<=x_temp;
y<=y_temp;
num_step_x<=num_step_xtmp;
num_step_y<=num_step_ytmp;
num_step_z<=num_step_ztmp;
END;
21 22