EDA课程设计论文基于VHDL的乒乓球游戏机设计Word文档下载推荐.docx
《EDA课程设计论文基于VHDL的乒乓球游戏机设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《EDA课程设计论文基于VHDL的乒乓球游戏机设计Word文档下载推荐.docx(23页珍藏版)》请在冰点文库上搜索。
![EDA课程设计论文基于VHDL的乒乓球游戏机设计Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/a532b381-ce57-4a5c-885d-4ed29ef44dec/a532b381-ce57-4a5c-885d-4ed29ef44dec1.gif)
然后重新发球进行比赛,知道一方记分达到21分为止,记分清零,重新开始新一局比赛。
2开发工具简介
技术
EDA[2]是电子设计自动化(ElectronicDesignAutomation)缩写,是90年代初从CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAT(计算机辅助测试)和CAE(计算机辅助工程)的概念发展而来的。
EDA技术是以计算机为工具,根据硬件描述语言HDL(HardwareDescriptionlanguage)完成的设计文件,自动地完成逻辑编译、化简、分割、综合及优化、布局布线、仿真以及对于特定目标芯片的适配编译和编程下载等工作。
典型的EDA工具中必须包含两个特殊的软件包,即综合器和适配器。
综合器的功能就是将设计者在EDA平台上完成的针对某个系统项目的HDL、原理图或状态图形描述,针对给定的硬件系统组件,进行编译、优化、转换和综合,最终获得我们欲实现功能的描述文件。
综合器在工作前,必须给定所要实现的硬件结构参数,它的功能就是将软件描述与给定的硬件结构用一定的方式联系起来。
也就是说,综合器是软件描述与硬件实现的一座桥梁。
综合过程就是将电路的高级语言描述转换低级的、可与目标器件FPGA/CPLD相映射的网表文件。
硬件描述语言HDL是相对于一般的计算机软件语言,如:
C、PASCAL而言的。
HDL语言使用与设计硬件电子系统的计算机语言,它能描述电子系统的逻辑功能、电路结构和连接方式。
设计者可利用HDL程序来描述所希望的电路系统,规定器件结构特征和电路的行为方式;
然后利用综合器和适配器将此程序编程能控制FPGA和CPLD内部结构,并实现相应逻辑功能的的门级或更底层的结构网表文件或下载文件。
目前,就FPGA/CPLD开发来说,比较常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
硬件描述语言—VHDL
VHDL[3]的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
此后VHDL在电子设计领域得到了广泛的接受,并逐步取代了原有的非标准的硬件描述语言。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL与Verilog语言将承担起大部分的数字系统设计任务。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体[4](可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
应用VHDL进行工程设计的优点是多方面的。
(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。
强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。
(2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。
(3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。
符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。
(4)对于用VHDL完成的一个确定的设计,可以利用EDA工具进行逻辑综合和优化,并自动的把VHDL描述设计转变成门级网表。
(5)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。
2.3MAX+PLUSⅡ的介绍
Altera公司的MAX+PLUSⅡ[5]开发系统是一个完全集成化、易学易用的可编程逻辑设计环境,它可以在多种平台上运用。
它所提供的灵活性和高效性是无可比拟的。
其丰富的图形界面,辅之以完整的、可及时访问的在线文档,使学生能够轻松掌握和使用MAX+PLUSⅡ软件。
MAX+PLUSⅡ软件支持各种HDL设计输入选项,包括VHDL、VerilogHDL和Altera自己的硬件描述语言AHDL,它允许设计人员添加自己认为有价值的宏函数。
MAX+PLUSⅡ系统的核心Compiler支持Altera公司的FLEX10K、FLEX8000、FLEX6000、MAX9000、MAX7000、MAX5000和Classic可编程逻辑器件系列,提供了商业界唯一真正与结构无关的可编程逻辑设计环境。
MAX+PLUSⅡ的编译器还提供了强大的逻辑综合与优化功能,使用户比较容易地将设计集成到器件中。
●设计输入
MAX+plusII软件的设计输入方式有多种,主要包括原理图输入方式、文本输入方式、波形设计输入方式、层次设计输入方式和底层设计输入方式。
因此,设计人员可以根据自己的实际情况灵活选择使用。
●设计编译
MAX+plusII编译一个设计时,Compiler在设计文件中读取信息并产生编程文件和仿真文件,MessageProcessor(信息处理程序)可自动定位错误。
●设计校验
设计校验过程包括设计仿真和定时分析,仿真起的作用是测试逻辑操作和设计功能的完备性;
TimingAnalyzer(定时分析程序)可分析设计的定时和延时情况。
●器件编程
MAX+plusIIProgrammer是使用Compiler生成的编程文件对Altera器件进行编程的。
它可以用来对器件编程、校验和试验,是对设计功能进行的测试。
Altera公司器件的编程方法有许多种,可根据具体情况选择使用。
编译生成的配置文件经计算机并行通信口接到Altera专用编程电缆上,再接到器件的编程接口[6],利用应用软件提供的编程软件,Programmer即可对器件进行配置。
这种方法的优点是配置方便、迅速,便于修改。
MAX+plus2在Windows2000/XP上一旦安装完毕,经过设置即可使用硬件下载功能。
在Windows2000上除了安装软件外,为了使用ByteBlaster(MV)下载功能,还必须安装硬件驱动(Drivers)以支持MAX+plus2对PC机并行口的操作。
3设计方案
3.1状态机的设计思路
状态机设置了7个状态,分别是“等待发球状态”,第一盏灯亮状态“,第八盏灯亮状态”,“球向乙移动状态”,“球向甲移动状态”,“允许甲击球状态”,“允许乙击球状态”。
这是该程序中起作用的7个状态。
开始的时候处于“等待发球状态”,若甲发球则状态转移到“第一盏灯亮状态,若乙发球则转移到”第八盏灯亮状态“,具体说明以甲发球为例。
若发球后乙没有提前击球——规定球移动到对方第一个发光二极管时允许击球,那么状态机从“第一盏灯亮状态”转移到“球向乙移动状态”。
若在“球向乙移动状态”乙仍然没有提前击球,状态就转移到“允许乙击球状态”,在此状态下,如果乙击球了,那么状态就转移到“球向甲移动状态”。
在“第一盏灯亮状态”,“球向乙移动状态”中,如果乙击球了,就算提前击球,这样甲得分,状态转移到“等待发球状态”等待发球。
“球向甲移动状态”之后的过程和前面的过程只不过是甲乙角色的调换而已。
状态转移规则都是一样。
图3-1给出了乒乓游戏机的状态转移图。
图3-1
3.2乒乓球游戏机实体的设计
设计该乒乓球游戏机的输入/输出端口。
首先考虑输入端口,一般都应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态;
两个发球输入端serve1和serve2,逻辑‘1’分别表示甲方和乙方的发球;
两个击球输入端hit1和hit2,逻辑‘1’分别表示甲击球和乙击球;
一个开始游戏按钮startbutton,处于逻辑‘1’表示可以游戏;
还得有一个时钟输入端口clk。
其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;
另外,要直观地表示双方的得分,就得用到七段译码器,每方用到2个,可以表示0~21的数字,每个七段译码器需要芯片的7个输出端口来控制,总共需要28个输出端口。
实体的设计如下:
libraryieee;
useieee.std_logic_1164.all;
;
useieee.std_logic_unsigned.all;
entitypingponggameis
port(reset:
instd_logic;
clk:
startbutton:
serve:
instd_logic_vector(1to2);
hit1,hit2:
light:
outstd_logic_vector(1to8);
score11,score12,score21,score22:
outstd_logic_vector(1to7));
endpingponggame;
3.3状态机编程实现
状态机设置了7个状态,分别是等待发球状态(waitserve)、第一盏灯亮状态(light1on)、第八盏灯亮状态(light8on)、球向乙移动状态(ballmoveto2)、球向甲移动状态(ballmoveto1)、允许甲击球状态(allow1hit)和允许乙击球状态(allow2hit)。
状态waitserve,light1on,ballmoveto2,allow2hit,light8on,ballmoveto1和allow1hit代表的具体数值依次是0到6.在波形模拟图中是用数值来表示状态的。
乒乓球游戏机中有两个计数器count1和count2,分别记忆甲的得分和乙的得分;
一个i信号,用它的数值来控制状态机外8个发光二极管的亮和暗,比如当i=1时表示第一个发光二极管亮,用发光二级管的轮流发光表示球的移动轨迹。
输入状态机的信号有游戏开关startbutton信号,它是1位二进制信号,数值为1表示可以进入游戏;
serve信号,是一个2位二进制向量,“01”表示甲发球;
两个二进制信号hit1和hit2分别表示甲乙是否击球,若数值为1,表示击球,不为1表示不击球。
以下是状态机进程代码。
process(clk)
begin
ifreset='
1'
then
i<
=0;
count1<
="
00000"
count2<
elsifclk'
eventandclk='
then
ifcount1="
10101"
orcount2="
i<
elsifstartbutton='
0'
else
casestateis
whenwaitserve=>
caseserveis
when"
00"
=>
10"
=1;
state<
=light1on;
01"
=8;
=light8on;
11"
whenothers=>
endcase;
whenlight1on=>
=2;
ifhit2='
theni<
=count1+1;
=waitserve;
=ballmoveto2;
endif;
whenlight8on=>
=7;
ifhit1='
=count2+1;
=ballmoveto1;
whenballmoveto1=>
elsifi=2theni<
=allow1hit;
elsei<
=i-1;
whenballmoveto2=>
elsifi=7theni<
=allow2hit;
=i+1;
whenallow1hit=>
elsecount2<
whenallow2hit=>
elsecount1<
endprocess;
3.4记分译码器的设计
七段译码器是在数字电路设计中经常用到的显示电路。
所谓七段译码器,其实是由7段发光二极管组成的用于显示数字的器件。
如图3-2所示。
图3-2
其中的a,b,c,d,e,f,g飞奔为7段发光二极管,通过控制每个发光二极管的亮和暗,可以分别显示0~9十个数字。
例如,b和c两段发光二极管亮,其他发光二极管暗,则表示数字“1”;
a,b,g,e和d五段发光二极管亮,其他发光二极管暗,则表示数字“2”。
七段译码器有7个输入端,分别控制a~g七段发光二极管。
记分译码器(mydecoder):
由于记分需要显示出来,所以要使用七段译码器。
而状态机中的记分是由5位二进制码来表示的,即count1和count2.以下程序就是实现从5位二进制码转换成七段译码显示。
bcout1
(1)和bcout2
(1)表示a段,bcout1
(2)和bcout2
(2)表示b段,以此类推,bcout1(7)和bcout2(7)表示g段。
这个记分译码器电路是针对乒乓球游戏机的特点进行的特别设计,采用的是全部列举的方法,代码如下:
useieee.std_logic_arith.all;
entitymydecoderis
port(binaryin:
instd_logic_vector(1to5);
bcdout1:
outstd_logic_vector(1to7);
bcdout2:
endmydecoder;
architecturemofmydecoderis
signaltembinaryin:
std_logic_vector(1to5);
process(binaryin)
tembinaryin<
=binaryin;
casetembinaryinis
=>
bcdout1<
1111110"
bcdout2<
00001"
0110000"
00010"
1101101"
00011"
1111001"
00100"
0110011"
00101"
1011011"
00110"
1011111"
00111"
1110000"
01000"
1111111"
01001"
1111011"
01010"
bcdout1<
01011"
01100"
01101"
01110"
01111"
10000"
10001"
10010"
10011"
10100"
endm;
3.5构造体的设计
构造体代码如下:
architecturegameofpingponggameis
typepingpongis(waitserve,light1on,ballmoveto2,allow2hit,light8on,
ballmoveto1,allow1hit);
signalstate:
pingpong;
signali:
integerrange0to8;
signalcount1,count2:
std_logic_vector(1to5):
componentmydecoderis
endcomponent;
…….
light<
10000000"
when(i=1)else
"
01000000"
when(i=2)else
00100000"
when(i=3)else
00010000"
when(i=4)else
00001000"
when(i=5)e