数字电路综合实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:选作题目:简易迷宫游戏一、课题的任务要求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 迷宫游戏的逻辑划分方框图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.3 迷宫游戏控制器逻辑流程图图2.4 controller模块元件图2)计时兼数码管显示模块(timer)timer模块受到controller模块的控制,controller模块将传递游戏状态信号、计时控制信号、游戏难度信号以及已走步数信号给timer。
timer 模块利用case选择语句对相应的控制信号做出相应。
并利用视觉暂留效应,将时间与已走步数显示在数码管上。
图2.5 timer元件图以下是控制数码管显示的代码,负责同时显示时间和已走步数:IF cont_display =4 THEN –模为5的计数器,轮流显示5个数字cont_display<=0;ELSEcont_display<= cont_display+1;END IF;CASE cont_display IS –通过选择计数器的状态,来显示相应的数字WHEN 0 =>con_nixietube<= "101111";nixietube<=nixietube1; --时间的个位WHEN 1 =>con_nixietube<= "011111";nixietube<=nixietube2;--时间的十位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模块元件图迷雾显示部分代码如下: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=>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";WHEN 2=>colg_tmp0(7 DOWNTO 4)<="0000";colg_tmp0(0)<='0';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';WHEN 3=>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"; WHEN 4=>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"; WHEN 5=>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 6=>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";WHEN 7=>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";END CASE;4)分频模块(div_cl)系统中的各个模块的输入时钟频率不全部相同,且得满足一定的要求,如点阵显示与数码管显示输入频率不能太高,实验板提供的50Mhz频率太高,需要分频。