基于某VHDL的乒乓球设计.docx

上传人:b****2 文档编号:23241184 上传时间:2023-05-15 格式:DOCX 页数:20 大小:551.81KB
下载 相关 举报
基于某VHDL的乒乓球设计.docx_第1页
第1页 / 共20页
基于某VHDL的乒乓球设计.docx_第2页
第2页 / 共20页
基于某VHDL的乒乓球设计.docx_第3页
第3页 / 共20页
基于某VHDL的乒乓球设计.docx_第4页
第4页 / 共20页
基于某VHDL的乒乓球设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于某VHDL的乒乓球设计.docx

《基于某VHDL的乒乓球设计.docx》由会员分享,可在线阅读,更多相关《基于某VHDL的乒乓球设计.docx(20页珍藏版)》请在冰豆网上搜索。

基于某VHDL的乒乓球设计.docx

基于某VHDL的乒乓球设计

课程报告

 

设计课题:

乒乓球游戏的FPGA实现

姓名:

黄琳吴胜辉许晓明

专业:

电子信息工程

学号:

111510801811151060471115106052

日期

2013年11月25日——2013年12月1日

指导教师:

傅文渊

 

华侨大学信息科学与工程学院电子工程系

1项目名称、内容与要求………………………………………02页

1.1项目名称…………………………………………………02页

1.2设计内容…………………………………………………02页

1.3具体要求…………………………………………………02页

2系统整体架构…………………………………………………02页

2.1设计原理…………………………………………………02页

2.2设计思路…………………………………………………03页

3系统设计………………………………………………………03页

………………………………03页

………………………………………04页

3.3构造体的设计……………………………………………07页

………………………………………………08页

3.5最后的整体模块和管脚锁定……………………………10页

3.6编译和波形仿真…………………………………………10页

…………………………………………………15页

4完毕语…………………………………………………………15页

参考书目…………………………………………………………16页

 

一、项目名称、内容与要求

乒乓球游戏的FPGA实现

设计一个由甲乙双方参赛,二人乒乓球游戏机。

用8个LED排成一条直线,以中点为界,两边各代表参赛双方的位置,其中一只点亮的LED指示球的当前位置,点亮的LED依次从左到右,或从右到左。

当“球〞〔点亮的那只LED〕运动到某方的最后一位时,参赛者应能果断地按下位于自己一方的按钮开关,即表示启动球拍击球,假如击中,如此球向相反方向运动,如此对方得一分,同时蜂鸣器自动响起。

设置自动记分电路,甲乙双方各用一位数码管进展记分显示,每计满11分为1局。

〔1〕使用乒乓球游戏机的双方在不同位置发球或击球。

〔2〕乒乓球的位置和移动方向由灯亮和依次亮的方向决定。

使用者根据球的位置发出相应的动作。

〔3〕比赛用11分为一局来进展,双方设置各自的记分牌,任意一方先记满11分就获胜此局。

当记分牌清零后,开始新的一局比赛。

〔4〕〔发挥局部〕完善以上设计,使之更加符合乒乓球运动的各项规如此。

 

二、系统整体架构

两人乒乓球游戏机是用8个发光二极管代表乒乓球台,中间两个发光二极管兼做乒乓球网,用点亮的发光二极管按一定方向移动来表示球的运动。

在游戏机的两侧各设置发球和击球开关,甲乙双方按乒乓球比赛规如此来操作开关。

当甲方按动发球开关时,靠近甲方的第一个发光二极管亮,然后发光二极管由甲方向乙方依次点亮,代表乒乓球的移动。

当球过网后按照设计者规定的球位乙方就可以击球。

假如乙方提前击球或者未击到球,如此甲方得分。

然后重新发球进展比赛,知道一方记分达到11分为止,记分清零,重新开始新一局比赛。

 

根据系统设计的要求,乒乓球比赛游戏机的电路原理框图如下:

 

三、系统设计

设计该乒乓球游戏机的输入/输出端口。

首先考虑输入端口,一般都应该设置一个异步置位端口reset,用于在系统不正常时回到初始状态;一个发球输入端serve,逻辑‘1’代表开始发球的指令;两个击球输入端hit1和hit2,逻辑‘1’分别表示甲击球和乙击球;一个开始游戏按钮startbutton,处于逻辑‘1’表示可以游戏;还得有一个时钟输入端口clk。

其次考虑输出端口,芯片应该有8个输出端口来控制8个发光二极管,输出逻辑‘1’即输出一个高电平,可以使发光二极管点亮;另外,要直观地表示双方的得分,就得用到数码管,每方用到1个,可以表示0~11的数字。

另外,在发挥的局部,我们还设计了一个模块来显示双方的局数以与最后的赢家。

实体的设计如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

--引用必要的库函数和包集合

entitypeteis

port(reset:

instd_logic;

clk_1:

instd_logic;

startbutton:

instd_logic;--开始游戏输入端口

serve:

instd_logic_vector(1downto0);--发球输入端口

hit1,hit2:

instd_logic;--甲和乙的击球输入端口

light:

outstd_logic_vector(1to8);--控制8个发光二极管的输出端口

speaker:

outstd_logic;

counta,countb:

outstd_logic_vector(3downto0));--2个用于控制4个7段译码器的输出端口

endpete;

 

状态机设置了7个状态,分别是等待发球状态〔waitserve〕、第一盏灯亮状态〔light1on〕、第八盏灯亮状态〔light8on〕、球向乙移动状态〔ballmoveto2〕、球向甲移动状态〔ballmoveto1〕、允许甲击球状态〔allow1hit〕和允许乙击球状态〔allow2hit〕。

状态waitserve,light1on,ballmoveto2,allow2hit,light8on,ballmoveto1和allow1hit代表的具体数值依次是0到6.在波形模拟图中是用数值来表示状态的。

乒乓球游戏机中有四个计数器count1,count2,count3,count4分别记忆甲的得分和乙的得分,甲方赢的局数和乙方赢的局数;一个i信号,用它的数值来控制状态机外8个发光二极管的亮和暗,比如当i=1时表示第一个发光二极管亮,用发光二级管的轮流发光表示球的移动轨迹。

输入状态机的信号有游戏开关startbutton信号,它是1位二进制信号,数值为1表示可以进入游戏;serve信号,是一个2位二进制向量,“01〞表示甲发球;两个二进制信号hit1和hit2分别表示甲乙是否击球,假如数值为1,表示击球,不为1表示不击球。

以下是状态机进程代码。

p1:

process(clk_1)--状态机进程--clk_1作为敏感信号触发进程

begin--进程开始

ifreset='1'then--异步置位

i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";

elsifclk_1'eventandclk_1='1'then--当处于时钟inclock上升沿时

if((count1>"1010")and(count2<(count1-1)))then

i<=0;count1<="0000";count2<="0000";count3<=count3+1;

elsif((count2>"1010")and(count1<(count2-1)))then

i<=0;count1<="0000";count2<="0000";count4<=count4+1;

elsifstartbutton='0'then

i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000";

else--以下case语句是程序中最关键的状态机局部

casestateis

whenwaitserve=>--进程处于等待发球状态

caseserveis

when"01"=>i<=1;state<=light1on;c<='0';

when"10"=>i<=8;state<=light8on;c<='0';

when"11"=>i<=0;c<='0';

whenothers=>i<=0;c<='0';

endcase;

whenlight1on=>--进程处于第一盏灯亮状态

i<=2;

ifhit2='1'then

i<=0;

count1<=count1+1;c<='1';state<=waitserve;

else

c<='0';state<=ballmoveto2;

endif;

whenlight8on=>--进程处于第八盏灯亮状态

i<=7;

ifhit1='1'then

i<=0;

count2<=count2+1;c<='1';state<=waitserve;

else

c<='0';state<=ballmoveto1;

endif;

whenballmoveto1=>--进程处于球向乙移动状态

ifhit1='1'then

i<=0;

count2<=count2+1;c<='1';state<=waitserve;

elsifi=2theni<=1;c<='0';

state<=allow1hit;

elsei<=i-1;

endif;

whenballmoveto2=>--进程处于球向乙移动状态

ifhit2='1'then

i<=0;

count1<=count1+1;c<='1';state<=waitserve;

elsifi=7theni<=8;c<='0';

state<=allow2hit;

elsei<=i+1;

endif;

whenallow1hit=>--进程处于允许甲击球状态

ifhit1='1'theni<=2;c<='0';

state<=ballmoveto2;

elsecount2<=count2+1;i<=0;c<='1';

state<=waitserve;

endif;

whenallow2hit=>--进程处于允许乙击球状态

ifhit2='1'theni<=7;c<='0';state<=ballmoveto1;

elsecount1<=count1+1;i<=0;c<='1';

state<=waitserve;

endif;

endcase;

endif;

endif;

endprocessp1;

counta<=count1;countb<=count2;--进程处i信号控制发光二极管的亮暗

3.3构造体的设计

这里的设定能使得灯正常的移动:

代码如下:

p2:

process(i)

begin

caseiis

when8=>

light<="10000000";

when(7)=>

light<="01000000";

when(6)=>

light<="00100000";

when(5)=>

light<="00010000";

when(4)=>

light<="00001000";

when(3)=>

light<="00000100";

when

(2)=>

light<="00000010";

when

(1)=>

light<="00000001";

whenothers=>

light<="00000000";--其他情况所有发光二极管都暗

endcase;

endprocessp2;

该构造体紧跟在实体设计之后,这样就完成了数字乒乓游戏机的VHDL源程序编写。

从构造体设计中可以看到,控制整个乒乓球游戏机运转的就是状态机进程,它对各个外围局部起控制作用。

它是整个程序的核心,起到一个中心控制器的作用。

而外围的局部,比如分数显示,球的轨迹,都是通过状态机传出的信号来控制,这就是状态机的功能和作用。

程序中的球的轨迹,即发光二极管的亮暗是通过状态机中传出的i信号来控制的,而分数显示如此是通过状态机中传出的count1和count2信号来控制的。

而状态机中i信号和count1,count2信号的变化同时就可以影响到外围的显示局部——发光二极管和数码管,从而表现出当时的乒乓球位置和双方分数情况。

这个核心模块的封装图:

 

实验要求中,我们可以根据乒乓球比赛规如此增进设计的完善,发挥局部如下:

1.我们增加了双方比赛中的局数现实;

2.在发球时我们可以主动的决定发球方向;

3.我们设定了一个数码管来直接输出双方在这次比赛中的胜负〔即在该数码管就可以直观的看出谁胜谁负〕;

4.我们根据正规比赛中的规如此,在判定局数时特别是在比数为11:

10时对于判定准如此进展了修改,使得双方的比数必须为12:

10,才能获得该局的胜利。

该段代码如下:

if((counta>"1001")and(countb>"1001"))then

ifcounta=(countb+2)thencount3<=count3+1;

elsifcountb=(counta+2)thencount4<=count4+1;

endif;

endif;

当然为了不影响11:

9时的比赛判定之前的代码也是修改为:

ifreset='1'thencount3<="0000";count4<="0000";

elsif((counta>"1010")and(countb<(counta-1)))then

count3<=count3+1;

elsif((countb>"1010")and(counta<(countb-1)))then

count4<=count4+1;

endif;

最后,这是这个模块的全体代码:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

--引用必要的库函数和包集合

entitysumis

port(reset:

instd_logic;

clk_1:

instd_logic;

counta:

instd_logic_vector(3downto0);

countb:

instd_logic_vector(3downto0);

countc,countd,winer:

outstd_logic_vector(3downto0));--2个用于控制4个7段译码器的输出端口

endsum;

architecturetwoofsumis

signalcount3,count4:

std_logic_vector(3downto0):

="0000";

signalwin:

std_logic_vector(3downto0):

="0000";

begin

process(clk_1)

begin

ifclk_1'eventandclk_1='1'then

ifreset='1'thencount3<="0000";count4<="0000";

elsif((counta>"1010")and(countb<(counta-1)))then

count3<=count3+1;

elsif((countb>"1010")and(counta<(countb-1)))then

count4<=count4+1;

endif;

if((counta>"1001")and(countb>"1001"))then

ifcounta=(countb+2)thencount3<=count3+1;

elsifcountb=(counta+2)thencount4<=count4+1;

endif;

endif;

endif;

countc<=count3;countd<=count4;

endprocess;

process(clk_1)

begin

ifclk_1'eventandclk_1='1'then

ifcount3="0011"thenwin<="1010";

elsifcount4="0011"thenwin<="1011";

elsewin<="0000";

endif;

endif;

winer<=win;

endprocess;

endtwo;

其中,winer是胜负输出口,直接输出a,b可以更加直观的看出是谁的胜利;

countc为甲方的局数,countd为乙方的局数。

以下为最后生成的模块:

 

 

3.5最后的整体模块和管脚锁定

原理图:

管脚锁定:

3.6编译和波形仿真

〔1〕如下图所示代表乙发球,由light端口输出的高电平会驱动芯片以外的发光二极管使之点亮,这样就可以通过发光二极管模拟乒乓球的运动轨迹。

可以看到,在乙方发球后,甲方在球网提前击球,如此乙方加一分,即countb=1。

以下为波形图形:

 

以light为球轨迹的信号,以下为该情况下球的运行轨迹:

〔2〕如下图是在甲方发球以后,甲子正确时刻击球的波形仿真图。

乙在允许甲击球状态的时候击球了,在图上hit2在此时刻出现高电平,看到state转移了状态2〔ballmoveto2,球向乙移动状态〕当到了状态3〔allow2hit,允许乙击球状态〕乙没有击球,所以乙得分了,countb由0变到1,数码管也显示出相应的变化:

 

以下为球在该情况下的运动轨迹:

 

〔3〕如下图所示代表乙发球,由light端口输出的高电平会驱动芯片以外的发光二极管使之点亮,这样就可以通过发光二极管模拟乒乓球的运动轨迹。

可以看到,在甲该击球的时候没有击球,也就是hit1在state状态6〔allow1hit,允许甲击球状态〕的时候没有高电平‘1’输入,如此算乙得分,countb由0变到1,之后state回到状态0〔waitserve,等待发球状态〕。

从最后一行state值的变化,可以清楚地分析状态转移:

 

以下为该情况下的球运行轨迹:

 

(4)以下为我们设计的创新局部波形仿真:

当甲方与乙方的分数比为12:

10时,甲方获得该局的胜利,即countc=1:

 

当甲方与乙方的分数比为10:

10时,不符合比赛规如此,如此没人比赛局数上加一:

 

当甲方与乙方的分数为11:

10,11:

11时的波形仿真:

最后,我们做出了对于一个比赛的模拟,其中包括提前击球甲方获得一局比赛的胜利,一方获得一局比赛的胜利,和我们设定的比赛分数为10:

10时的情况,以与最后由一方获得三局比赛输出最终的胜利者。

该模拟图形在下方:

 

本次的实验是由我们三人共同完成,但在合作的过程中我们也分工明确。

吴胜辉同学和黄琳同学主要负责对核心模块进展生成、编译和仿真,许晓明同学主要负责对发挥局部的考虑。

完毕语

在这个设计中,初步表现了状态机的中心控制作用。

通过状态机进程传出的信号,驱动了发光二极管以与七段译码器等外围设备。

状态机进程传出的i信号,控制了发光二极管的状态,状态机进程传出的count1和count2信号,控制了七段译码器的显示。

如果要用实际电路来实现乒乓球游戏机,就还要将设计下载到芯片中去,并且加上外围电路,这些外围电路包括按键等,即便如此,上面的设计还是不够的,还存在两个问题,一个是时钟频率问题,一个是按键问题,但由于时间与能力有限,就没做太多的深入探讨,但在以后的学习生活中我们仍会对此类问题继续加以研究分析。

参考文献:

[1]赵建领.51系列单片机开发宝典[M].:

电子工业,2007.

[2]中国电子网..21ic..

[3]电子电路图网..dzz..

[4]XX:

.baidu.

 

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

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1