当前位置:首页 > 可编程逻辑电路设计大作业实验报告 - 图文
可编程逻辑电路设计大作业实验报告
小游戏——打地鼠的设计实现
00748023 齐璐晔 :luyeolivia@sina.com 13520183203
00748055 王禹 : huanhuan_19890806@126.com 13488695754 00748093 周天瑶: zhoutianyaoyao@163.com 15801519997
第一部分 系统概述
【功能介绍】 小游戏打地鼠:
游戏共分三关,第一关、第二关闯关分数为40分,、第三关闯关分数为20分,共100分。每关从70S开始进行倒计时,在限定时间内达到闯关分数即可进入下一关游戏,每进入下一关时,会显示相应的闯关画面。关数越高,地鼠出现速度越快,难度越大,乐趣越多。拨下PLAY键(S1)开始游戏,在任一关闯关失败则游戏结并会显示失败画面;若闯通三关,则游戏成功并显示祝贺画面,同时由发光二极管构成的跑马灯闪亮。在任意时刻拨动RESET键(S2)重新开始游戏。
VGA界面显示:游戏未开始,STAGE 1,STAGE 2,STAGE 3, 打地鼠游戏画面,通关成功及
失败画面
音乐输出: 从始至终通过蜂鸣器播放背景音乐——《音乐之声》
键盘输入: FPGA开发板的4*4键盘阵列,16个按钮分别对应屏幕显示的16个地鼠
可能出现的位置。
【输入输出】
输入信号:时钟信号clk1:20MHz , clk10HZ: 10Hz ; 列线扫描信号column ; 开始信号: play; 复位信号:RESET, 输出信号:
数码管选通信号:SE L
蜂鸣器数据信号:BUZZER LED灯控信号:TEST 行线扫描输出信号:row 数码管数据信号:SEG VGA行扫描信号:hs
VGA场扫描信号:vs
视频R通路信号: red 视频G通路信号: green 视频B通路信号: blue 【系统框图】
时钟信号clk10Hz 时钟信号clk1 列线扫描信号 按键信号 key_code 音频处理 蜂鸣器输出信号BUZZER column 键盘扫描 随机数 产生 分数计量 得分 冒出老鼠信号 out_mos CBA 开始信号 PLAY 复位信号 RESET 图像控制图像控 制信号 RGBX, RGBY VGA 扫描输出 行扫描信号hs 场扫描信号vs 视频R通路 red 视频G通路green 视频B通路blue 倒计时 计时信号temp 数码管控制 数码管选通 信号SEL 数码管数据 信号SEG LED灯控 二极管控制 信号test
第二部分 各模块功能实现详述
【主程序逻辑控制模块】
1、主程序逻辑控制模块功能描述
主程序逻辑控制模块主要分为五大部分:老鼠随机出现及其频率控制、倒计时器、计分器、LED跑马灯显示、数码管显示。 2、各部分的具体实现
☆ 老鼠随机出现及其频率控制
(1) 模块输入:clk:通过主时钟分频得到的1MHZ的时钟。
play:play=1,由开机画面进入游戏;play=0,显示开机画面,系统初始化。 flag:flag=1,显示游戏失败画面;flag=0,显示游戏进行中或游戏成功画面。 reset:高电平有效reset=1,游戏复位。
在此,play、flag、reset均作为老鼠随机出现的判断条件。 (2) 模块输出:OUT_MOS:代表当前哪一只老鼠冒出 (3) 实现算法:
利用QN :STD_LOGIC_VECTOR(27 DOWNTO 0)进行分频计数,越高位其时钟周期越长,根据得分的不同,选择不同的四位代表老鼠出现的频率,从而实现了随着分数的增高,老鼠冒出的频率变快 (4) 设计关键代码:
case B is --B为得分的十位数
when 0|1|2|3 =>REDN <= QN(23 DOWNTO 20); --得分小于40,老鼠2s冒出一个 when 4|5|6|7 =>REDN <= QN(22 DOWNTO 19); --得分40—80,老鼠1s冒出一个 when 8|9 =>REDN <= QN(21 DOWNTO 18); --得分80—100,老鼠0.5s冒出一个 when others =>NULL; end case;
case REDN is --REDN从0—15,依次对应16个伪随机数 when \ OM1; ……
when \ OM16; when others=>NULL; end case; ☆ 倒计时器
(1) 模块输入:CLKT:利用QN对clk1分频得到的倒计时时钟。
play:play=1,由开机画面进入游戏;play=0,显示开机画面,系统初始化。 flag:flag=1,显示游戏失败画面;flag=0,显示游戏进行中或游戏成功画面。 reset:高电平有效reset=1,游戏复位。
在此,play、flag、reset均作为倒计时的判断条件。 (2) 模块输出:AC、BC:分别表示倒计时的个位、十位。 (3) 实现算法:
设置signal:
count:作为截止当前已经出现老鼠个数的标识,CLKT上升沿count加一。在stage1中count即等于老鼠出现是数目,在stage2中count加一表示老鼠出现了2只,在stage3中count加一表示老鼠出现了4只。
temp:代表倒计时的剩余时间,每个stage都从70开始倒计时。
每一个stage,利用count来限定通过这个stage所用的时限,利用得分来作为判断进入下一关的条件。 (4) 设计关键代码:
IF(CLKT'EVENT AND CLKT='1')THEN COUNT<=COUNT+1; -----------stage one-------
iF(COUNT=71 AND B<4 and c=0 ) THEN-- 未通过stage1 flag <='1' ; temp <=0; --倒计时清零
ELSIF(COUNT<71 AND B>=4 and c=0 and A=0 ) THEN--通过stage1
COUNT<=71;FLAG<='0';TEMP<=70; --count置为71(为使stage2从70开
--始倒计时),倒计时置为70
ELSIF(COUNT<71 AND B<4 AND C=0 )THEN --处于stage1过程中 FLAG<='0';TEMP<=70-COUNT; --从70开始进行倒计时 ------------stage two-----------
ELSIF(COUNT=142 AND B<8 and c=0 ) THEN --未通过stage2 FLAG<='1';TEMP<=0; --倒计时清零
ELSIF(COUNT<142 AND B>=8 and c=0 AND A=0 ) THEN --通过stage2
COUNT<=142;FLAG<='0';TEMP<=70; --count设为142(为使stage3
--70开始倒计时,倒计时置为70
ELSIF(COUNT<142 AND B<8 AND C=0 )THEN --处于stage2过程中 FLAG<='0';TEMP<=141-COUNT; --从70开始进行倒计时 ------------stage three-----------
ELSIF(COUNT=213 AND c<1 ) THEN --未通过stage3 FLAG<='1';TEMP<=0; --倒计时清零 ELSIF(COUNT<213 AND c=1 ) THEN --通过stage3 COUNT<=213;FLAG<='0';TEMP<=0; --倒计时置为0 ELSIF(COUNT<213 AND c<1 ) THEN --处于stage3过程中 FLAG<='0';TEMP<=212-COUNT; --从70开始进行倒计时 ELSE
FLAG<='0';COUNT<=0;TEMP<=0; END IF; ☆计分器
(1) 模块输入:OUT_MOS:代表当前哪一只老鼠冒出。 EDS_RKN2:代表当前哪一个按键被按下。
play:play=1,由开机画面进入游戏;play=0,显示开机画面,系统初始化。 flag:flag=1,显示游戏失败画面;flag=0,显示游戏进行中或游戏成功画面。 reset:高电平有效reset=1,游戏复位。
在此,play、flag、reset均为是否计分的判断条件。 (2) 模块输出:A、B、C:分别表示得分的个位、十位、百位。 (3) 实现算法:
设置signal:
Yes_No:作为是否打中老鼠的判断标识,Yes_No=1表示打中,Yes_No=0表示未打中。 首先利用OUT_MOS和EDS_RKN2进行是否打中老鼠的判断,由于每次仅有一只老鼠冒出,因此只有当OUT_MOS与EDS_RKN2完全相同的情况下,才表明打中老鼠,以此作为判断条件。然后只有在打中老鼠的前提条件下,从加分。 (4) 设计关键代码:
--只有当前冒出的是第n只老鼠,而当前按下的是第n个按键的条件下(n:1—16),才--表示打中老鼠,且对于冒出的一个老鼠,不管按几次相应的按键,得分只加一分。 IF(((OUT_MOS(1) = '1'and EDS_RKN2(1) = '1') OR( OUT_MOS(4) ='1'and EDS_RKN2(4) = '1') OR (OUT_MOS(7) = '1' and EDS_RKN2(7) = '1') OR (OUT_MOS(2) = '1'and EDS_RKN2(2) = '1') OR( OUT_MOS(5) ='1'and EDS_RKN2(5) = '1') OR (OUT_MOS(8) = '1' and EDS_RKN2(8) = '1') OR (OUT_MOS(3) = '1'and EDS_RKN2(3) = '1') OR( OUT_MOS(6) ='1'and EDS_RKN2(6) = '1')
OR (OUT_MOS(9) = '1' and EDS_RKN2(9) = '1') OR( OUT_MOS(10) ='1'and EDS_RKN2(10) = '1')
共分享92篇相关文档