二维乒乓球数字电路与逻辑设计实验报告VHDL文档格式.docx
- 文档编号:16783219
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:32
- 大小:801.09KB
二维乒乓球数字电路与逻辑设计实验报告VHDL文档格式.docx
《二维乒乓球数字电路与逻辑设计实验报告VHDL文档格式.docx》由会员分享,可在线阅读,更多相关《二维乒乓球数字电路与逻辑设计实验报告VHDL文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
当球位于边缘部分时,自动更新比分,并将球的坐标更改为特殊值(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+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二维 乒乓球 数字电路 逻辑设计 实验 报告 VHDL