基于VHDL课程设计乒乓球游戏.doc

上传人:聆听****声音 文档编号:718776 上传时间:2023-04-29 格式:DOC 页数:31 大小:2.21MB
下载 相关 举报
基于VHDL课程设计乒乓球游戏.doc_第1页
第1页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第2页
第2页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第3页
第3页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第4页
第4页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第5页
第5页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第6页
第6页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第7页
第7页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第8页
第8页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第9页
第9页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第10页
第10页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第11页
第11页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第12页
第12页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第13页
第13页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第14页
第14页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第15页
第15页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第16页
第16页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第17页
第17页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第18页
第18页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第19页
第19页 / 共31页
基于VHDL课程设计乒乓球游戏.doc_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于VHDL课程设计乒乓球游戏.doc

《基于VHDL课程设计乒乓球游戏.doc》由会员分享,可在线阅读,更多相关《基于VHDL课程设计乒乓球游戏.doc(31页珍藏版)》请在冰点文库上搜索。

基于VHDL课程设计乒乓球游戏.doc

课程设计

名称乒乓球游戏程序

姓名

专业班级

29

目录

摘要 1

第一部分绪论 2

1.1课题设计背景 2

1.1.1FPGA简介 2

1.1.2硬件描述语言VHDL 2

1.1.3QuartusⅡ简介 2

1.2课题主要内容 3

第二部分系统设计 4

2.1整体设计图 4

2.2设计思路 5

2.3具体功能对应等 6

第三部分模块设计 9

3.1控制模块 9

3.1.1引脚功能 9

3.1.2核心代码及解释 10

3.1.3RTL图 13

3.2分频模块 14

3.2.1引脚功能 14

3.2.2核心代码及解释 14

3.2.3RTL图 15

3.3按键处理模块 15

3.3.1引脚功能 15

3.3.2核心代码及解释 15

3.3.3RTL图 16

3.4锁楼层模块 17

3.4.1引脚功能 17

3.4.2核心代码及解释 17

3.4.3RTL图 18

第四部分操作配图 19

第五部分结论 23

4.1遇到的问题和改进 23

4.2工作分配比例 23

第六部分附录 24

基于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);--选手甲乙的比局译码输出变量

SIGNAL BIFENOUT11,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,进入选手乙可接球区域:

①当球移至REG6时选手乙及时击打相应开关SW6,则进入状态movetoleft,并调整球运行速度为快。

若提前击打或未及时关闭开关,则击球失败并且对方得一分,进入状态start。

REG5条件下类似。

②当球移至REG4时选手乙及时击打开关SW4,则进入状态movetoleft,并调整球运行速度为中。

若提前击打或未及时关闭开关,则击球失败并且对方得一分,进入状态start。

REG4,REG3条件下类似。

(5)进入状态movetoleft,灯左移,并判断是否有无关按键按下(SW2~SW5),若无则继续右移,反之返回状态start并且对方得一分。

当球移至REG17~REG13,进入选手甲可接球区域:

①当球移至REG13时选手乙及时击打相应开关SW6,则进入状态movetoright,并调整球运行速度为快。

若提前击打或未及时关闭开关,则击球失败并且对方得一分,进入状态start。

REG14条件下类似。

②当球移至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=999999 THEN

temp1:

=0;Q1<=NOTQ1;

ELSE

temp1:

=temp1+1;

ENDif;

IFtemp2=4999999 THEN

temp2:

=0;Q2<=NOTQ2;

ELSE

temp2:

=temp2+1;

ENDif;

IFtemp3=8999999 THEN

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=999999 THEN

temp1:

=0;Q1<=NOTQ1;

ELSE

temp1:

=temp1+1;

ENDif;

IFtemp2=4999999

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2