最新基于VHDL课程设计乒乓球游戏.docx
《最新基于VHDL课程设计乒乓球游戏.docx》由会员分享,可在线阅读,更多相关《最新基于VHDL课程设计乒乓球游戏.docx(35页珍藏版)》请在冰豆网上搜索。
最新基于VHDL课程设计乒乓球游戏
A、以太网B、快速以太网
7.从数据表RSGL和RSGZ两个表中,查询出“编号”字段值相同的记录的全部信息,则实现此功能的SQL命令为____。
B.视图和查询文件的扩展名都是.QPR
B.S表中年龄大于60岁的记录被加上删除标记
14.查询设计器的排序依据选项卡的作用相当于SELECT命令中的___________短语。
6.VisualFoxPro是一种关系数据库管理系统,所谓关系是指________。
A..DBFB..QPRC...SCXD..TXT
26、子网掩码中“1”代表(B)。
C.选择了一个空闲的工作区D.显示出错信息
B.视图和查询文件的扩展名都是.QPR
课程设计
名称乒乓球游戏程序
姓名
专业班级
基于FPGA的乒乓球游戏程序的设计
摘要
VHDL是高速集成电路硬件描述语言,目前已成为许多设计自动化工具普遍采用的标准化硬件描述语言.VHDL语言功能性强、覆盖面广、灵活性高,具有很好的实用。
本文设计一个基于VHDL的乒乓游戏机模拟乒乓球比赛。
用VHDL编程模拟乒乓球比赛,电路模块由分频、状态机等部分组成,对各部分编写VHDL算法,进行编译及程序下载。
通过验证,乒乓游戏机能模拟乒乓球比赛的基本过程和规则,并能自动裁判和记分,还能根据接球快慢改变球运行的速度。
实现乒乓游戏机的功能。
关键词:
乒乓游戏机、VHDL、状态机
第一部分绪论
1.1课题设计背景
1.1.1FPGA简介
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
1.1.2硬件描述语言VHDL
VHDL的英文全名是VHSICHardwareDescriptionLanguage(VHSIC硬件描述语言)。
VHSIC是VeryHighSpeedIntegratedCircuit的缩写,是20世纪80年代在美国国防部的资助下始创的,并最终导致了VHDL语言的出现。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
1.1.3QuartusⅡ简介
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
HEX7
选手甲获胜局数
HEX6
HEX6
选手乙获胜局数
HEX5
HEX5
显示无意义
HEX4
HEX4
显示无意义
HEX3
HEX3
选手甲获胜比分
HEX2
HEX2
选手甲获胜比分
HEX1
HEX1
选手乙获胜比分
HEX0
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:
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"1000000000000000"=>NST<=movetoright;
WHEN"0100000000000000"=>
IFHIT="0000000000000000"THEN--开关及时关上
NST<=movetoright;
ELSE
BIFEN2<=BIFEN2+1;NST<=start;--若未及时关上,对方加分
ENDIF;
WHEN"0010000000000000"=>NST<=movetoright;
WHEN"0001000000000000"=>
IFHIT="0000000000000000"THEN
NST<=movetoright;
ELSE
BIFEN2<=BIFEN2+1;NST<=start;
ENDIF;
WHEN"0000100000000000"=>NST<=movetoright;
WHEN"0000010000000000"=>NST<=movetoright;
WHEN"0000001000000000"=>NST<=movetoright;
WHEN"0000000100000000"=>NST<=movetoright;
WHEN"0000000010000000"=>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。
代码见附录。
3.1.3RTL图
图5控制模块RTL图
3.2分频模块
3.2.1引脚功能
表2分频模块引脚功能表
FD
定义类型
外设
引脚
功能
instd_logic
CLK
内部50MHz时钟
EN
KEY3
总使能开关
SW1
SW1
频率直接选择信号
CONTROL
速度控制频率选择信号
outstd_logic
CLKOUT
提供频率给GAME
3.2.2核心代码及解释
1.核心代码
PROCESS(CLK,EN)
VARIABLEtemp1:
integerrange999999downto0:
=0;--50Hz
VARIABLEtemp2:
integerrange4999999downto0:
=0;--10Hz
VARIABLEtemp3:
integerrange8999999downto0:
=0;--5.556Hz
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,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:
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<=