最新基于VHDL课程设计乒乓球游戏Word文档下载推荐.docx
《最新基于VHDL课程设计乒乓球游戏Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新基于VHDL课程设计乒乓球游戏Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
AlteraQuartusII作为一种可编程逻辑的设计环境,由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
AlteraQuartusII(3.0和更高版本)设计软件是业界唯一提供FPGA和固定功能HardCopy器件统一设计流程的设计工具。
Quartus
IIdesign是最高级和复杂的,用于system-on-a-programmable-chip(SOPC)的设计环境。
QuartusIIdesign提供完善的timingclosure和LogicLock?
基于块的设计流程。
QuartusIIdesign是唯逐一个包括以timingclosure和基于块的设计流为基本特征的programmablelogicdevice(PLD)的软件。
QuartusII设计软件改进了性能、提升了功能性、解决了潜伏的设计延迟等,在产业领域率先提供FPGA与mask-programmeddevices开发的同一工作流程。
1.2课题主要内容
随着可编程逻辑电路和EDA技术的发展,在逻辑电路设计和嵌入式系统设计方面,以CPLD/FPGA为代表的可编程逻辑器件已经逐步代替了传统的标准逻辑器件;
本次论文的乒乓球游戏所有的程序可以集成在一个FPGA开发芯片上面,不用在用其他功能的分立逻辑元件,达到集成度高、响应快、功耗低的特点。
本次论文主要是基于FPGA的乒乓球游戏的设计,模拟乒乓球比赛的基本过程和规则,自动裁判和记分,比局为7局,每局11分。
而本次论文采用模块化设计,主要分为两大模块:
时钟分频模块、状态机控制模块。
第二部分系统设计
2.1整体设计图
图1乒乓球游戏程序BDF图
2.2设计思路
1.控制模块状态图
图2乒乓球游戏程序控制模块状态图
2.总体思路
SW0开关(EN)控制功能使能与比赛清零。
SW0关闭(EN=0),显示学号后六位,打开时允许运行,比分比局清零。
利用状态机,设初始状态处于start状态,key3为复位键,按下key3可以回到start状态。
通过各种请求信号实现状态的相互转换,进而实现发球和乒乓球左右移动、击球的相互转换,并在球未击中、提前击中、发球失败时显示相应比分、比局情况。
通过设计control的反馈控制频率方式,利用不同键击球的快慢控制球运行的速度。
并在整个游戏结束时有一个end标记与比分比局切换显示。
2.3具体功能对应等
1.乒乓球控制模块
控制乒乓球的运行状态的转换,比分、比局的显示。
反馈信号信号的设置和输出,为分频模块提供指令信号,控制球运行的速度。
图3乒乓球运行控制模块BDF
2.时钟分频模块
为状态机产生3种不同的时钟信号。
图4时钟分频模块BDF
第三部分模块设计
3.1控制模块
3.1.1引脚功能
表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
选手甲获胜局数
HEX6
选手乙获胜局数
HEX5
显示无意义
HEX4
HEX3
选手甲获胜比分
HEX2
HEX1
选手乙获胜比分
HEX0
CONTROL[1..0]
输出反馈给分频模块
LIGHT[17..2]
LEDR17~LEDR2
乒乓球位置显示
3.1.2核心代码及解释
模块主要分状态转换,状态译码,LED灯的译码,和辅助变量temp,辅助判断信号control的计数进程。
利用temp判断是否分出胜负即游戏是否结束,结束之后显示闪烁辅助标志End并且清零比分。
利用control判断接球快慢,反馈到分频器,分频器根据接球快慢控制球的运行速度,共快中慢三种速度,分别为50Hz,10Hz,5.556Hz。
为方便检查结果,SW1直接控制速度开关,共快慢两种速度,分别为50Hz,5.556Hz。
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:
--选手甲乙的比分译码输出变量
SIGNALREG_1:
--数码管的内部变量
SIGNALREG_5:
SIGNALREG_3:
SIGNALREG_8:
SIGNALREG_4:
SIGNALREG_2:
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,并调整球运行速度为中。
REG4,REG3条件下类似。
(5)进入状态movetoleft,灯左移,并判断是否有无关按键按下(SW2~SW5),若无则继续右移,反之返回状态start并且对方得一分。
当球移至REG17~REG13,进入选手甲可接球区域:
1当球移至REG13时选手乙及时击打相应开关SW6,则进入状态movetoright,并调整球运行速度为快。
REG14条件下类似。
2当球移至REG15时选手乙及时击打开关SW4,则进入状态movetoright,并调整球运行速度为中。
REG16,REG17条件下类似。
附movetoright代码:
WHENmovetoright=>
REG<
='
0'
&
REG(17DOWNTO3);
--右移状态
CASEREGIS
WHEN"
1000000000000000"
=>
NST<
=movetoright;
0100000000000000"
IFHIT="
0000000000000000"
THEN--开关及时关上
NST<
ELSE
BIFEN2<
=BIFEN2+1;
--若未及时关上,对方加分
ENDIF;
0010000000000000"
NST<
0001000000000000"
IFHIT="
THEN
NST<
ELSE
BIFEN2<
ENDIF;
0000100000000000"
0000010000000000"
0000001000000000"
0000000100000000"
0000000010000000"
0000000001000000"
0000000000100000"
0000000000010000"
THENCONTROL<
="
01"
;
=movetoleft;
ELSIFHIT(5)='
1'
THEN
BIFEN1<
=BIFEN1+1;
0000000000001000"
IFHIT(4)='
ELSIFHIT="
WHEN"
0000000000000100"
IFHIT(3)='
BIFEN1<
NST<
ELSIFHIT="
10"
0000000000000010"
IFHIT
(2)='
ENDIF;
0000000000000001"
IFHIT="
ELSEBIFEN1<
ENDIF;
WHENOTHERS=>
ENDCASE;
3.主控时序进程:
控制游戏使能及状态转换,具有异步清零功能。
附代码:
PROCESS(EN,RST,CLK)
BEGIN
IFEN='
THEN
IFRST='
THENST<
ELSIFCLK'
EVENTandCLK='
=NST;
ENDIF;
ENDPROCESS;
4.译码进程:
EN=0时显示学号;
EN=1时将选手甲、乙的比分及比局变量译码转为七段数码管显示。
并且当TEMP=0时,在数码管上显示游戏结束标志End。
代码见附录。
3.1.3RTL图
图5控制模块RTL图
3.2分频模块
3.2.1引脚功能
表2分频模块引脚功能表
FD
内部50MHz时钟
总使能开关
SW1
频率直接选择信号
CONTROL
速度控制频率选择信号
outstd_logic
CLKOUT
提供频率给GAME
3.2.2核心代码及解释
1.核心代码
PROCESS(CLK,EN)
VARIABLEtemp1:
integerrange999999downto0:
=0;
--50Hz
VARIABLEtemp2:
integerrange4999999downto0:
--10Hz
VARIABLEtemp3:
integerrange8999999downto0:
--5.556Hz
IFEN='
ifCLK'
EVENTANDCLK='
IFtemp1=999999THEN
temp1:
Q1<
=NOTQ1;
ELSE
=temp1+1;
ENDif;
IFtemp2=4999999THEN
temp2:
Q2<
=NOTQ2;
=temp2+1;
IFtemp3=8999999THEN
temp3:
Q3<
=NOTQ3;
=temp3+1;
endif;
ELSE
temp1:
Q1<
='
temp2:
Q2<
temp3:
Q3<
CASECONTROLIS
WHEN"
00"
IFSW1='
CLKOUT<
=Q1;
ELSIFSW1='
=Q3;
CLKOUT<
=Q2;
WHENOTHERS=>
ENDCASE;
2.解释
该模块将内部时钟的50MHz信号,变为50Hz,10Hz,5.556Hz。
内部变量分别为Q1、Q2、Q3,将根据GAME模块反馈的CONTROL选择输出到CLKOUT。
初始条件下可直接通过SW1控制Q1、Q3输出到CLKOUT。
3.2.3RTL图
图6分频模块RTL图
第四部分操作配图
1、EN=0,显示学号
图7显示学号153835、153842
2、EN=1,初始状态,甲和乙比局和比分均为0。
图8初始状态
3、EN=1,甲发球,SW17亮。
图9
4、EN=1,右移状态。
图10
5、EN=1,乙接球失败,乙发球情况。
图11
6、甲乙比局2:
1,比分2:
5情况显示如下。
图17
7、游戏结束辅助显示如下。
图12
第五部分结论
4.1遇到的问题和改进
问题1:
在比赛结束时,比分比局迅速清零,无法使比分比局按我们的意志在某时刻清零。
解决办法:
增设辅助信号,当比赛结束时,使数码管在结束标志与比局之间切换显示,最后由人为的控制使能开关清零。
问题2:
无法按照在不同键接球改变球运行的速度。
设一个反馈控制信号,将不同键接球信息反馈回分频模块里从而控制速度。
4.2工作分配比例
邢可馨:
分频模块,按键击球以及比赛记分译码代码的设计与开发(55%)
陈声琴:
速度控制处理、状态机代码的设计与开发(45%)
第六部分附录
一、分频模块代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYFDIS
PORT(
EN:
INSTD_LOGIC;
CLK:
INSTD_LOGIC;
CLKOUT:
OUTSTD_LOGIC;
SW1:
CONTROL:
INSTD_LOGIC_VECTOR(1DOWNTO0)
);
ENDFD;
ARCHITECTUREbehavOFFDIS
signalQ1:
STD_LOGIC;
signalQ2:
signalQ3:
BEGIN
------最快使比赛结束的速度
------接球加速后的速度
-------正常发球速度
CASECONTROLIS------使用反馈信号控制速度
=