基于VHDL课程设计乒乓球游戏.docx
- 文档编号:25011791
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:34
- 大小:2.07MB
基于VHDL课程设计乒乓球游戏.docx
《基于VHDL课程设计乒乓球游戏.docx》由会员分享,可在线阅读,更多相关《基于VHDL课程设计乒乓球游戏.docx(34页珍藏版)》请在冰豆网上搜索。
基于VHDL课程设计乒乓球游戏
课程设计
名称乒乓球游戏程序
姓名
专业班级
基于FPGA的乒乓球游戏程序的设计
摘要
VHDL是高速集成电路硬件描述语言,目前已成为许多设计自动化工具普遍采纳的标准化硬件描述语言.VHDL语言功能性强、覆盖面广、灵活性高,具有专门好的有效。
本文设计一个基于VHDL的乒乓游戏机模拟乒乓球竞赛。
用VHDL编程模拟乒乓球竞赛,电路模块由分频、状态机等部份组成,对各部份编写VHDL算法,进行编译及程序下载。
通过验证,乒乓游戏性能模拟乒乓球竞赛的大体进程和规那么,并能自动裁判和记分,还能依照接球快慢改变球运行的速度。
实现乒乓游戏机的功能。
关键词:
乒乓游戏机、VHDL、状态机
第一部份绪论
课题设计背景
FPGA简介
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可件的基础上进一步进展的产物。
它是作为(ASIC)领域中的一种半定制电路而显现的,既解决了定制电路的不足,又克服了原有可件门电路数有限的缺点。
硬件描述语言VHDL
VHDL的英文全名是VHSICHardwareDescriptionLanguage(VHSIC硬件描述语言)。
VHSIC是VeryHighSpeedIntegratedCircuit的缩写,是20世纪80年代在美国国防部的资助下始创的,并最终致使了VHDL语言的显现。
1987年末,VHDL被IEEE和美国国防部确以为标准硬件描述语言。
VHDL要紧用于描述数字系统的结构,行为,功能和接口。
除含有许多具有硬件特点的语句外,VHDL的语言形式和描述风格与句法是十分类似于一样的运算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(能够是一个元件,一个电路模块或一个系统)分成外部(或称可视部份,及端口)和内部(或称不可视部份),既涉及实体的内部功能和算法完成部份。
在对一个设计实体概念了外部界面后,一旦其内部开发完成后,其他的设计就能够够直接挪用那个实体。
这种将设计实体分成内外部份的概念是VHDL系统设计的大体点。
QuartusⅡ简介
AlteraQuartusII作为一种的设计环境,由于其壮大的设计能力和直观易用的接口,愈来愈受到者的欢迎。
AlteraQuartusII(和更高版本)设计软件是业界唯一提供FPGA和固定功能器件统一设计流程的设计工具。
Quartus IIdesign是最高级和复杂的,用于system-on-a-programmable-chip(SOPC)的设计环境。
QuartusIIdesign提供完善的timingclosure和LogicLock?
基于块的设计流程。
QuartusIIdesign是唯一一个包括以timingclosure和基于块的设计流为大体特点的programmablelogicdevice(PLD)的软件。
QuartusII设计软件改良了性能、提升了功能性、解决了暗藏的设计延迟等,在产业领域率先提供FPGA与mask-programmeddevices开发的同一工作流程。
课题要紧内容
随着可编程逻辑电路和EDA技术的进展,在逻辑电路设计和嵌入式系统设计方面,以CPLD/FPGA为代表的可编程逻辑器件已经慢慢代替了传统的标准逻辑器件;本次论文的乒乓球游戏所有的程序能够集成在一个FPGA开发芯片上面,不用在用其他功能的分立逻辑元件,达到集成度高、响应快、功耗低的特点。
本次论文主若是基于FPGA的乒乓球游戏的设计,模拟乒乓球竞赛的大体进程和规那么,自动裁判和记分,比局为7局,每局11分。
而本次论文采纳模块化设计,要紧分为两大模块:
时钟分频模块、状态机操纵模块。
第二部份系统设计
整体设计图
图1乒乓球游戏程序BDF图
设计思路
1.操纵模块状态图
图2乒乓球游戏程序操纵模块状态图
2.整体思路
SW0开关(EN)操纵功能使能与竞赛清零。
SW0关闭(EN=0),显示学号后六位,打开时许诺运行,比分比局清零。
利用状态机,设初始状态处于start状态,key3为复位键,按下key3能够回到start状态。
通过各类请求信号实现状态的彼此转换,进而实现发球和乒乓球左右移动、击球的彼此转换,并在球未击中、提早击中、发球失败时显示相应比分、比局情形。
通过设计control的反馈操纵频率方式,利用不同键击球的快慢操纵球运行的速度。
并在整个游戏终止时有一个end标记与比分比局切换显示。
具体功能对应等
1.乒乓球操纵模块
操纵乒乓球的运行状态的转换,比分、比局的显示。
反馈信号信号的设置和输出,为分频模块提供指令信号,操纵球运行的速度。
图3乒乓球运行操纵模块BDF
2.时钟分频模块
为状态机产生3种不同的时钟信号。
图4时钟分频模块BDF
第三部份模块设计
操纵模块
引脚功能
表1操纵模块的引脚功能表
定义类型
外设
引脚
功能
instd_logic
EN
SW0
关闭显示学号后6位并对比分清零,打开则开始游戏
CLK
分频模块送入3种不同频率的速度
RST
KEY3
按一次重新开始新的一球
HIT[17..13]
SW17~SW13
选手甲接发球开关
HIT[5..2]
SW5~SW2
选手乙接发球开关
HIT[12..6]
SW12~SW6
禁止触球区
out
stdlogic
HEX7
HEX7
选手甲获胜局数
HEX6
HEX6
选手乙获胜局数
HEX5
HEX5
显示无意义
HEX4
HEX4
显示无意义
HEX3
HEX3
选手甲获胜比分
HEX2
HEX2
选手甲获胜比分
HEX1
HEX1
选手乙获胜比分
HEX0
HEX0
选手乙获胜比分
CONTROL[1..0]
输出反馈给分频模块
LIGHT[17..2]
LEDR17~LEDR2
乒乓球位置显示
核心代码及说明
模块要紧分状态转换,状态译码,LED灯的译码,和辅助变量temp,辅助判断信号control的计数进程。
利用temp判定是不是分出输赢即游戏是不是终止,终止以后显示闪烁辅助标志End而且清零比分。
利用control判定接球快慢,反馈到分频器,分频器依照接球快慢操纵球的运行速度,共快中慢三种速度,别离为50Hz,10Hz,。
为方便检查结果,SW1直接操纵速度开关,共快慢两种速度,别离为50Hz,。
1.中间变量的初始化:
SIGNALST,NST:
STATE:
=start;
SIGNALreg:
STD_LOGIC_VECTOR(17DOWNTO2);--灯的内部变量
SIGNALBIFEN1,BIFEN2:
integerrange0to11;--选手甲乙的比分记录变量
SIGNALBIJUONE,BIJUTWO:
integerrange0to4;--选手甲乙的比局记录变量
SIGNALTEMP:
integerrange0to1;--比局数的内部计数变量
SIGNALBIJU1,BIJU2:
STD_LOGIC_VECTOR(6DOWNTO0);--选手甲乙的比局译码输出变量
SIGNALBIFENOUT11,BIFENOUT12,BIFENOUT21,BIFENOUT22:
STD_LOGIC_VECTOR(6DOWNTO0);--选手甲乙的比分译码输出变量
SIGNALREG_1:
STD_LOGIC_VECTOR(6DOWNTO0);--数码管的内部变量
SIGNALREG_5:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALREG_3:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALREG_8:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALREG_4:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALREG_2:
STD_LOGIC_VECTOR(6DOWNTO0);
2.主控组合进程:
通过判定球的位置信号及开关键信号执行相应的状态转换。
EN=1时游戏开始,进入状态start,temp开始计数,进入状态wait1检测发球选手并点亮相应的球所代表的LED,之后进入状态send,以后选择进入状态,movatoright或movetoleft,球开始向对方选手移动,当球抵达可接球区域时,假设对方及时击打并及时关闭开关,那么进入状态movetoleft或movatoright球向回移动,如此反复。
假设发球方或接球方未及时关闭开关,那么视为击打失败,返回状态start,对方加一分。
每局为11分制,共设七局。
每终止一局temp就会相应加1,当temp加到5,即分出输赢以后显示闪烁辅助标志End。
以选手甲发球为例:
(1)进入状态start,统计比分及比局。
(2)进入状态send,判定选手甲(假设甲为左边一方)是不是发球,假设发球那么进入状态wait1,不然停留在状态start。
(3)进入状态wait1,判定选手甲发球端球代表的灯REG17是不是亮起,假设是那么进入状态movetoright,反之返回状态start。
。
(4)进入状态movetoright,灯右移,并判定是不是有无关按键按下(SW17~SW14),假设无那么继续右移,反之返回状态start而且对方得一分。
当球移至REG6~REG2,进入选手乙可接球区域:
1当球移至REG6时选手乙及时击打相应开关SW6,那么进入状态movetoleft,并调整球运行速度为快。
假设提早击打或未及时关闭开关,那么击球失败而且对方得一分,进入状态start。
REG5条件下类似。
2当球移至REG4时选手乙及时击打开关SW4,那么进入状态movetoleft,并调整球运行速度为中。
假设提早击打或未及时关闭开关,那么击球失败而且对方得一分,进入状态start。
REG4,REG3条件下类似。
(5)进入状态movetoleft,灯左移,并判定是不是有无关按键按下(SW2~SW5),假设无那么继续右移,反之返回状态start而且对方得一分。
当球移至REG17~REG13,进入选手甲可接球区域:
1当球移至REG13时选手乙及时击打相应开关SW6,那么进入状态movetoright,并调整球运行速度为快。
假设提早击打或未及时关闭开关,那么击球失败而且对方得一分,进入状态start。
REG14条件下类似。
2当球移至REG15时选手乙及时击打开关SW4,那么进入状态movetoright,并调整球运行速度为中。
假设提早击打或未及时关闭开关,那么击球失败而且对方得一分,进入状态start。
REG16,REG17条件下类似。
附movetoright代码:
WHENmovetoright=>REG<='0'®(17DOWNTO3);--右移状态
CASEREGIS
WHEN"000"=>NST<=movetoright;
WHEN"000"=>
IFHIT="0000000000000000"THEN--开关及时关上
NST<=movetoright;
ELSE
BIFEN2<=BIFEN2+1;NST<=start;--假设未及时关上,对方加分
ENDIF;
WHEN"000"=>NST<=movetoright;
WHEN"000"=>
IFHIT="0000000000000000"THEN
NST<=movetoright;
ELSE
BIFEN2<=BIFEN2+1;NST<=start;
ENDIF;
WHEN"0000"=>NST<=movetoright;
WHEN"00000"=>NST<=movetoright;
WHEN"00000000"=>NST<=movetoright;
WHEN"00000000"=>NST<=movetoright;
WHEN"00000000"=>NST<=movetoright;
WHEN"0000000001000000"=>NST<=movetoright;
WHEN"0000000000100000"=>NST<=movetoright;
WHEN"0000000000010000"=>
IFHIT="0000000000010000"THENCONTROL<="01";NST<=movetoleft;
ELSIFHIT(5)='1'THEN
BIFEN1<=BIFEN1+1;
NST<=start;
ENDIF;
WHEN"0000000000001000"=>
IFHIT(4)='1'THEN
BIFEN1<=BIFEN1+1;
NST<=start;
ELSIFHIT="0000000000001000"THENCONTROL<="01";NST<=movetoleft;
ENDIF;
WHEN"0000000000000100"=>
IFHIT(3)='1'THEN
BIFEN1<=BIFEN1+1;
NST<=start;
ELSIFHIT="0000000000000100"THENCONTROL<="10";NST<=movetoleft;
ENDIF;
WHEN"0000000000000010"=>
IFHIT
(2)='1'THEN
BIFEN1<=BIFEN1+1;
NST<=start;
ELSIFHIT="0000000000000010"THENCONTROL<="10";NST<=movetoleft;
ENDIF;
WHEN"0000000000000001"=>
IFHIT="0000000000000001"THENCONTROL<="10";NST<=movetoleft;
ELSEBIFEN1<=BIFEN1+1;
NST<=start;
ENDIF;
WHENOTHERS=>NST<=start;
ENDCASE;
3.主控时序进程:
操纵游戏使能及状态转换,具有异步清零功能。
附代码:
PROCESS(EN,RST,CLK)
BEGIN
IFEN='1'THEN
IFRST='0'THENST<=start;
ELSIFCLK'EVENTandCLK='1'THENST<=NST;
ENDIF;
ENDIF;
ENDPROCESS;
4.译码进程:
EN=0时显示学号;EN=1时将选手甲、乙的比分及比局变量译码转为七段数码管显示。
而且当TEMP=0时,在数码管上显示游戏终止标志End。
代码见附录。
RTL图
图5控制模块RTL图
分频模块
引脚功能
表2分频模块引脚功能表
FD
定义类型
外设
引脚
功能
instd_logic
CLK
内部50MHz时钟
EN
KEY3
总使能开关
SW1
SW1
频率直接选择信号
CONTROL
速度控制频率选择信号
outstd_logic
CLKOUT
提供频率给GAME
核心代码及说明
1.核心代码
PROCESS(CLK,EN)
VARIABLEtemp1:
integerrange999999downto0:
=0;--50Hz
VARIABLEtemp2:
integerrange4999999downto0:
=0;--10Hz
VARIABLEtemp3:
integerrange8999999downto0:
=0;
BEGIN
IFEN='1'THEN
ifCLK'EVENTANDCLK='1'THEN
IFtemp1=999999THEN
temp1:
=0;Q1<=NOTQ1;
ELSE
temp1:
=temp1+1;
ENDif;
IFtemp2=4999999THEN
temp2:
=0;Q2<=NOTQ2;
ELSE
temp2:
=temp2+1;
ENDif;
IFtemp3=8999999THEN
temp3:
=0;Q3<=NOTQ3;
ELSE
temp3:
=temp3+1;
ENDif;
endif;
ELSE
temp1:
=0;Q1<='0';
temp2:
=0;Q2<='0';
temp3:
=0;Q3<='0';
ENDIF;
CASECONTROLIS
WHEN"00"=>
IFSW1='1'THEN
CLKOUT<=Q1;
ELSIFSW1='0'THEN
CLKOUT<=Q3;
ENDIF;
WHEN"01"=>CLKOUT<=Q2;
WHEN"10"=>CLKOUT<=Q3;
WHENOTHERS=>CLKOUT<=Q1;
ENDCASE;
ENDPROCESS;
2.说明
该模块将内部时钟的50MHz信号,变成50Hz,10Hz,。
内部变量别离为Q1、Q二、Q3,将依照GAME模块反馈的CONTROL选择输出到CLKOUT。
初始条件下可直接通过SW1操纵Q一、Q3输出到CLKOUT。
RTL图
图6分频模块RTL图
第四部份操作配图
一、EN=0,显示学号
图7显示学号153835、153842
二、EN=1,初始状态,甲和乙比局和比分均为0。
图8初始状态
3、EN=1,甲发球,SW17亮。
图9
4、EN=1,右移状态。
图10
五、EN=1,乙接球失败,乙发球情形。
图11
六、甲乙比局2:
1,比分2:
5情形显示如下。
图17
7、游戏终止辅助显示如下。
图12
第五部份结论
碰到的问题和改良
问题1:
在竞赛终止时,比分比局迅速清零,无法使比分比局按咱们的意志在某时刻清零。
解决方法:
增设辅助信号,当竞赛终止时,使数码管在终止标志与比局之间切换显示,最后由人为的操纵使能开关清零。
问题2:
无法依照在不同键接球改变球运行的速度。
解决方法:
设一个反馈操纵信号,将不同键接球信息反馈回分频模块里从而操纵速度。
工作分派比例
邢可馨:
分频模块,按键击球和竞赛记分译码代码的设计与开发(55%)
陈声琴:
速度操纵处置、状态机代码的设计与开发(45%)
第六部份附录
一、分频模块代码:
LIBRARYIEEE;
USEFDIS
PORT(
EN:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
CLKOUT:
OUTSTD_LOGIC;
SW1:
INSTD_LOGIC;
CONTROL:
INSTD_LOGIC_VECTOR(1DOWNTO0)
);
ENDFD;
ARCHITECTUREbehavOFFDIS
signalQ1:
STD_LOGIC;
signalQ2:
STD_LOGIC;
signalQ3:
STD_LOGIC;
BEGIN
PROCESS(CLK,EN)
VARIABLEtemp1:
integerrange999999downto0:
=0;------最快使比赛结束的速度
VARIABLEtemp2:
integerrange4999999downto0:
=0;------接球加速后的速度
VARIABLEtemp3:
integerrange8999999downto0:
=0;-------正常发球速度
BEGIN
IFEN='1'THEN
ifCLK'EVENTANDCLK='1'THEN
IFtemp1=999999THEN
temp1:
=0;Q1<=NOTQ1;
ELSE
temp1:
=temp1+1;
ENDif;
IFtemp2=4999999THEN
temp2:
=0;Q2<=NOTQ2;
ELSE
temp2:
=temp2+1;
ENDif;
IFtemp3=8999999THEN
temp3:
=0;Q3<=NOTQ3;
ELSE
temp3:
=temp3+1;
ENDif;
endif;
ELSE
temp1:
=0;Q1<='0';
temp2:
=0;Q2<='0';
temp3:
=0;Q3<='0';
ENDIF;
CASECONTROLIS------利用反馈信号操纵速度
WHEN"00"=>
IFSW1='1'THEN
CLKOUT<=Q1;
ELSIFSW1='0'THEN
CLKOUT<=Q3;
ENDIF;
WHEN"01"=>CLKOUT<=Q2;
WHEN"10"=>CLKOUT<=Q3;
WHENOTHERS=>CLKOUT<=Q1;
ENDCASE;
ENDPROCESS;
ENDbehav;
二、状态机、击球、竞赛计分、译码操纵模块
LIBRARYieee;
USEGAMEIS
PORT(
EN:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;----速度控制时钟
RST:
INSTD_LOGIC;
HIT:
INSTD_LOGIC_VECTOR(17DOWNTO2);
CONTROL:
OUTSTD_LOGIC_VECTOR(1DOWNTO0);-----反馈信号操纵球速
LIGHT:
OUTSTD_LOGIC_VECTOR(17DOWNTO2);
HEX_7:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_6:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_5:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_4:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_3:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_2:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
HEX_0:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)
);
ENDENTITYGAME;
ARCHITECTUREbehavOFGAME
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 课程设计 乒乓球 游戏