二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx

上传人:b****5 文档编号:16537149 上传时间:2022-11-24 格式:DOCX 页数:32 大小:801.10KB
下载 相关 举报
二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx_第1页
第1页 / 共32页
二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx_第2页
第2页 / 共32页
二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx_第3页
第3页 / 共32页
二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx_第4页
第4页 / 共32页
二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx

《二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx(32页珍藏版)》请在冰豆网上搜索。

二维乒乓球数字电路与逻辑设计实验报告VHDLWord文档下载推荐.docx

当球位于边缘部分时,自动更新比分,并将球的坐标更改为特殊值(x=0),使球在台面上消失。

此时发球按钮生效,按下发球按钮后,会将球的坐标及球速按一定规则重置,球再次开始移动。

当比分符合一定规则时,将自动清零,并更新局数,有一方局数为4时,时分频器不再提供时钟信号。

所有功能停止,系统保持在最后状态,直到复位。

系统时钟为50MHz,通过两级分频器分别产生1kHz和10Hz的时钟信号供各模块使用。

数码管和8*8点钟使用1kHz的时钟信号,以扫描方式输出,其中球拍和球台与球在不同周期交替显示,以简化系统。

1kHz的时钟信号同时用于按键防抖动。

10Hz时钟信号用于球的坐标更新以及出界、击球等状态的判定。

2、总体框图

3、分块设计图

4、流程图

注:

图中梯形表示按键输入

5、状态转移图

三、波形仿真及波形分析

1、分频器

本设计中用到1000Hz和10Hz的时钟信号,采用两级分频器,由50MHz的主时钟信号产生。

分频器1:

输入50MHz时钟信号,产生1000Hz时钟信号(占空比为调节,为150000)

分频器2:

输入1000Hz时钟信号(分频器1产生),产生10Hz时钟信号(占空比为调节,为1100)

2、球拍移动

本模块集成了按键防抖动功能。

lf为向上移动,ri为向下移动,reset重置;

1、2表示两名球员。

球拍(racket)的坐标(rx1,ry1为球拍1的横纵坐标,rx2,ry2为球拍2的横纵坐标)表示其位置。

球拍在8*8场地的最外圈移动,却不会超出各自半场。

Reset键按下时,坐标复位

3、球台显示

根据输入的球坐标(x,y)球拍坐标(racketx,rackety)显示球,球台和球拍。

row,colg和colr为控制矩阵显示的输出,输出为扫描方式。

特别要指出的是,所有坐标的有效范围均不超过为1-8(特别的x为0不显示球),而球拍只能在8*8矩阵的最外围显示。

波形中超出此范围的赋值不予考虑。

4、数码管输出

数码管采用扫描输出,cat1-6(共阴极)分别对应,球员1的局数(innings1),比分的十位、个位(score11,score10),球员2比分的十位、个位(score21,score20),局数(innings2)。

app为数码管输出,cat为共阴极,0电平选通。

5、球移动

由于情况过多,顾不采用枚举法,而通过仿真依次验证其功能。

发球后球在两板的中间点间反弹,速度逐渐上升(范围0-5,到达5后不再上升)racketx、y分别为板的横纵坐标,xmo、ymo为两方向上的移动速度,球的坐标以xmo、ymo为速度,按一定周期改变。

xo、yo为球的横纵坐标。

球从板的边缘反弹后,会改变y方向上的速度,达到最外圈(本例中为x=8)后判断为出界,x设为0以记录球在场外,等待下一次发球

交换发球权:

发球时,将球的坐标设置在板的中间点之前(x=racketx1+1或racketx2-1,y=rackety1或y2),按乒乓球比赛规则,发两次球后交换发球权(此时另一方的发球键无效)

开局时,只有player1有发球权。

此为第三次发球,为player2发球。

6、计分模块

当球在球台最外围(x,y中有至少一个等于1或8)时判断为出界,并自动更改比分,按乒乓球比赛规则,得分率先超过11分,切高于对方2分时,赢得一局。

如始终无法超出对方2分,则率先得到21分者赢得本局。

赢得四局后比赛结束。

系统停止在最后状态(保持比分),知道按下reset键后方重新运行。

score11、score21为十位,score10、score20为个位,innings1、2为局数

取值范围x为0到8,y为1到8。

超过这个范围的情况不予考虑。

赢得4局后系统停止,等待reset复位。

1、上述5、球移动和6、计分模块因多次仿真,故无法提供直接可用的波形文件,如需仿真,请在:

报告\分块仿真下找到相应的工程自行按上图设置仿真条件并仿真,以上波形图均为作者如此仿真操作后生成。

2、因本设计较为复杂,采用总体仿真难以设计全面的仿真条件(要考虑球在台上的各种反弹情况),同时也无法直观地观察实验结果以及检查程序中出现的问题(输出为数码管以及8*8点阵的坐标,并且为扫描输出方式,不以观察),故在各模块仿真正确的情况下,不再进行整体仿真

四、源程序

--

--filename:

table_tennis

--author:

ShenKewei

--time:

libraryieee;

useieee.std_logic_1164.all;

entitytable_tennisis

port(

lf1,lf2,ri1,ri2,serve1,serve2:

instd_logic;

--1,2:

twoplayer;

lf:

moveleft;

ri:

moveright;

std_logic;

row:

outstd_logic_vector(7downto0);

colg,colr:

outstd_logic_vector(0to7);

--row,colg,colr:

8*8output

cat:

outstd_logic_vector(1to6);

--digitronchioce

aap:

--digitron

clk:

instd_logic);

endtable_tennis;

architectureaoftable_tennisis

signalcl_1000:

std_logic;

--1000Hzclock

signalcl_10:

--10Hzclock

signalx:

integerrange0to8;

signaly:

integerrange1to8;

--x,y:

coordinate

signalxm:

integerrange0to5;

signalym:

--xm,ym:

thelengthballmoveatonceinthedirection

signalxmd,ymd:

integerrange0to1;

--thedirectioninwhichtheballmoves

signalscore10,score11:

integerrange0to9;

signalscore20,score21:

--differentdigitalsofbothplayers'

scores

signalinnings1,innings2:

integerrange0to4;

--players'

innings

signalrackety1,rackety2:

integerrange1to8;

signalracketx1:

integerrange1to4;

signalracketx2:

integerrange5to8;

--rackets'

coordinates

signalserve_flag1,serve_flag2:

integerrange0to2;

--flagoftherighttoserve

signalintegerrange0to9;

signalout1:

outstd_logic_vector(0to7))is--outputofdigitaltubes

begin

casenumis

when0=>

out1<

="

"

;

when1=>

when2=>

when3=>

when4=>

when5=>

when6=>

when7=>

when8=>

when9=>

endcase;

endproceduredig;

p1:

process(clk)

------

--get1000Hzclock

variablecount1:

integerrange1to50000;

ifclk'

eventandclk='

1'

then

ifcount1=50000then

count1:

=1;

cl_1000<

='

else

=count1+1;

0'

endif;

endif;

endprocessp1;

P2:

process(cl_1000)

--get10Hzclock

variablecount2:

integerrange1to100;

ifcl_1000'

eventandcl_1000='

ifcount2=100then

cl_10<

count2:

=count2+1;

endprocessp2;

p3:

--8*8output

variablecount3:

variablecountf:

--flagofwhettoshow

eventandcl_1000='

ifcountf='

then--showthetableandracket

countf:

ifcount3=8then

count3:

=1;

else

=count3+1;

casecount3is--scanning

when1=>

row<

when2=>

when3=>

when4=>

when5=>

when6=>

when7=>

when8=>

endcase;

if(count3=1orcount3=8)then--upsidedownside

colg<

ifrackety1=count3then

caseracketx1is

colr(1to3)<

100"

110"

111"

011"

000"

ifrackety2=count3then

caseracketx2is

colr(4to6)<

001"

colr(1to6)<

000000"

colg(0to7)<

"

if((rackety1=count3andracketx1<

=2)or((rackety1-count3=1orrackety1-count3=-1)andracketx1=1))then--racketofplayer1

colr(0)<

if((rackety2=count3andracketx2>

=7)or((rackety2-count3=1orrackety2-count3=-1)andracketx2=8))then--racketofplayer2

colr(7)<

elsifcountf='

then--showtheball

ify=count3then

colr<

casexis

when0=>

colr<

endprocessp3;

p4:

process(cl_10)

--movetheball

--ifballmoveoutofthetable,renewthescoreandinnings

variablecountx,county:

integerrange0tospeed;

--counters

ifcl_10'

eventandcl_10='

and((innings1=4andinnings2=4)orreset='

)then

ifx=0then

ifxm=0then

ifcountx+xm=6then--theballmovesatxm*0.1seconds

casexmdis

x<

=x-1;

=x+1;

countx:

=0;

else

=countx+1;

elsecountx:

ifym=0then

ifcounty+ym=6then--theballmovesatym*0.1seconds

caseymdis

y<

=y-1;

=y+1;

county:

=county+1;

elsecounty:

ifx=0andserve1='

then--servetheball

ifserve_flag1=0then

=racketx1+1;

y<

=rackety1;

--puttheball

serve_flag2<

=2;

ifx=0andserve2='

then

ifserve_flag2=0then

=racketx2-1;

=rackety2;

serve_flag1<

--renewthexm,ym

--(--plarer1--ballmovesintotheracket

ifrackety1=ythen

xmd<

--ballmovesbackwardsinthedirectionofx

xm<

=xm+1;

--renewthespeed

ifym=speedandym=0then

ym<

=ym+1;

elsifrackety1-y=1then

ymd<

caseymdis

=ym-1;

ifym=speedthenym<

elsifrackety1-y=-1then

elsif(rackety1-y=1orrackety1-y=-1)and(rackety1=1orrackety1=8)andym=0then

ifracketx1-x=-1then

=1-ymd;

ifym=speedthen

elsifracketx1=xthen

elsifx=2andracketx1=1and(rackety1=1andy=2)andym=0then

--plarer2

ifrackety2=ythen

ifym=speedandym=0then

elsifrackety2-y=1then

elsifrackety2-y=-1then

elsif(rackety2-y=1orrackety2-y=-1)and(rackety2=1orrackety2=8)andym=0then

ifracketx2-x=1then

elsifracketx2-x=2then

elsifracketx2=xthen

--outofthetable

--themarkoftime-out

ifscore20=9then

score21<

=score21+

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

当前位置:首页 > 高等教育 > 法学

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

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