一、设计题目说明

此设计意在实现一个相对具有娱乐性的打地鼠游戏模块功能,能够产生随机出现的地鼠,并能对虚拟的敲击按键做出灵敏的识别与判断,从而进行必要的计分与计时行为。

二、实验平台

开发软件:

Quartus II 9.0sp2 Web Edition

开发板:

ALTERA FLEX EPF10K20TI144-4 CAA239743

三、总体设计思路

结构:

取八位晶体管的前四位数码管作为随机地鼠出现的显示区域,后四位对半分为前两位的倒计时显示模块和后两位的分数计数模块;八个按键脉冲开关取前四位作为地鼠的敲击按键;以数码管的动态化显示代表是否击中。

功能:

在游戏开始前,首先根据产生的伪随机数生成地鼠出现的位置信息,由指定的时钟脉冲信号控制地鼠跳动的频率,最终交由晶体管显示。重置倒计时与分数,待随机数已生成一段时间,拨动开始键,驱动游戏进行。此时倒计时与比较模块开始工作,将地鼠出现的位置信息与敲击按键的位置信息进行比对,如果一致,则分数加一,如不一致,分数保持不变,直到60s倒计时结束,各模块停止工作。按下重置键复位重新开始游戏。

四、详细模块设计

①分频模块:

将100,000Hz的时钟信号源分频为所需的1Hz时钟信号,使得时钟信号能够每秒产生一个时钟脉冲。

--分频模块library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity divclock is
port( oldclk: IN std_logic;currclk: buffer std_logic);
end;
architecture one of divclock isconstant useHz:integer:=100000;--旧时钟频率为100000Hz
beginprocess(oldclk)variable count:integer range 0 to useHz-1;--设置计数器,保留旧时钟频率产生上升沿的次数beginif oldclk'event and oldclk='1' thenif count=(useHz-1)/2 then--0.5s时,计数器置0,新时钟翻转count:=0;currclk<=NOT currclk;elsecount:=count+1;end if;end if;end process;
end one;
②随机数模块:

取m序列的每四位的后两位,产生一定数量的伪随机数,作为地鼠的位置信息。

--output 2bits random number
--利用m序列产生四位随机数,取每四位的后两位作为本次课设所需的随机数library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;entity rand is
port(Reset: IN std_logic;Clk: IN std_logic;Data_out: OUT std_logic_vector(1 downto 0));
end rand;architecture rtl of rand issignal Shift_Register:std_logic_vector(3 downto 0);beginprocess(Reset,Clk)
begin
if(Reset='1') thenShift_Register<="1000";
else if(Clk'event and Clk='1') thenData_Out<=Shift_Register(1 downto 0);Shift_Register(0)<=Shift_Register(1);Shift_Register(1)<=Shift_Register(2);Shift_Register(2)<=Shift_Register(3);Shift_Register(3)<=Shift_Register(3) xor Shift_Register(0);
end if;
end if;
end process;end rtl;
③按键模块:

通过转码,将按键的位置信息转化为对应位置上地鼠的位置信息。

--按键模块library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity button_decode isport(a,b,c,d: IN std_logic;--定义4个按键--clk: IN std_logic;result: OUT std_logic_vector(1 downto 0));
end button_decode;architecture one of button_decode is
beginprocess(a,b,c,d)begin--对按键进行位置信息的转换--if(clk'event and clk='1') thenif a='0' thenresult<="11";elsif b='0' thenresult<="10";elsif c='0' thenresult<="01";elsif d='0' thenresult<="00";elseresult<=NULL;end if;--end if;end process;
end;
④倒计时模块:

利用分频得到1Hz的时钟频率设置倒计时,每当经过一个时钟脉冲,模块中的计时器减一,直至设定的时间结束为0或者通过reset重置。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity timedown isport(start: IN std_logic;clk: IN std_logic;reset: IN std_logic;S: OUT std_logic_vector(3 downto 0);--十位F: OUT std_logic_vector(3 downto 0);--个位accomplish: OUT std_logic);   --倒计时状态的输出信号,如果倒计时结束,则输出1
end timedown;architecture one of timedown is
beginprocess(clk,start,reset)variable s2:std_logic_vector(3 downto 0);--十位variable f2:std_logic_vector(3 downto 0);--个位beginif(clk'event and clk='1') thenif(reset='1') then     --重置s2:="0110";--6f2:="0000";--0elsif start='1' thenif f2="0000" then   --如果个位等于0而十位不等于0,则将个位置为9,十位减一if s2/="0000" thenf2:="1001";s2:=s2-1;accomplish<='0';else             --如二者都为0,则倒计时保持“00”不变,同时将倒计时状态置为1               accomplish<='1';f2:=f2;s2:=s2;end if;else                --其他情况下,个位减一,倒计时状态置0f2:=f2-1;accomplish<='0';end if;end if;S<=s2;F<=f2;end if;end process;
end one;
⑤比较模块:

将按键模块和随机数模块传入的位置信息进行比较,如果相同,则传送信号‘1’给计分模块,否则传送信号‘0’。

--comparelibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity compare isport(Data_out,button: IN std_logic_vector(1 downto 0);clk: IN std_logic;accomplish: IN std_logic;true: OUT std_logic;start: IN std_logic);
end compare;architecture one of compare is
beginprocess(clk)beginif(start='1') then--如果游戏开始且尚未结束,则进行判断if(accomplish='0') thenif(Data_out=button) then--如果位置信息相同,则置信号为高电平true<='1';elsetrue<='0';end if;end if;end if;end process;
end;
⑥计分模块:

判断比较模块传递的信号,如果位置信息相同则分数加一,否则分数保持不变。

--scorelibrary ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity score isport(clk: IN std_logic;start: IN std_logic;true: IN std_logic;accomplish: IN std_logic;reset: IN std_logic;G: OUT std_logic_vector(7 downto 0));--分数
end score;architecture one of score is
beginprocess(clk,start,true)variable temp1,temp2: std_logic_vector(3 downto 0);--分数的十位与个位beginif(clk'event and clk='1') thenif reset='1' then--重置分数temp1:="0000";--十位temp2:="0000";--个位elseif start='1' and true='1' then--如果游戏开始,且命中地鼠if accomplish='0' then      --如果倒计时没有结束temp2:=temp2+1;           --个位+1if(temp2="1010")then      --如果个位等于10,则十位加一,个位置0temp1:=temp1+1;temp2:="0000";end if;end if;elsif start='1' and true='0' then--如果游戏开始,地鼠未被命中,则分数保持不变if accomplish='1' thentemp2:=temp2;temp1:=temp1;end if;elsif start='0' then  --如果拨下开始键,则分数清零temp2:="0000";temp1:="0000";end if;G(7 downto 4)<=temp1;G(3 downto 0)<=temp2;end if;end if;
end process;
end one;
⑦显示模块:

根据各模块传送的数据,通过动态扫描技术实现相应内容的显示。

--显示模块library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;entity transform is--定义多个接收端用来接收其他模块的信息,从而向晶体管输出对应的信息port(Data_out: IN std_logic_vector(1 downto 0);--地鼠位置信息S: IN std_logic_vector(3 downto 0);       --倒计时十位F: IN std_logic_vector(3 downto 0);       --倒计时个位G: IN std_logic_vector(7 downto 0);       --分数clk: IN std_logic;                        --动态扫描时钟信号true: IN std_logic;                       --比较模块传来的位置比较结果sel: OUT std_logic_vector(7 downto 0);    --位选信号led: OUT std_logic_vector(6 downto 0));   --晶体管显示
end transform;architecture one of transform isbeginprocess(clk,true)variable m: integer range 0 to 4:=0;--定义变量m,以区分不同时间片下晶体管的显示区域beginif(clk'event and clk='1') thenif(m=0) then                  --m=0,以LED形式呈现地鼠(m=others时情况类似)m:=m+1;if(data_out="00") thensel<="11101111";led<="1111110";if(true='1') then         --如果命中,则地鼠呈现被打扁状led<="0001000";end if;elsif(data_out="01") thensel<="11011111";led<="1111110";if(true='1') thenled<="0001000";end if;elsif(data_out="10") thensel<="10111111";led<="1111110";if(true='1') thenled<="0001000";end if;elsif(data_out="11") thensel<="01111111";led<="1111110";if(true='1') thenled<="0001000";end if;end if;elsif(m=1) then     --如果 m=1,切换显示倒计时的十位m:=m+1;sel<="11110111";case S iswhen "0000" => led<="0111111";--0when "0001" => led<="0000110";--1when "0010" => led<="1011011";--2when "0011" => led<="1001111";--3when "0100" => led<="1100110";--4when "0101" => led<="1101101";--5when "0110" => led<="1111101";--6when others => led<="0000000";end case;elsif(m=2) then     --如果 m=2,切换显示倒计时的个位m:=m+1;sel<="11111011";case F iswhen "0000" => led<="0111111";--0when "0001" => led<="0000110";--1when "0010" => led<="1011011";--2when "0011" => led<="1001111";--3when "0100" => led<="1100110";--4when "0101" => led<="1101101";--5when "0110" => led<="1111101";--6when "0111" => led<="0000111";--7when "1000" => led<="1111111";--8when "1001" => led<="1101111";--9when others => led<="0000000";end case;elsif(m=3) then     --如果 m=3,切换显示分数的十位m:=m+1;sel<="11111101";case G(7 downto 4) iswhen "0000" => led<="0111111";--0when "0001" => led<="0000110";--1when "0010" => led<="1011011";--2when "0011" => led<="1001111";--3when "0100" => led<="1100110";--4when "0101" => led<="1101101";--5when "0110" => led<="1111101";--6when "0111" => led<="0000111";--7when "1000" => led<="1111111";--8when "1001" => led<="1101111";--9when others => led<="0000000";end case;elsif(m=4) then     --如果 m=4,切换显示分数的个位m:=0;sel<="11111110";case G(3 downto 0) iswhen "0000" => led<="0111111";--0when "0001" => led<="0000110";--1when "0010" => led<="1011011";--2when "0011" => led<="1001111";--3when "0100" => led<="1100110";--4when "0101" => led<="1101101";--5when "0110" => led<="1111101";--6when "0111" => led<="0000111";--7when "1000" => led<="1111111";--8when "1001" => led<="1101111";--9when others => led<="0000000";end case;end if;end if;end process;
end one;

之后将编译好的子模块导入新项目中,将各模块生成各个单独的元器件,创建原理图文件,将各模块元器件导入,连线。

仿真

五、板载测试

①通电下载后,随机数生成模块首先开始运作,前四位数码管显示随机出现的虚拟地鼠模型

②拨动reset键重置倒计时,进入游戏准备阶段。


③拨动选择游戏难度。

④拨动start键开始游戏,倒计时开始,比较和按键模块开始运行。

⑤如果击中地鼠,地鼠呈现被打扁状,分数+1,指示灯闪亮。

⑥倒计时未结束拨动reset键使置1,由于游戏期间不允许暂停,故倒计时重置,分数暂留,直至reset键置0,分数清零。


⑦倒计时结束后,分数保持不变,按键和比较模块停止工作,直至start置0,分数清零。


六、不足之处

地鼠一次只能出现一只且器械老化存在一定的干扰(时间紧迫,按键抖动未加)。

七、心得体会

通过这次实验设计,我真真正正地从实践中学到了很多。经历了无数的困难,我被给予了更多的经验与教训,让我有足够的能力去力图改进和应对下一次可能出现的艰难险阻。
在一开始的尝试过程中,我尝试以一个大文件的形式,写出一个极具整体性的VHDL代码,奈何能力不足,在实现上遇到了不少的困难,给自己增加了不少不必要的负担。在经过一段时间的考虑后,我选择将整体拆分成多个不同的小模块逐一实现,最后以原理图的方式连线实现。在新一轮的实践中,我试图将显示模块嵌入在其他各个小模块中,实践中发现这种方法存在诸多不便,最终确立将各模块完全剥离,得到了现阶段的最优的方案。在接下来的实现过程中,常常遇到因为考虑不周而使得部分模块超时执行的不正常现象,也有遇到不熟悉VHDL部分语句而出现的逻辑错误,在查阅资料并多次实验尝试各种不同的方法后,问题渐渐得以解决,最终实现了基本的打地鼠功能。
在板载测试成功后,此时距离提交成果的最后期限还有很多时间,在这段时间里,我开始考虑如何去完善和美化它,在之后,我陆陆续续修正了其中的一些不足之处,完善了部分代码,同时加入了地鼠的第二阶段形态以及游戏模式选择控件,使得游戏整体更加符合现实生活中真实用户的需求,最终得到了现在相对成熟的成果。
在这次的课程设计中,我不仅仅提高了自己的动手能力,更为重要的是理解了EDA融入于我们生活的真谛,我们真正学习技术,不应只会浅薄的纸上谈兵,更应该把技术应用于实践,用“死”的代码赋予现实生活丰富多彩。EDA是,又不是简简单单的一种技术,它是我们链接数字世界与三维世界的一把钥匙,是我们人与机械器件沟通的纽带与桥梁。我们要时时刻刻记住自己身为一名工科生的责任与担当,化静为动,化“死”为生。

源文件下载地址
盘+1234

数字系统设计————打地鼠游戏设计相关推荐

  1. c语言打地鼠窗口设计,基于单片机的打地鼠游戏设计

    覃丽姗 李宁 王恬灏 摘 要:打地鼠游戏是人们生活中常见的一种休闲小游戏,尤其受儿童的喜爱.打地鼠游戏玩法简单,考验人们的反应速度,能够充分的锻炼孩子的手眼协调能力.本文设计一种基于单片机的打地鼠游戏 ...

  2. VHDL实现打地鼠游戏设计

    基于VHDL打地鼠游戏设计:使用VHDL语言设计 系统结构图: 1. 总的系统框图 2. 各个模块的功能描述 A.分数判断模块 判断选手得分或失分主要是由一个比较器完成的,将系统传给LED灯的信号与选 ...

  3. html打地鼠游戏设计报告,有趣的Axure案例:打地鼠游戏的设计

    一个有趣的实例,通过axure制作一个打地鼠的游戏,可以进行难度选择.其中如果选择难度一地鼠为正常大小,选择难度二,地鼠则为缩小版.虽然小游戏很简单,但其中用到的axure技能并不简单,接下来将为大家 ...

  4. 数字逻辑---交通灯系统设计(HUST)---头歌实训作业---数字系统设计(课程设计)

    数字逻辑---交通灯系统设计(HUST) 第1关:7段数码管驱动电路设计 如有任何不解或者想要最终实验代码,可评论区喊话哦,希望我的答案对你有帮助,点个关注再走吧,感谢!!! 本关卡最终答案:下面是此 ...

  5. 数字系统设计(FPGA)课程设计: 多功能数字钟

    一.目的: 实现多功能数字钟,具备下列功能: 1.数字钟:能计时,实现小时.分钟.秒的显示: 2.数字跑表:精度至0.01秒 比如显示12.97秒: 3.闹钟: 可以设定闹钟,用试验箱上的蜂鸣器作为闹 ...

  6. 基于单片机模拟打地鼠游戏设计-protues仿真毕业

    资料下载地址-1056(百度网盘):点击下载 #include<reg52.h> #include<stdlib.h> sbit RS=P2^0; sbit EN=P2^1; ...

  7. 猜数字java程序设计分析_JAVA程序设计课程设计-猜数字游戏设计

    JAVA程序设计课程设计-猜数字游戏设计 课 程 设 计 报 告课程设计名称 Java 程序设计 专 业 计算机科学与技术 班 级 2 班 学 号 08030212 姓 名 指导教师 成 绩 2011 ...

  8. java猜数字游戏课程设计报告_Java程序设计课程设计-猜数字游戏设计.doc

    Java程序设计课程设计-猜数字游戏设计.doc 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 课 程 设 计 报 告课程设计名称 Jav ...

  9. 数字系统设计学习之出租车计价器设计

    前言 数字系统设计的大作业来了,用VHDL语言在实验板上实现一个出租车计价设计,有一些难度,大概花了几天时间,不过好在最后搞出来了,同时总结一下遇到的问题,为了排版整洁,源代码就放在最后放出了. 温馨 ...

最新文章

  1. AI一分钟|阿里成立“罗汉堂”;vivo微信人脸识别支付下半年商用
  2. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)
  3. myeclipse 删除历史工作空间记录
  4. 特别的彩蛋给特别的你,新版官网上线啦!
  5. Linux ls查看目录文件命令集锦
  6. 从零开始学视觉Transformer (9):自监督ViT算法:BeiT和MAE
  7. fiddler使用_fiddler使用教程
  8. mysql 连接其他数据库_普通用户从其他主机连接MySQL数据库
  9. [转自周星星的blog] 解决为什么wcout不能输出中文问题
  10. mysql 表关系传递,mysql数据表之间数据相互传递的问题
  11. python 爬虫(一) requests+BeautifulSoup 爬取简单网页代码示例
  12. 大数据:技术与应用实践指南
  13. 克就克嘛!哪个怕哪个
  14. XeLaTeX-中文排版解决方案
  15. 太原理工大学计算机课程设计报告,太原理工大学matlab课程设计报告
  16. 微信小程序加入购物车效果动画
  17. 常见计算机软件故障有哪些,电脑常见问题有哪些,电脑硬件/软件常见问题及处理方法...
  18. 关于U盘中毒,文件全变成快捷方式
  19. R语言也可以进行ATAC数据的完整分析啦!
  20. Android的WebView如何播放视频和全屏视频(腾讯X5内核)

热门文章

  1. fedora mysql 操作系统,Fedora 15 上使用php+apache+mysql+phpMyAdmin+eyeos
  2. 如果5秒后地球没有水了,你会怎么样?丨钛空舱
  3. 如何查看JAVA进程CPU占用100%的原因
  4. php中in的作用是什么,in是什么软件
  5. python运行命令_Python执行系统命令教程
  6. Holy.Motors影评 神圣车行
  7. cityscapes场景图_Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略...
  8. 计算机等级考试office和wps哪个好,ms office和wps office二级考试区别大吗?考哪个好一些?...
  9. 一个普通人不靠工资的收入有什么?
  10. bigemap大地图下载器软件对比