为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

北京邮电大学数字电路实验迷宫游戏

2018-01-21 31页 doc 67KB 18阅读

用户头像

is_105949

暂无简介

举报
北京邮电大学数字电路实验迷宫游戏北京邮电大学数字电路实验迷宫游戏 ------------------------------------------------------------------------------------------------ 北京邮电大学数字电路实验迷宫游戏 数字电路综合实验报告 数字电路综合实验报告 学 院:信息与通信工程学院 班 级: 班内序号: 姓 名: 学 号: 选作题目:简易迷宫游戏 数字电路综合实验报告 一、 课题的任务要求 1、基本要求: 1) 用8×8点阵进行游戏显示。 2) 迷...
北京邮电大学数字电路实验迷宫游戏
北京邮电大学数字电路实验迷宫游戏 ------------------------------------------------------------------------------------------------ 北京邮电大学数字电路实验迷宫游戏 数字电路综合实验报告 数字电路综合实验报告 学 院:信息与通信工程学院 班 级: 班内序号: 姓 名: 学 号: 选作目:简易迷宫游戏 数字电路综合实验报告 一、 课题的任务要求 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,通过接收控制模块的控制信号,—————————————————————————————————————— ------------------------------------------------------------------------------------------------ 控制不同游戏模式或状态下的点阵输出。其他次要模块主要为:分频模块,防抖模块,蜂鸣器驱动模块。 迷宫游戏的划分方框图如下: 图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模块的控制,controller模块将传递游戏状态信号、计时控制信号、游戏难度信号以及已走步数信号给timer。—————————————————————————————————————— ------------------------------------------------------------------------------------------------ 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<= "101111";nixietube<=nixietube1; --时间的个位 con_nixietube<= "011111";nixietube<=nixietube2;--时间的十位 WHEN 1 => WHEN 2 => con_nixietube<= "111110";nixietube<=nixietubex; --已走步数的个位 WHEN 3 => con_nixietube<= "111101";nixietube<=nixietubey;--已走步数的十位 WHEN 4 => —————————————————————————————————————— ------------------------------------------------------------------------------------------------ con_nixietube<= "111011";nixietube<=nixietubez;--已走步数的百位 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)<="000000"; colg_tmp1(7 DOWNTO 2)<="000000"; colg_tmp2(7 DOWNTO 2)<="000000"; colg_tmp3(7 DOWNTO 2)<="000000"; colg_tmp4(7 DOWNTO 2)<="000000"; colg_tmp5(7 DOWNTO 2)<="000000"; colg_tmp6(7 DOWNTO 2)<="000000"; colg_tmp7(7 DOWNTO 2)<="000000"; WHEN 1=> 5 / 22 数字电路综合实验报告 colg_tmp0(7 DOWNTO 3)<="00000"; colg_tmp1(7 DOWNTO 3)<="00000"; colg_tmp2(7 DOWNTO 3)<="00000"; colg_tmp3(7 DOWNTO 3)<="00000"; colg_tmp4(7 DOWNTO 3)<="00000"; colg_tmp5(7 DOWNTO 3)<="00000"; colg_tmp6(7 DOWNTO 3)<="00000"; colg_tmp7(7 DOWNTO 3)<="00000"; colg_tmp1(7 DOWNTO 4)<="0000";colg_tmp1(0)<='0'; colg_tmp2(7 DOWNTO 4)<="0000";colg_tmp2(0)<='0'; colg_tmp3(7 DOWNTO 4)<="0000";colg_tmp3(0)<='0'; colg_tmp4(7 —————————————————————————————————————— ------------------------------------------------------------------------------------------------ DOWNTO 4)<="0000";colg_tmp4(0)<='0'; colg_tmp5(7 DOWNTO 4)<="0000";colg_tmp5(0)<='0'; colg_tmp6(7 DOWNTO 4)<="0000";colg_tmp6(0)<='0'; colg_tmp7(7 DOWNTO 4)<="0000";colg_tmp7(0)<='0'; colg_tmp0(7 DOWNTO 5)<="000";colg_tmp0(1 DOWNTO 0)<="00"; colg_tmp1(7 DOWNTO 5)<="000";colg_tmp1(1 DOWNTO 0)<="00"; colg_tmp2(7 DOWNTO 5)<="000";colg_tmp2(1 DOWNTO 0)<="00"; colg_tmp3(7 DOWNTO 5)<="000";colg_tmp3(1 DOWNTO 0)<="00"; colg_tmp4(7 DOWNTO 5)<="000";colg_tmp4(1 DOWNTO 0)<="00"; colg_tmp5(7 DOWNTO 5)<="000";colg_tmp5(1 DOWNTO 0)<="00"; colg_tmp6(7 DOWNTO 5)<="000";colg_tmp6(1 DOWNTO 0)<="00"; colg_tmp7(7 DOWNTO 5)<="000";colg_tmp7(1 DOWNTO 0)<="00"; colg_tmp0(7 DOWNTO 6)<="00";colg_tmp0(2 DOWNTO 0)<="000"; colg_tmp1(7 DOWNTO 6)<="00";colg_tmp1(2 DOWNTO 0)<="000"; colg_tmp2(7 DOWNTO 6)<="00";colg_tmp2(2 DOWNTO 0)<="000"; colg_tmp3(7 DOWNTO 6)<="00";colg_tmp3(2 DOWNTO 0)<="000"; colg_tmp4(7 DOWNTO 6)<="00";colg_tmp4(2 DOWNTO 0)<="000"; colg_tmp5(7 DOWNTO 6)<="00";colg_tmp5(2 DOWNTO 0)<="000"; colg_tmp6(7 DOWNTO 6)<="00";colg_tmp6(2 DOWNTO 0)<="000"; colg_tmp7(7 DOWNTO 6)<="00";colg_tmp7(2 DOWNTO 0)<="000"; colg_tmp0(7)<='0';colg_tmp0(3 DOWNTO 0)<="0000"; colg_tmp1(7)<='0';colg_tmp1(3 DOWNTO 0)<="0000"; —————————————————————————————————————— ------------------------------------------------------------------------------------------------ colg_tmp2(7)<='0';colg_tmp2(3 DOWNTO 0)<="0000"; colg_tmp3(7)<='0';colg_tmp3(3 DOWNTO 0)<="0000"; colg_tmp4(7)<='0';colg_tmp4(3 DOWNTO 0)<="0000"; colg_tmp5(7)<='0';colg_tmp5(3 DOWNTO 0)<="0000"; colg_tmp6(7)<='0';colg_tmp6(3 DOWNTO 0)<="0000"; colg_tmp7(7)<='0';colg_tmp7(3 DOWNTO 0)<="0000"; WHEN 2=>colg_tmp0(7 DOWNTO 4)<="0000";colg_tmp0(0)<='0'; WHEN 3=> WHEN 4=> WHEN 5=> WHEN 6=> 6 / 22 数字电路综合实验报告 colg_tmp0(4 DOWNTO 0)<="00000"; colg_tmp1(4 DOWNTO 0)<="00000"; colg_tmp2(4 DOWNTO 0)<="00000"; colg_tmp3(4 DOWNTO 0)<="00000"; colg_tmp4(4 DOWNTO 0)<="00000"; colg_tmp5(4 DOWNTO 0)<="00000"; colg_tmp6(4 DOWNTO 0)<="00000"; colg_tmp7(4 DOWNTO 0)<="00000"; colg_tmp0(5 DOWNTO 0)<="000000"; colg_tmp1(5 DOWNTO 0)<="000000"; colg_tmp2(5 DOWNTO 0)<="000000"; colg_tmp3(5 DOWNTO 0)<="000000"; colg_tmp4(5 DOWNTO 0)<="000000"; colg_tmp5(5 DOWNTO 0)<="000000"; colg_tmp6(5 DOWNTO 0)<="000000"; colg_tmp7(5 DOWNTO 0)<="000000"; 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’),进入游戏后,先向左(turn_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) 倒计时报警功能 当时间仅剩10秒时,蜂鸣器会发出频率约为1Hz的声音。当仅剩5秒时,蜂鸣器会发出频率约为0.5Hz的声音。 能够统计已走步数 在所有模式中都支持统计已走步数,并用数码管显示。 12 / 22 数字电路综合实验报告 2、资源利用情况: 由上图可得,元器件利用率为76%。 五、 故障及问题分析 问题一:点阵显示不正常。 问题描述:点阵显示十分暗。 问题解决:经过询问老师,发现输入频率太高,未经分频就将50MHz 接入,降低频率后显示正常。 问题二:数码管显示不正常。 问题描述:数码管需要显示五个数字,但没办法同时清晰的显示。 问题解决:与问题一的原因类似,输入时钟频率太高,调低频率之后解决了问题。 问题三:点阵显示无法按照预定模式跳转。 问题描述:当游戏从选择游戏模式阶段到选择游戏地图阶段,点阵没有显示相应的选择画面,而是直接跳转到游戏进行时阶段。 —————————————————————————————————————— ------------------------------------------------------------------------------------------------ 问题解决:通过分析,发现点阵显示模块输入的时钟频率远远小于控制模块,导致控制模块发出的控制信号,点阵显示模块没法及时的接受。通过调整两个模块接入的时钟频率,顺利解决了问题。 问题四:timer模块仿真波形毛刺太多 问题解决:通过查阅资料,发现异步模式的代码是造成大量冒险的主要 原因,将代码重写成同步的,毛刺就减少到可接受范围了。 13 / 22 数字电路综合实验报告 六、 和结论 在这次数电综合实验中,我收获了很多,将上学期的知识运用到了实际,丰富了独立设计一个小系统的经验。 1、自顶向下的程序设计思想 通过老师第一次课的教导以及自己阅读教材,我觉得自顶向下的思想比较适合设计迷宫游戏,于是决定采用这种编程思路。首先分析出整个游戏主要的功能模块,整体把握整个系统的流程,分析出每个功能模块的I/O接口,然后再具体实现每个模块的功能,其中控制模块是最重要的部分,它掌握着整个游戏的流程,先实现控制模块,再去实现其他模块,能让自己对整个程序有个更好的把握。 2、初步明白了硬件编程语言与软件编程语言的区别 这次实验是我第一次运用HDL实现一个小系统,因为之前一直习惯用C++这种高级语言编程,在这次实验中也碰了一些壁。但最后也—————————————————————————————————————— ------------------------------------------------------------------------------------------------ 领悟到了一些区别,首先VHDL中的有些语句是不能综合的,比如除法就不能在硬件上直接实现,也不能用下标带变量的向量直接给输出信号赋值。在自己写的第一版程序中就有许多用到除法的地方,最后只能想办法绕过了除法。其次,硬件编程要考虑时延、冒险等问题。总之硬件编程要时刻关注自己写的代码能不能在硬件上实现以及硬件上的时序问题。 3、增强了仿真能力 老师在第一次课上反复提醒我们软件仿真的重要性,自己在实验过程中深有体会,在每个模块写好之后,我都仔细仿真过了一遍。在第一次下载到板子之后,虽然也出现了些问题,但主要都是分频等比较难用仿真解决的问题。仿真也确实为自己节约了很多花在实验室里的问题。 4、独立设计系统的经验 这次实验的代码量虽然也不过一千多行,但也算积累了自己设计,调试系统的经验,增强了信心以及排除困难的毅力。 七、 附录:源程序 考虑到篇幅的问题,仅附上控制器模块的代码,全部代码将在电子版中呈上。 Controller模块代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; —————————————————————————————————————— ------------------------------------------------------------------------------------------------ USE IEEE.NUMERIC_STD.ALL; 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,ChoLevel,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 ="11" THEN random<="01"; 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<="000"; cont_time<='0'; —————————————————————————————————————— ------------------------------------------------------------------------------------------------ num_step_xtmp<=0; num_step_ytmp<=0; num_step_ztmp<=0; modes<="00"; ELSIF FALLING_EDGE(clk)THEN CASE state IS WHEN WaitMsg => --待机状态 game_state_out<="000"; cont_time<='0'; IF turn_up = '1' THEN state<=ChoModes; END IF; WHEN ChoModes =>--选择游戏模式状态 game_state_out<="001"; --输出游戏状态信号:选择模式阶段 IF turn_up = '1' THEN modes<="01"; state<=ChoLevel; ELSIF turn_down = '1'THEN modes<="10"; state<=ChoLevel; END IF; con:='1'; —————————————————————————————————————— ------------------------------------------------------------------------------------------------ WHEN ChoLevel=> --选择游戏难度状态 game_state_out<="110"; --输出游戏状态信号:选择难度阶段 IF turn_up='1'THEN level<="01"; state<=ChoMaps; 16 / 22 数字电路综合实验报告 ELSIF turn_down='1'THEN level<="10"; state<=ChoMaps; END IF; WHEN ChoMaps => --选择游戏地图状态 game_state_out<="010"; --输出游戏状态信号:选择地区阶段 IF turn_up ='1' THEN --map1 mapchoice:="01"; ELSIF turn_down ='1' THEN --map2 mapchoice:="10"; ELSIF turn_right = '1' THEN --map3 mapchoice:="11"; ELSIF turn_left = '1' THEN --随机 IF con='1'THEN mapchoice:=random; con:='0'; —————————————————————————————————————— ------------------------------------------------------------------------------------------------ END IF; ELSE mapchoice:="00"; maps<="00"; -- state<= ChoMaps; END IF; CASE mapchoice IS WHEN "00" => state<=ChoMaps; When "01" => maps<="01"; -- map1 mapmatrix<=("11111110", "10000010", "10111010", "10101010", "10101010", "10100011", "00111000", "11111111"); 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 "10"=> 17 / 22 数字电路综合实验报告 maps<="10"; -- map2 mapmatrix<=("11111111", "10001000", "10100011", "10111011", "10001101", "10100101", "10110011", "11111011"); 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 "11" => -- map3 maps<="11"; -- map3 mapmatrix<=("11110100", "10000100", "01011011", "11011001", "10010101", "10011101", "01000000", "11111111"); 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<="011"; --playing cont_time<='1'; --开始计时 con_buzzer<="010"; IF level="10" AND num_step_xtmp=0 AND num_step_ytmp=3 THEN--难度级别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<="000"; game_state_out<="100"; cont_time<='0'; WHEN Lose => --游戏失败状态 game_state_out<="101"; 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 ——————————————————————————————————————
/
本文档为【北京邮电大学数字电路实验迷宫游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索