VHDL语言与EDA课程设计报告书格式示范.docx
- 文档编号:11329478
- 上传时间:2023-02-27
- 格式:DOCX
- 页数:20
- 大小:177.38KB
VHDL语言与EDA课程设计报告书格式示范.docx
《VHDL语言与EDA课程设计报告书格式示范.docx》由会员分享,可在线阅读,更多相关《VHDL语言与EDA课程设计报告书格式示范.docx(20页珍藏版)》请在冰豆网上搜索。
VHDL语言与EDA课程设计报告书格式示范
湖南人文科技学院
课程设计报告
课程名称:
VHDL语言与EDA课程设计
设计题目:
乒乓球比赛游戏机
系别:
通信与控制工程系
专业:
电子信息工程
班级:
2007级2班
学生姓名:
孙永旭孙静
学号:
074092390740924
起止日期:
2009年12月21日~2010年1月日
指导教师:
杨玲
教研室主任:
侯海良
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
孙永旭
孙静
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
介绍了一种基于Altera公司大规模可编程逻辑器件EP1K100QC208-3的模拟乒乓球游戏系统,并给出里该模拟系统的主要组成单元——信号分频模块、数据传递模块、片选输出模块、核心控制模块及译码显示模块等的设计方法与技巧,给出了部分的仿真波形和实验源程序,整个系统用VHDL语音描述,在MAX+PLUSII10.0下调试仿真。
实现了乒乓球游戏的基本功能。
关键词:
CPLD/FPGA;VHDL;LED;乒乓球。
目录
设计要求1
1.引言1
2.方案论证与对比1
2.1方案一2
2.1.1设计原理2
2.2方案二3
2.2.1设计原理3
2.3论证对比4
3.设计过程5
3.1各模块原理及程序5
3.2乒乓球游戏机实体的设计5
3.3状态机编程实现6
3.4记分译码器的设计8
3.5构造体的设计10
4系统编译和波形仿真11
4.1系统的编译11
4.2系统有关波形的仿真11
5实验总结14
6仪器仪表清单14
7致谢15
8参考文献15
乒乓球比赛游戏机
设计要求
●设计一个由甲、乙双方参赛,有裁判的3人乒乓球游戏机。
●用8个(或更多个)LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依此从左到右,或从右到左,其移动的速度应能调节。
在其他时候击球视为犯规,给对方加1分;都犯规,各自加1分;
●当“球”(点亮的那只LED)运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球。
若击中,则球向相反方向移动;若未击中,则对方得1分。
●一方得分时,电路自动响铃3秒,这期间发球无效,等铃声停止后方能继续比赛。
●设置自动记分电路,甲、乙双方各用2位数码管进行记分显示,每计满21分为1局。
●甲、乙双方各设一个发光二极管,表示拥有发球权,每隔5次自动交换发球权,拥有发球权的一方发球才有效。
●裁判有一个按钮,是系统初始化。
1.引言
随着EDA技术的发展及大规模可编程逻辑器件CPLD/FPGA的出现,电子系统的设计技术和工具发生了巨大的变化,通过EDA技术对CPLD/FPGA编程开发产品,不仅成本低、周期短、可靠性高,而且可随时在系统中修改其逻辑功能。
本文介绍了一种以Altera公司可编程逻辑器件EP1K100QC208-3为控制核心芯片,附加一定外围电路组成的乒乓球模拟游戏系统。
2.方案论证与对比
整体思路
通过状态机来实现球的移动和各个状态的转移用数码管显示得分结果
通过计数器来实现3秒钟的定时来控制3秒响铃
通过可控分频器来控制状态的转移时钟从而控制球的速度
通过计数器来控制发球权
裁判通过开关来控制游戏的开始与结束
具体的设计思路:
各个状态间的转移控制要根据要求来改变转移的状态由于设计要求实现LED灯依此从左到右,或从右到左的移动,同时球拍击球。
若击中,则球向相反方向移动,若未击中,则对方得1。
很明显用VHDL中的状态机来实现其功能将非常简便和明了。
就其功能,若要实现记分,就得用到7段数码管,考虑到硬件要求,考虑用动态扫描技术来解决。
动态扫描前要进行译码,即把记数得分的结果译码成七段码,3秒钟的响铃控制通过1KHZ的时钟记数3000次来实现,具体的控制通过使能来控制,当进入得分状态就要求响铃,同时要求其他的发球都无效,即要求进入得分状态后有信号输出来控制3秒钟响铃,同时状态不发生转移,3秒钟结束后产生另一个信号,使状态转移进入等待状态。
速度可以控制模块:
用输入可以控制分频来控制状态转移的时钟,从而控制了状态转移的快慢,即控制了球移动的速度。
发球权的控制通过内部的计数器来控制,计数器放在3,秒钟结束的时候,表明每得一次分就已经发了一次球,当记满3次后交换发球权,而发球权要求控制谁发球有效,就在等待状态里,在发球的条件上加上发球权属于谁。
要求甲、乙双方参赛,即用两个输入信号代表,裁判则用重置来表示。
重新开始时,要求所有的计数器都清零,且进入等待状态。
总的来说,要完成乒乓球游戏机的设计,可以以状态机为控制核心,附加其它功能模块来实现。
2.1方案一
2.1.1设计原理
状态机设置了8个状态,分别是“等待发球状态”(waitserve),“第一盏灯亮状态”(light1on),“第八盏灯亮状态”(light2on),“球向乙移动状态”(ballmove2),“球向甲移动状态”(ballmoveto1),“允许甲击球状态”(allow1hir),“允许乙击球状态”(allow2hit),“响铃状态”(speakout)。
开始的时候处于“等待发球状态”,若甲发球则转移到“第一盏灯亮状态”,若乙发球则则转移到“第八盏灯亮状态”,具体以甲发球为例。
若发球后乙没有提前击球(规定球移动到对方第一个发光二极管时允许击球),那么装体机从“第一盏灯亮”转移到“球向乙移动”。
若在“球向乙移动状态”乙仍然没有提前击球,状态就转移到“允许乙击球状态”,在此状态下若乙击球了,那么状态就转移到“球向甲移动状态”。
在“第一盏灯亮状态”,“球向乙移动状态”中,如果乙击球了,就算提前击球,这样甲得分,状态转移到“响铃状态”等到完成了3秒响铃后进入“等待发球状态”等待发球。
“球向甲移动状态”之后的过程和前面的过程不过是甲乙角色的调换而已。
其过程如下
图1
2.2方案二
2.2.1设计原理
本设计共分为五个功能模块:
main_controller模块是系统设计的核心控制模块,它负责整个设计的控制信号输出和全部逻辑功能;transport_data在使能信号有效时,负责将相应的计分数据传递给显示模块输出;slect_chip模块负责产生对应数码管的片选信号;display模块负责得分数据数码管的译码输出;fp_1Hz模块负责将40MHz的本地时钟分频为本设计的所需脉冲频率(1Hz)。
五个模块有机地结合协调工作。
图2
2.3论证对比
通过以上两种方案的设计,我们很容易看出方案一中设置了八个状态。
方案二中的五个模块分别是main_controller,transport_data,slect_chip,display,fp_1Hz通过此方案可以看出在display模块负责得分数据数码管的译码输出,在实验的硬件测试中当适当的选择模式就能直接通过实验箱上的译码管和数码管显示出来,在此就不需要重新来设计此块功能的模块。
这样容易占用的逻辑资源较多。
而且在3秒响铃的功能很难表现出来。
方案一详细列出了各个状态的工作情况,并以实例演示其工作过程。
在响铃3秒这一块得到了很好的体现。
相对于方案二来说方案一的设计更为完善,更符合设计的要求。
鉴于此点,此设计方案采用方案一。
3.设计过程
3.1各模块原理及程序
该乒乓球游戏机的设计主要包括的模块与内容有:
乒乓球游戏机实体的设计,游戏机编程的实现,记分译码器的设计以及构造体的设计。
直接对状态机进行描述,所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELSE语句实现。
以下我们就详细解析各个板快的设计与实现。
3.2乒乓球游戏机实体的设计
设计该乒乓球游戏机的输入与输出端口。
首先考虑输入端口,一般应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态:
两个发球输入端serve1和serve2,逻辑‘1’分别表示甲方和乙方的发球;两个击球输入端hit1和hit2,逻辑‘1’分别表示甲击球和乙击球;一个开始游戏按钮startbutton,处于逻辑‘1’表示可以游戏;还得有一个时钟输入端口clk。
其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到4个七段译码器,每方用到2个,可以表示0到21的数字,每个七段译码器需要芯片的7个输出端口来控制,总共28个输出端口。
实体的设计如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;//引用必要的库函数和包集合
entitypingponggameis--实体名为pingponggame
port(reset:
intstd_logic;
clk:
intstd_logic;
startbutton:
intstd_logic;--开始游戏输入端口
serve:
instd_logic_vector(1to2);--发球输入端口
hit1,hit2:
intstd_logic;--甲和乙的击球输入端口
--控制8个发光二极管的输出端口
light:
outstd_logic_vector(1to8);
score11,score12,score21,score22:
outstd_logic_vector(1to7));--4个用于控制4个7段译码器的输出端口
endpingponggame;
3.3状态机编程实现
状态机设置了7个状态,分别是waitserve,light1on,ballmoveto2,
Allow2hit,light8on,ballmoveto1,和allow1hit它们代表的具体数值依次是0到6。
在波形模拟图中是用数值来表示状态的。
在整个程序中,状态机起的是中央控制器的作用,由它控制的信号来影响整个程序中的其他相关部分,如记分部分,发光二极管部分。
乒乓球游戏机中有两个计数器count1和count2,分别记忆甲和乙的得分,用发光二极管的轮流发光表示球的移动轨迹。
状态机的进程如下:
process(clk)--clk作为敏感信号触发进程
begin--进程开始
ifreset='1'then--异步置位
i<=0;count1<"00000";count2<="00000";
elsifclk'eventandclk='1'then--当处于时钟inclock上升沿时
ifcount1="10101"orcount2="10101"then
i<=0;count1<"00000";count2<="00000";
elsifstartbutton+'0'then
i<=0;count1<"00000";count2<="00000";
else--以下case语句是程序中最关键的状态机部分
casestateis
whenwaitserve=>--进程处于等待发球状态
caseserveis
when"10'=>i<=1;state<=light1on;
when"01'=>i<=8;state<=light8on;
when"i1"=>i<=0;
whenothers=>i<=0;
endcase;
whenlight1on=>--进程处于第一盏灯亮状态
i<=2
ifhit2='1'then
i<=0;
count1<=count1+1;state<=waitserve;
else
state<=ballmoveto2;
endif;
whenlight8on=>--进程处于第八盏灯亮状态
i<=7;
ifhit='1'then
i<=0;
count2<=count2+1;state<=waitserve;
else
state<=ballmoveto1;
endif;
whenballmoveto1=>--进程处于球向乙移动状态
ifhit1='1'then
i<=0;
count2<=count2+1;state<=waitserve;
elsifi=2theni<=1;
state<=allow1hit;
elsei<=i-1;
endif;
whenballmoveto2=>--进程处于球向乙移动状态
ifhit2='1'then
i<=0;
ount1<=count1+1;state<=waitserve;
elsifi=7theni<=8;
state<=allow2hit;
elsei<=i+1;
endif;
whenallow1hit=>--进程处于允许甲击球状态
ifhit1='1'theni<=2;
state<=ballowto2;
elsecount2<=count2+1;i<=0;
state<=waitserve;
endif;
whenallow2hit=>--进程处于允许乙击球状态
ifhit2='1'theni<=7;state<=ballmoveto1;
elsecount1<=count1+1;i<=0;
state<=waitserve;
endif;
endcase;
endif;
endif;
endprocess;
3.4记分译码器的设计
七段译码器是在数学电路设计中经常用到的显示电路。
所谓七段译码器,其实是由7段发光二极管组成的用于显示数字的器件。
记分译码器(mydecoder):
由于记分需要显示出来,所以要使用七段译码器。
而状态机中的记分是由5位二进制码来表示的,即count1和count2。
以下程序就是实现从5位二进制码转换成七段译码显示。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsingned.all;
entitymudecoderis
port(binaryin:
intstd_logic_vector(1to5);
--5位二进制码的输入端口
bcdout1:
outstd_logic_vector(1to7);--七段译码器输出端口
bcdout2:
outstd_logic_vector(1to7)
);
endmydecoder;
architecturemofmydecoderis
signaltembinaryin:
std_logic_vector(1to5);
begin
process(binaryin)
begin
tembinaryin<=binaryin;
casetembinaryinis
--把0到9的5位二进制码转换成七段译码
when"00000"=>bcdout1<="1111110";bcdout2<="1111110";
when"00001"=>bcdout1<="1111110";bcdout2<="0110000";
when"00010"=>bcdout1<="1111110";bcdout2<="1101101";
when"00011"=>bcdout1<="1111110";bcdout2<="1111001";
when"00100"=>bcdout1<="1111110";bcdout2<="0110011";
when"00101"=>bcdout1<="1111110";bcdout2<="1011011";
when"00110"=>bcdout1<="1111110";bcdout2<="1011111";
when"00111"=>bcdout1<="1111110";bcdout2<="1110000";
when"01000"=>bcdout1<="1111110";bcdout2<="1111111";
when"01001"=>bcdout1<="1111110";bcdout2<="1111011";
--把10到19的5位二进制码转换成七段译码
when"01010"=>bcdout1<="0110000";bcdout2<="1111110";
when"01011"=>bcdout1<="0110000";bcdout2<="0110000";
when"00000"=>bcdout1<="0110000";bcdout2<="1101101";
when"01100"=>bcdout1<="0110000";bcdout2<="1111001";
when"01101"=>bcdout1<="0110000";bcdout2<="0110011";
when"01111"=>bcdout1<="0110000";bcdout2<="1011011";
when"10000"=>bcdout1<="0110000";bcdout2<="1011111";
when"10001"=>bcdout1<="0110000";bcdout2<="1110000";
when"10010"=>bcdout1<="0110000";bcdout2<="1111111";
when"10011"=>bcdout1<="0110000";bcdout2<="1111011";
--把20到21的5位二进制码转换成七段译码
when"10100"=>bcdout1<="1101101";bcdout2<="1111110";
when"10101"=>bcdout1<="1101101";bcdout2<="0110000";
--如果5位二进制码不在0到21范围内,那么两个七段译码器都显示0
whenothers=>bcdout1<="1101101";bcdout2<="1111110";
endcase;
endprocess;
endm;
这个记分译马电路是针对乒乓球游戏机的特点进行的特别设计,采用的是全部列举的方法。
3.5构造体的设计
该构造体紧跟在实体设计之后,这样就完成了数字乒乓球游戏机的VHDL源程序编写。
rchitecturegameofpingponggameis
typepingpongis(waitserve,light1on,ballmoveto2,allow2hit,
light8on,ballmoveto1,allow1hit);
---设置7个状态,为枚举数据类型,记为pingpong
signalstate:
pingpong;
signali:
integerrange0to8;
signalcount1,count2:
std_logic_vector(1to5):
="00000";
---内部计数器,是5位二进制变量
componentmydecoderis
port(binaryin:
instd_logic_vector(1to5);
bcdout1:
outstd_logic_vector(1to7);
bcdout2:
outstd_logic_vector(1to7);
);
endcomponent;
---调用记分译码器
begin
process(clk)--状态机进程
begin
……
endprocess;
--进程处i信号控制发光二极管的亮暗
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)else
"00000100"when(i=6)else
"00000010"when(i=7)else
"00000001"when(i=8)else
"00000000";--其他情况所有发光二极管都暗
u0:
mydecoderportmap(count1,score11,score12);
--用七段译码器显示甲的分数
u1:
mydecoderportmap(count2,score21,score22);
----用七段译码器显示乙的分数
endgame;
从构造体设计中可以看到,控制整个乒乓球游戏机运转的就是状态机进程,它队各个外围部分起控制作用。
它是整个程序的核心,起到一个中心控制器的作用。
而外围的部分,比如分数显示,球的轨迹,都是通过它传出的信号来控制。
状态机中的i信号和count1,count2信号的变化同时就可以影响到外围的显示部分---发光二极管和七段译码器,从而表示出当时的乒乓球位置和双方分数情况。
4系统编译和波形仿真
4.1系统的编译
编译时选择所要下载的芯片为EPM7128SLC84-15,在编译完成以后,会出现两个警告,信息是这样的:
“Primitive‘score112’isstuckatVCC”和“Primitive‘score212’isstuckatVCC”。
这说明score11
(2)和score21
(2)端口输出一直是‘1’。
score11
(2)是用来表示甲得分的十位数字的七段译码器的b段的,由于在记分译码器设计中,十位数字只会显示0,1或者2,无论是这三个数字中的那一个,b段的发光二极管都是亮的,所以就相当于接着高电平VCC。
Score21
(2)同理。
4.2系统有关波形的仿真
编译完成后,进行波形仿真,仿真波形图如图4.2所示。
图4.2乒乓球游戏机波形仿真图一
在这个仿真图中,看到serve数组为1,代表乙发球。
I从8开始依次递减计数,控制发光管亮暗light信号也随着i的数值变化,见图4.3所示。
由light端口输出的高电平驱动芯片以外的发光二极管使之点亮,这样就可以通过发光二极管模拟乒乓球的运动轨迹。
可以看到,在甲该击球的时候没有击球,也就是hit1在state状态6的时候没有高电平‘1’输入,则乙得分,count2由0变1,score22的值随之变化。
从最后一行state值的变化,可以清楚分析状态转移。
图4.3乒乓球游戏机仿真波形图一中的乒乓球移动状况
图4.4是乙发球以后,甲在正确时刻接球的波形仿真图。
图4.4乒乓球游戏机波形仿真图二
甲在state为状态6的时候击球了,在图上hit1在此时刻出现高电平,看到state转移到了状态2。
当到了状态3乙没有击
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 语言 EDA 课程设计 报告书 格式 示范