乒乓球比赛游戏机设计_第1页
乒乓球比赛游戏机设计_第2页
乒乓球比赛游戏机设计_第3页
乒乓球比赛游戏机设计_第4页
乒乓球比赛游戏机设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..可修编目录1引言11.1设计背景11.2VHDL简介11.3QuartusⅡ简介32乒乓球比赛游戏机的设计32.1系统设计要求32.2设计思路43乒乓球比赛游戏机的实现63.1乒乓球比赛游戏机的顶层原理图63.2系统各功能模块的实现63.2.1比赛控制模块63.2.2记分模块73.2.3数码管显示模块84各个模块的仿真以及系统仿真、分析94.1比赛控制模块仿真波形94.2记分模块仿真波形图94.3管脚锁定104.4系统的波形仿真114.5显示结果的几种情况145总结155.1设计制作过程中遇到的问题及解决方案155.2本设计有以下几个可以改良的地方15参考文献16附录17游戏控制模块的VHDL程序17记分模块的VHDL程序19动态扫描模块的VHDL程序20译码器模块的VHDL程序21..可修编1引言1.1设计背景1.2VHDL简介硬件描述语言已经有几十年的开展历史,并且在系统的仿真、验证和设计、综合等方面得到成功的应用。目前常用的硬件描述语言有VHDL、VerilogHDL、ABEL等[2][3][4]。VHDL那么起源于20世纪70年代末和80年代初,美国国防部提出的VHSIC方案,目标是为下一代集成电路的生产、实践阶段性的工艺极限和完成10万门级以上的电路设计而建立一种新的描述方法[5]。VHDL的英文全称为Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,是IEEE标准化的硬件描述语言,并且已经成为系统描述的国际公认标准,得到众多EDA公司的支持。VHDL具有很多的优点使它能够被大多数人认可,被广泛应用在逻辑电路的设计方面,并且成为了标准化的硬件描述语言,其优点如下:(1)功能强大和设计灵活。一个简洁的使用VHDL语言编写的程序就可以描述一个复杂的逻辑电路,因为VHDL拥有强大的语言构造[6]。VHDL多层次的设计描述功能可以有效地控制设计的实现,支持设计库和可重复使用的元件生成,还支持多种设计方式,如层次化设计、模块化设计和同步、异步和随机电路设计。(2)与具体器件无关。用VHDL设计硬件电路时不用先确定设计要用到哪种器件,也不用特别熟悉器件的部构造,这样可以使设计人员专注于进展系统设计。设计完成后,可以根据消耗的资源选择适宜的器件,而不造成资源的浪费。(3)很强的移植能力。VHDL由很多不同的工具支持,同一个设计的程序可以在包括综合工具、仿真工具、系统平台等工具中使用。(4)强大的硬件描述能力。VHDL可以描述系统级电路和门级电路,而且描述方式多样,可以采用行为描述、存放器传输描述或者构造描述,也可以用其混合描述方式。同时,VHDL可以准确地建立硬件电路模型,因为它支持惯性延迟和传输延迟。VHDL的数据类型很丰富,支持标准定义的数据类型,当标准定义的数据类型不能满足用户的需求时,用户可以自己定义的所需要的数据类型,增加了设计的自由度。(5)语法规,易于共享。当把用VHDL编写的代码文件看作是程序时,它可以作为设计人员之间的交流容;当把它看作是文档时,可以作为签约双方的合同文本。VHDL易于共享的特点,使得大规模的协作开发容易实现。同时,这些特点也促进了VHDL的开展和完善。综上所述,VHDL有很多其他的硬件描述语言所不具备的优点。但是,VHDL仍然存在一些缺点,主要是3个方面。(1)要求设计者对硬件电路知识甚至是芯片构造方面的知识了解较多。应该摆脱一般的高级语言程序设计思路,因为在电路世界里的事件很多是并行发生的,并且硬件电路系统部的模块可以是互相独立的,也可以是互为因果的,所以,在用VHDL设计硬件电路时应摆脱一般的高级语言程序设计思路。在设计电路时,应先构思电路,然后才能描述。(2)不能进展太抽象的系统描述。因为EDA工具无法综合抽象性太强的系统,故用VHDL描述系统电路时不能太抽象。目前的VHDL很难综合实际的硬件电路,只能适用于系统建模。(3)不能描述模拟电路。对于模拟电路而言,VHDL并不是一种理想的硬件描述语言。但可以预见,未来硬件描述语言的开展方向是模拟电路和数模混合电路的描述方式。1.3QuartusⅡ简介2乒乓球比赛游戏机的设计2.1系统设计要求设计一个由甲乙双方参赛,有裁判的三人乒乓球游戏机。用8个〔或更多个〕LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置点亮的LED依此从左到右,或从右到左,其移动速度应能调节。当"球〞〔点亮的那只LED〕运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,既表示启动球拍击球,假设未击中,球掉出桌外,那么对方得一方。设置自动记分电路,甲乙双方各用两位数码管进展记分显示,每记满11分为1局。甲乙双方各设一个发光二极管表示拥有发球权,每隔两次自动交换发球权,拥有发球权的一方发球才有效。系统框图如图2-1所示:图2-1乒乓球比赛游戏机系统框图2.2设计思路此设计问题可分为游戏控制模块,加减计数模块,译码模块,甲乙方得分显示模块四局部。设置甲乙双方击球脉冲信号int1/int2,一方的击球信号使加/减计数器加法计数,那么另一方的击球信号就使加/减计数器减法计数,译码模块输出端Y1-Y8接LED模拟乒乓球的轨迹。经控制模块实现移位方向的控制,真值表2-2所列。设置发球权拥有显示信号s1、s2。控制模块使每两次交换发球权。加/减控制信号/D由乒乓球到达Y8、Y1和击球信号int1、int2及发球权拥有信号s1、s2共同产生,真值表如表2-3所示。当球到达Y8或Y1时,参赛者没有及时击中,那么球掉出桌外,加/减计数模块停顿计数,对方得一分。设置捡球信号reset1,通过加/减计数模块的异步置数端实现捡球。当甲方拥有发球权时捡球信号将球放到Y1,乙方拥有发球权时将球放到Y8.在控制模块对甲乙双方的得分进展检测,只要一方的得分到达11,那么一局完毕,设置裁判员复位信号reset.在每局完毕后将双方得分清零。由调节晶振产生的时钟脉冲信号的频率,可以调节球的运动速度。表2-2加/减计数译码显示真值表时钟加/减控制计数器输出译码器输出CLK/DQ3Q2Q1Q0Y8Y7Y6Y5Y4Y3Y2Y1↑0000100000001↑0001000000010↑0001100000100↑0010000001000↑0010100010000↑0011000100000↑0011101000000↑0100010000000↑1011101000000↑1011000100000↑1010100010000↑1010000001000↑1001100000100↑1001000000010↑1000100000001表2-3加减控制信号的产生Y8Y1Int1Int2S1S2/D100↑01101↑0100硬件系统示意图如下所示图2-4硬件系统示意图3乒乓球比赛游戏机的实现3.1乒乓球比赛游戏机的顶层原理图图3-1顶层原理图原理图中输入局部分别是:复位按键res,时钟clk_1,startbutton开场游戏按键,serve[1..0]发球按键,serve0代表甲发球,serve1代表乙发球,int1为甲击球按键,int2为乙击球按键,原理图中输出局部分别是:8个LED灯light[1..8],数码管段选信号A、C、D、E、F、G、H,数码管进入译码器74ls138的位选信号sel[2..0],在数码管上显示了甲乙两个人的分数。3.2系统各功能模块的实现3.2.1比赛控制模块图3-2比赛控制模块元件框图按下startbutton按键之后游戏开场,当按下serve0时甲发球,8个一排的LED灯从左向右移动〔从1到8〕,当移动到第八个灯时按下int2按键代表乙击中,那么乙得1分,提前或未来的及击球那么甲得分。当按下serve1时乙发球从右向左移动,当移动到第一个灯时按下int1代表甲击中球,甲得1分,提前或未来的击球及那么乙得分。3.2.2记分模块图3-3记分模块元件框图中选择好的信号binaryin[4..1]进入mydecoder之后,相应的数据会选择到相应的信号中,并且通过bcdout1[4..1]和bcdout2[4..1]输出相应的分数在两位数码管上的显示数字。bcdout1为十位数,bcdout2为个位数。3.2.3数码管显示模块图3-4显示模块框图数码管显示模块主要是由两个模块组成分别为setime以及deled这两个模块组成:setime模块主要是将输入的分数进展动态扫描,显示到每一位数码管的位选上,通过高速的扫描后会将每一位选手的分数很清晰的显示在数码管上。deled模块是一个译码器的模块译码器的译码对照表3-5如下所示:表3-5译码器的译码对照表显示的数字BCD编码七段共阳数码管000001000000100011111001200100100100300110110000401000011001501010010010601100000010701111111000810000000000910010010000XXXXX1111111在程序中只考虑0000-1001〔即0-9〕的情况,将其转化为相应的七段显示器的码字,其他情况不予考虑。4各个模块的仿真以及系统仿真、分析4.1比赛控制模块仿真波形图4-1比赛控制模块4.2记分模块仿真波形图图4-2记分模块仿真波形图表4-3对应分数的数码管显示binaryinbcdout1bcdout2000000000000000100000001001000000010001100000011010000000100010100000101011000000110011100000111100000001000100100001001101000010000101100010001在图4-2中可以看出当得分为2〔0010〕分时对应的两位数码管那么会显示为02(bcoudt1:0000,bcoudt2:0010〕,当分数超过11分时数码管的显示全为为00。表4-3为具体的分数对应的数码管显示。4.3管脚锁定在验证出乒乓球比赛游戏机系统的功能之前,需要清楚实验箱与各个信号之间的对应关系,参照资料得出本设计中各引脚的对应情况如下:图4-4各引脚的对应情况4.4系统的波形仿真图4-5所示为甲方发球,在恰当的时候乙方接到球,当球回到甲方时,甲方又接到球,但乙方再也没有接到球的仿真波形。图4-5乒乓球仿真波形一图4-6所示为甲方两次发球,乙方没有接到球,甲方得到2分的仿真波形图。图4-6乒乓球仿真波形二图4-7所示为甲方发球,乙方提前击球的情况,此时,甲方得一分。图中还显示了甲方发球,乙方在规定的时刻没有接到球的情况,此时,甲方又得一分。图4-7乒乓球仿真波形三图4-8所示为当清零信号按下时,得分清零,又开场新一局游戏图4-8乒乓球仿真波形四4.5显示结果的几种情况图4-9验证结果1图4-10验证结果2图4-11验证结果35总结5.1设计制作过程中遇到的问题及解决方案1.VHDL语法使用不规:当我们编写软件程序的时,遇到了编译错误。细心阅读QuartusII错误提示和所编写的程序后发现是因为VHDL语法使用错误。最后经过翻阅EDA课本,熟悉相关语法后将其改正。2.动态扫描局部不清楚,以至无法实现得分显示功能起初以为每个数码管的引脚都要锁定,不知该怎样锁定四个数码管的引脚,后来想起曾经做过的数码管显示控制系列最终完成了该局部。3.引脚锁定不完整,最终编译无法通过:处理了之前出现的几个问题后,在最后编译时未通过。细致查看了错误提示,发现是个别管脚未锁定的原因。我们最终把各个管脚锁定一一检查了一遍,从而通过了编译。5.2本设计有以下几个可以改良的地方1.可以在甲乙两位得分的数码管显示中间在用一个显示":〞这个符号。2.通过适当添加几种语音芯片,就可以在不同的情况下发出美妙的声响,能为比赛增添不少乐趣。3.在现有设计根底上使用无线电或红外技术,还可以使本工程升级为无线智能乒乓球游戏机。附录游戏控制模块的VHDL程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitypeteisport(reset:instd_logic;clk_1:instd_logic;startbutton:instd_logic;serve:instd_logic_vector(1downto0);int1,int2:instd_logic;light:outstd_logic_vector(1to8);counta,countb:outstd_logic_vector(3downto0));endpete;architectureoneofpeteisTypepingpongis(waitserve,light1on,ballmoveto2,allow2int,light8on,ballmoveto1,allow1int);signalstate:pingpong;signali:integerrange0to8;signalcount1,count2,count3,count4:std_logic_vector(3downto0):="0000";beginprocess(clk_1)beginifreset='1'theni<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";elsifclk_1'eventandclk_1='1'thenifcount1="1011"theni<=0;count1<="0000";count2<="0000";count3<=count3+1;elsifcount2="1011"theni<=0;count1<="0000";count2<="0000";count4<=count4+1;elsifstartbutton='0'theni<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";elsecasestateiswhenwaitserve=>caseserveiswhen"01"=>i<=1;state<=light1on;when"10"=>i<=8;state<=light8on;when"11"=>i<=0;whenothers=>i<=0;endcase;whenlight1on=>i<=2;ifint2='1'theni<=0;count1<=count1+1;state<=waitserve;elsestate<=ballmoveto2;endif;whenlight8on=>i<=7;ifint1='1'theni<=0;count2<=count2+1;state<=waitserve;elsestate<=ballmoveto1;endif;whenballmoveto1=>ifint1='1'theni<=0;count2<=count2+1;state<=waitserve;elsifi=2theni<=1;state<=allow1int;elsei<=i-1;endif;whenballmoveto2=>ifint2='1'theni<=0;count1<=count1+1;state<=waitserve;elsifi=7theni<=8;state<=allow2int;elsei<=i+1;endif;whenallow1int=>ifint1='1'theni<=2;state<=ballmoveto2;elsecount2<=count2+1;i<=0;state<=waitserve;endif;whenallow2int=>ifint2='1'theni<=7;state<=ballmoveto1;elsecount1<=count1+1;i<=0;state<=waitserve;endif;endcase;endif;endif;endprocess;counta<=count1;countb<=count2;light<="10000000"when(i=1)else"01000000"when(i=2)else"00100000"when(i=3)else"00010000"when(i=4)else"00001000"when(i=5)else"00000100"when(i=6)else"00000010"when(i=7)else"00000001"when(i=8)else"00000000";endone;记分模块的VHDL程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitymydecoderisport(binaryin:instd_logic_vector(4downto1);bcdout1:outstd_logic_vector(4downto1);bcdout2:outstd_logic_vector(4downto1));endmydecoder;architecturemofmydecoderissignaltembinaryin:std_logic_vector(4downto1);beginprocess(binaryin)begintembinaryin<=binaryin;casetembinaryiniswhen"0000"=>bcdout1<="0000";bcdout2<="0000";when"0001"=>bcdout1<="0000";bcdout2<="0001";when"0010"=>bcdout1<="0000";bcdout2<="0010";when"0011"=>bcdout1<="0000";bcdout2<="0011";when"0100"=>bcdout1<="0000";bcdout2<="0100";when"0101"=>bcdout1<="0000";bcdout2<="0101";when"0110"=>bcdout1<="0000";bcdout2<="0110";when"0111"=>bcdout1<="0000";bcdout2<="0111";when"1000"=>bcdout1<="0000";bcdout2<="1000";when"1001"=>bcdout1<="0000";bcdout2<="1001";when"1010"=>bcdout1<="0001";bcdout2<="0000";when"1011"=>bcdout1<="0001";bcdout2<="0001";whenothers=>bcdout1<="0000";bcdout2<="0000";endcase;endprocess;endm;动态扫描模块的VHDL程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityseltimeisport(clk:instd_logic;s:instd_logic_vector(15downto0);daout:outstd_logic_vector(3downto0);sel:outstd_logic_vector(2downto0));endseltime;architecturebehavofseltimeissignalsec:std_logic_vector(2downto0);beginprocess(clk)beginif(clk'eventandclk='1')thenif(sec="111")thensec<="000";elsesec<=sec+1;endif;endif;endprocess;process(sec,s(15downto0))begincaseseciswhen"000"=>daout<=s(3downto0);when"001"=>daout<="1111";when"010"=>daout<="1111";when"011"=>daout<=s(11downto8);when"100"=>daout<=s(7downto4);when"101"=>daout<="1111";when"110"=>daout<="1111";when"111"=>daout<=s(15downto12);whenothers=>daout<="XXXX";endcase;endprocess;sel<=sec;endbehav;译码器模块的VHDL程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDELEDISPORT(S:INSTD_LOGIC_VECTOR(3DOWNTO0);A,B,C,D,E,F,G,H:OUTSTD_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论