基于FPGA的乒乓球游戏机设计.docx
《基于FPGA的乒乓球游戏机设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的乒乓球游戏机设计.docx(35页珍藏版)》请在冰豆网上搜索。
基于FPGA的乒乓球游戏机设计
基于FPGA的乒乓球游戏机设计
内容摘要:
随着电子设计自动化技术的不断发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
本文设计了基于FPGA的乒乓球游戏机设计。
用VHDL语言编程,VHDL是甚高速集成电路硬件描述语言。
目前,VHDL已成为许多设计自动化工具普遍采用的标准化硬件描述语言。
VHDL语言功能性强,覆盖面广,灵活性高,具有很好的实用性。
本文详细的简述了乒乓球游戏机的工作原理,此乒乓球游戏机由状态机、记分器、译码显示器与按键去抖等部分所组成。
通过对各部分编写VHDL程序,在QuartusⅡ软件上进行编译、仿真,最终在Altera公司的EP开发板上成功实现下载和调试。
经过仿真和验证的结果表明,实现乒乓游戏机的基本功能,结果达到了设计的要求。
关键词:
FPGAVHDL乒乓游戏机状态机
Abstract:
Aselectronicdesignautomationtechnologycontinuestodevelopandexpandthefieldofapplication,EDAtechnologyinelectronicinformation,communication,increasingtheimportanceofthefieldofautomaticcontrolandcomputerapplications.ThisdesignofthetabletennisgamedesignbasedonFPGA.ProgramminginVHDLlanguage,VHDListheveryhighspeedintegratedcircuithardwaredescriptionlanguage.Atpresent,theVHDLdesignautomationtoolwidelyusedbymanystandardizedhardwaredescriptionlanguage.VHDLlanguagefeatureisstrong,widecoverage,highflexibility,goodpracticality.Thisarticlegaveadetailedsummaryoftabletennisvideogameworks,thetabletennisgamebythestatemachine,adevice,decodingmachinepartssuchasmonitorandpressthekeytoshakingup.ThesectionswrittenbyVHDLprogram,compiledintheQuartusIIsoftware,simulation,finalEPofAlteraCorporationsuccessfullydownloadedanddebuggedontheDevelopmentBoard.Aftersimulationandverificationoftheresultsshowsthatachievingbasicfunctionalityofpingponggame,theresultmeetsthedesignrequirements.
Keywords:
FPGAVHDLTabletennisgamemachineStatemachine
1引言
EDA(ElectronicDesignAutomation,电子设计自动化)技术是现代电子工程领域的一门新技术。
它提供了基于计算机和信息技术的电路系统设计方法。
EDA技术的发张和推广应用极大地推动了电子工业的发展。
随着社会的进步和工业技术的发展,在电子线路设计领域中,设计自动化工具已经逐步为设计者所接受,成为主要的设计手段。
目前,VHDL已成为许多设计自动化工具普遍采用的标准化硬件描述语言,掌握VHDL语言,用VHDL语言设计电子线路,是电子线路设计者必须掌握的基本技能。
VHDL支持数字电路的开发环境,VHDL也支持各种设计方法:
自顶向下、自底向上或混合的方法[1]。
VHDL语言功能性强,覆盖面大,灵活性高,具有很好的实用性[2]。
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
而休闲时间越来越少的人们越来越没太多的时间出去搞户外活动,于是众多电子游戏相应而出,成为大家的娱乐节目。
因此设计出了关于两人的乒乓球游戏。
乒乓游戏机是由9个发光二极管代表乒乓球台,中间的3个发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动。
在游戏机的两侧各设置两个开关,甲乙二人按乒乓球比赛规则来操作开关。
此设计由译码显示器、记分器、状态机/球台控制器与按键去抖等部分组成。
设计总体要求:
乒乓机能模拟乒乓球比赛的基本过程和规则,并能自动裁判和记分。
其主要任务和要求如下:
(1)使用乒乓球的甲乙双方在不同的位置发球或击球。
(2)乒乓球的位置和移动方向由灯亮及依次点亮的方向决定。
球速为0.5s-1s移动1位。
球过网,接球方向可击球,提前击球或没击球均判失分。
(3)比赛按11分为一局,甲乙双方应设置记分牌,任何一方先记满11分,为胜出,按RESET复位重新开局。
(4)基于VHDL的乒乓球程序设计及软件编译与调试、仿真。
2开发工具简介
EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。
20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域中,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
2.1硬件描述语言—VHDL概述
VHDL是VeryhighspeedintegratedcircuitHardwareDescriptionLanguage的缩写,即“甚高速集成电路硬件描述语言”,最初由美国国防部和INTER、IBM、TI公司联合开发,1987年成为IEEE标准,即IEEE1076标准(俗称87版VHDL)[3]。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
2.1.1VHDL语言的特点
VHDL语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。
归纳起来,VHDL语言主要具有以下优点[4]:
(1)VHDL语言功能强大,设计方式多样
VHDL语言具有强大的语言结构,只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。
同时,它还具有多层次的电路设计描述功能。
此外,VHDL语言能够同时支持同步电路、异步电路和随机电路的设计实现,这是其他硬件描述语言所不能比拟的。
VHDL语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自底向上的设计方法;既支持模块化设计方法,也支持层次化设计方法。
(2)VHDL语言具有强大的硬件描述能力
VHDL语言具有多层次的电路设计描述功能,既可描述系统级电路,也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采用三者的混合描述方式。
同时,VHDL语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。
VHDL语言的强大描述能力还体现在它具有丰富的数据类型。
VHDL语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。
(3)VHDL语言具有很强的移植能力
VHDL语言很强的移植能力主要体现在对于同一个硬件电路的VHDL语言描述,它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。
(4)VHDL语言的设计描述与器件无关
采用VHDL语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。
这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。
当硬件电路的设计描述完成以后,VHDL语言允许采用多种不同的器件结构来实现。
(5)VHDL语言程序易于共享和复用
VHDL语言采用基于库(library)的设计方法。
在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。
这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。
2.1.2基于VHDL的自顶向下设计
在电子设计领域,自顶向下的设计方法只有在EDA技术得到快速发展和成熟应用的今天才成为可能。
自顶向下设计方法的有效应用必须基于功能强大的EDA工具,具备集系统描述、行为描述和结构描述功能为一体的VHDL硬件描述语言,以及先进的ASIC制造工艺和FPGA开发技术。
当今,自顶向下的设计方法已经是EDA技术的首选设计方法,是ASIC或FPGA开发的主要设计手段。
自顶向下的设计方法使系统被分解为各个模块的集合之后,可以对设计的每个独立模块指派不同的工作小组,其在不同地点工作,分属不同的单位,最后将不同模块集成为一个系统模型,并对其进行综合测试与评价。
自顶向下设计流程的框图说明如图1所示:
图1自顶向下的设计流程图
2.3QuartusII开发软件概述
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
QuartusII提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括[5]:
(1)可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;
(2)芯片(电路)平面布局连线编辑;
(3)LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;
(4)功能强大的逻辑综合工具;
(5)完备的电路功能仿真与时序逻辑仿真工具;
(6)定时/时序分析与关键路径延时分析;
(7)可使用SignalTapII逻辑分析工具进行嵌入式的逻辑分析;
(8)支持软件源文件的添加和创建,并将它们链接起来生成编程文件;
(9)使用组合编译方式可一次完成整体设计流程;
(10)自动定位编译错误以及高效的期间编程与验证工具;
(11)可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文件也能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。
2.4本章小结
本章主要介绍了系统的开发工具,对硬件的描述语言VHDL的特点做了基本介绍,简明了VHDL的自顶向下设计的流程。
并对QuartusII开发软件进行了概述。
3基于FPGA的乒乓球游戏机设计与实现
3.1总体设计
乒乓游戏机的组成示意图如2所示。
本设计中的乒乓游戏机是由9个发光二极管代表乒乓球台,中间3个发光二极管兼作球网,用点亮的发光二极管按一定方向移动来表示球的运动方向。
在游戏机的两侧各设置两个开关:
hit1、hit2,甲乙二人按乒乓球比赛规则来操作开关。
甲开始发球时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲向乙依次点亮,代表乒乓球的移动。
当球过网后按规定的球位,乙方就可以击球。
若乙方提前击球或没有击中球,则判乙方失分,甲方的记分牌自动加一分。
同理,当乙方开始发球时,点击hit1击球。
然后重新发球,比赛继续进行。
比赛一直要进行到一方记分牌达到11分,该局才结束。
本设计由译码显示器、按键去抖、状态机/球台控制器等部分所组成。
系统的整体设计结构图如图3所示。
图2乒乓球游戏机的组成示意图
图3系统结构图
3.2电路总原理图
本设计由+5V供电,输出+3.3V的供电模块、50MHz有源晶振模块、AS下载端口拨码开关控制LED灯显示模块、数码管计分显示模块及芯片
EP2C5T144C8N组成。
如下图4所示:
图4乒乓球游戏机设计总原理图
3.3时钟分频设计
分频是将一个给定的频率较高的数字输入信号经过适当的处理而产生一个或数个频率较低的数字输出信号。
由于开发板的时钟信号频率是50MHz,直接作为二极管点亮频率和数码管扫描频率过大,不符合设计要求,如下图5所示为50MHz有源晶振电路图。
因此需将时钟信号分频,分频成两个时钟信号分别给发光二极管作为移动速度和数码管的显示信号,分别设置分频系数为25000000、5000000,分频后的信号频率为1Hz、,此时发光二极管的移动速度为1s,符合设计要求。
图550MHz有源晶振电路图
部分时钟分频源程序:
p1:
process(count,clk)--25000000倍分频,发光二极管
begin
ifclk'eventandclk='1'thencount<=count+1;
ifcount=25000000thentmp<='1';count<=0;elsetmp<='0';
endif;endif;endProcess;
p2:
process(couny)--5000000倍分频,数码管
begin
ifclk'eventandclk='1'thencouny<=couny+1;
ifcouny=5000000thentmg<='1';couny<=0;elsetmg<='0';
endif;endif;endProcess;
3.4状态机设计
3.4.1状态机的7种状态及状态转移
状态机设置了7个状态,分别是等待发球状态(waitserve)、第一盏灯亮状态(light1on)、第七盏灯亮状态(light7on)、球向乙移动状态(ballmoveto2)、球向甲移动状态(ballmoveto1)、允许甲击球状态(allow1hit)和允许乙击球状态(allow2hit)如表1所示。
这是该程序中起决定作用的七个状态。
开始的时候处于“等待发球状态”,若甲发球则状态转移到“第一盏灯亮状态”,若乙发球则转移到“第七盏灯亮状态”,具体说明以乙球为例。
若发球后甲没有提前击球----规定球移动到对方第一个发光二极管时允许击球,那么状态机从“第七盏灯亮状态”转移到“球向甲移动状态”。
若在“球向甲移动状态”甲仍然没有提前击球,状态就转移到“允许甲击球状态”,在此状态下,如果甲击球了,那么状态就转移到“球向乙移动状态”。
在“第七盏灯亮状态”,“球向甲移动状态”中,如果甲击球了,就算提前击球,这样甲得分,状态转移到“等待发球状态”等待发球,“球向乙移动状态”之后的过程和前面的过程只是甲乙角色的调换。
状态转移规则都是一样的。
表1状态机的7种状态及含义
状态
含义
waitserve
等待发球状态
light1on
第一盏灯亮状态
ballmoveto2
球向乙移动状态
allow2hit
允许乙击球状态
light7on
第七盏灯亮状态
ballmoveto1
球向甲移动状态
allow1hit
允许甲击球状态
结合表1,从图6乒乓球游戏机的MDS图中很清楚地看出乒乓游戏机比赛过程中球的移动情况,及加分方法图7乒乓球游戏机转移图,还可以初步了解到本状态机设计的基本思路。
3.4.2状态机/球台控制程序
状态机是种很重要的时序电路,也是本设计的核心部件。
状态机属于时序电路范畴,实现一个控制功能更为方便,并提高了控制速度[6]。
在本设计中,状态机用两个信号表示状态:
STATE表示当前状态,I表示下一个状态。
此状态机由两个进程构成,状态机的输入/输出引脚的作用如表2所示。
其中SCORE11[6..0]、SCORE12[6..0]、SCORE21[6..0]、SCORE22[6..0]用七段BCD码译码器显示得分情况,而SCORE1、SCORE2用二进制进行加分,由记分器反馈回来。
图6乒乓球游戏机的MDS图
表2输入/输出引脚的作用
引脚
作用
Clk
10Hz的时钟,可由系统时钟分频得到。
此时时钟决定了球移动的速度,可根据实际需要调整。
Reset
复位键,比赛重新开始,记分器清0
Sever[1..0]
发球信号
Hit1、hit2
甲和乙双方的击球键(可以将其与开球键合并)
Start
Start控制游戏是否开始
Tmp、tmg
tmp,tmg为输入输出类型,作为分频后的信号,供给数码管扫描和发光二极管点亮使用
Score11[6..0]score12[6..0]
Score21[6..0]score22[6..0]
甲、乙双方的分数(由记分器给出)
Light[6..0]
接7个发光二极管
图7乒乓游戏机状态转移图
状态机的主要部分源程序如下:
p3:
process(tmp)--状态机部分
begin
casestateis
whenwaitserve=>--等待状态下进程处于等待发球状态
caseserveis
when"00"=>i<=0;
when"10"=>i<=1;state<=light1on;when"01"=>i<=7;state<=light7on;
when"11"=>i<=0;whenothers=>i<=0;
endcase;
whenlight1on=>i<=2;--light1on状态下进程处于第一盏灯亮状态
ifhit2='1'theni<=0;count1<=count1+1;state<=waitserve;
elsestate<=ballmoveto2;
endif;
whenlight7on=>i<=6;--light7on状态下进程处于第八盏灯亮状态
ifhit1='1'theni<=0;count2<=count2+1;state<=waitserve;
elsestate<=ballmoveto1;
endif;
whenballmoveto1=>--进程处于球向2移动状态
ifhit1='1'theni<=0;count2<=count2+1;state<=waitserve;
elsifi=2theni<=1;state<=allow1hit;
elsei<=i-1;
endif;
whenballmoveto2=>--进程处于球向1移动状态
ifhit2='1'theni<=0;count1<=count1+1;state<=waitserve;
elsifi=6theni<=7;state<=allow2hit;
elsei<=i+1;
endif;
whenallow1hit=>--进程处于允许1击球状态
ifhit1='1'theni<=2;state<=ballmoveto2;
elsecount2<=count2+1;i<=0;state<=waitserve;
endif;
whenallow2hit=>--进程处于允许2击球状态
ifhit2='1'theni<=6;state<=ballmoveto1;
elsecount1<=count1+1;i<=0;state<=waitserve;
endif;endcase;
endif;endif;
endprocess;
endone;
3.5记分牌译码显示电路设计
数码管的动态扫描显示就是指我们采用分时的方法,轮流控制各个显示器的公共端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感[7]。
如图8数码管显示电路图,图中1K电阻起限流作用,保护发光二极管。
图8数码管显示图
3.6按键去抖、乒乓球路径显示电路设计
乒乓球游戏机用按键控制击、发球以及开始游戏键,当甲(开关3)发球,LED灯由左向右依次点亮(D1、D6常亮);到D9时,乙(开关6)击球,LED灯向甲移动。
同理,当乙发球,点甲(开关5)击球。
如图9按键控制LED灯。
其按键闭合与释放瞬间,输入的信号会有毛刺。
如果不进行消抖处理,系统会将这些毛刺误以为是用户的另一次输入,导致系统的误操作。
防抖电路有很多种,最简单、最容易理解的就是计数法。
其原理是对键值