您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 二维乒乓球——数字电路与逻辑设计实验报告(VHDL)
11.数字电路与逻辑设计实验实验报告姓名:XXX班级:xxxxxxxx学号:xxxxxxxx22一、设计课题的任务要求两人乒乓球游戏机是以8*8点阵作为场地,中间的6*6共36个点作为球台,最外围的一圈点作为球拍移动的轨道,并通过数码管显示双方的局数和比分。双方个通过3个按钮控制球拍的上下移动及发球(场上无球时)。球接触到球拍后会自动改变方向和速度(在一定范围内)。当球在甲方的半场移动出球台范围后,乙方得分,然后重新发球。直到达到规定比分后,比赛结束。(1)以8*8点阵作为场地,中间的6*6共36个点作为球台,最外围的一圈点作为球拍移动的轨道,通过两个按键控制球拍的移动;(2)球的移动速度:在x,y方向上均为0.2s/点~0.6s/点(可为0),会在击球时按一定规则自动改变;(3)通过按钮移动球拍,球拍不能移出自己的半场(8*4);(4)球出界后,自动判定得分,球从球场中消失,等待下一次发球;(5)用数码管显示局数和比分,参考正式比赛规则,采用7局4胜制:当一方得分超过11分,并超过对方两分时,本局比赛结束,当一方率先赢得4局时,比赛结束,此时数码管保持最终比分。(6)按下复位键,比分清零,双方重新开始比赛;(7)双方按乒乓球比赛规则获得发球权,没有发球权的一方,发球开关无效。33二、系统设计1、设计思路用x,y两坐标表示8*8点的每个点。分别用一组信号表示球和两球拍的坐标,以及球的移动速度。以一定周期(0.1s),改变球的坐标,以达到移动球的目的,用一组信号(xm、ym)记录球经过几个周期(0.1s)在想x或y方向上移动一个点,通过改变这两个信号的大小,即可控制球移动的速度和方向。球拍的移动由按钮控制,鉴于球拍只在最外圈移动,只需要上下两个按钮即可。当球拍在y方向上移动到边缘时,会自动转为在x方向上移动。球拍长度为3个点,只需记录中间点的位置即可。当球与球拍接触时(球的坐标与球拍中心的坐标在x,y两个方向的差均不大于1),根据球与球拍中心的相对位置,改变xm、ym,从而将球击回。当球位于边缘部分时,自动更新比分,并将球的坐标更改为特殊值(x=0),使球在台面上消失。此时发球按钮生效,按下发球按钮后,会将球的坐标及球速按一定规则重置,球再次开始移动。当比分符合一定规则时,将自动清零,并更新局数,有一方局数为4时,时分频器不再提供时钟信号。所有功能停止,系统保持在最后状态,直到复位。系统时钟为50MHz,通过两级分频器分别产生1kHz和10Hz的时钟信号供各模块使用。数码管和8*8点钟使用1kHz的时钟信号,以扫描方式输出,其中球拍和球台与球在不同周期交替显示,以简化系统。1kHz的时钟信号同时用于按键防抖动。10Hz时钟信号用于球的坐标更新以及出界、击球等状态的判定。442、总体框图3、分块设计图554、流程图注:图中梯形表示按键输入5、状态转移图66三、波形仿真及波形分析1、分频器本设计中用到1000Hz和10Hz的时钟信号,采用两级分频器,由50MHz的主时钟信号产生。分频器1:输入50MHz时钟信号,产生1000Hz时钟信号(占空比为调节,为1/50000)77分频器2:输入1000Hz时钟信号(分频器1产生),产生10Hz时钟信号(占空比为调节,为1/100)2、球拍移动本模块集成了按键防抖动功能。lf为向上移动,ri为向下移动,reset重置;1、2表示两名球员。球拍(racket)的坐标(rx1,ry1为球拍1的横纵坐标,rx2,ry2为球拍2的横纵坐标)表示其位置。球拍在8*8场地的最外圈移动,却不会超出各自半场。Reset键按下时,坐标复位883、球台显示根据输入的球坐标(x,y)球拍坐标(racketx,rackety)显示球,球台和球拍。row,colg和colr为控制矩阵显示的输出,输出为扫描方式。特别要指出的是,所有坐标的有效范围均不超过为1-8(特别的x为0不显示球),而球拍只能在8*8矩阵的最外围显示。波形中超出此范围的赋值不予考虑。9910104、数码管输出数码管采用扫描输出,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为球的横纵坐标。1111球从板的边缘反弹后,会改变y方向上的速度,达到最外圈(本例中为x=8)后判断为出界,x设为0以记录球在场外,等待下一次发球交换发球权:发球时,将球的坐标设置在板的中间点之前(x=racketx1+1或racketx2-1,y=rackety1或y2),按乒乓球比赛规则,发两次球后交换发球权(此时另一方的发球键无效)开局时,只有player1有发球权。1212此为第三次发球,为player2发球。6、计分模块当球在球台最外围(x,y中有至少一个等于1或8)时判断为出界,并自动更改比分,按乒乓球比赛规则,得分率先超过11分,切高于对方2分时,赢得一局。如始终无法超出对方2分,则率先得到21分者赢得本局。赢得四局后比赛结束。系统停止在最后状态(保持比分),知道按下reset键后方重新运行。score11、score21为十位,score10、score20为个位,innings1、2为局数取值范围x为0到8,y为1到8。超过这个范围的情况不予考虑。1313赢得4局后系统停止,等待reset复位。注:1、上述5、球移动和6、计分模块因多次仿真,故无法提供直接可用的波形文件,如需仿真,请在:报告\分块仿真下找到相应的工程自行按上图设置仿真条件并仿真,以上波形图均为作者如此仿真操作后生成。14142、因本设计较为复杂,采用总体仿真难以设计全面的仿真条件(要考虑球在台上的各种反弹情况),同时也无法直观地观察实验结果以及检查程序中出现的问题(输出为数码管以及8*8点阵的坐标,并且为扫描输出方式,不以观察),故在各模块仿真正确的情况下,不再进行整体仿真四、源程序----------------------------filename:table_tennis--author:ShenKewei--time:2011-10-10--------------------------libraryieee;useieee.std_logic_1164.all;entitytable_tennisisport(lf1,lf2,ri1,ri2,serve1,serve2:instd_logic;--1,2:twoplayer;lf:moveleft;ri:moveright;hit:hittheball;reset:instd_logic;row:outstd_logic_vector(7downto0);colg,colr:outstd_logic_vector(0to7);--row,colg,colr:8*8outputcat:outstd_logic_vector(1to6);--digitronchioceaap:outstd_logic_vector(0to7);--digitronclk:instd_logic);endtable_tennis;architectureaoftable_tennisissignalcl_1000:std_logic;--1000Hzclocksignalcl_10:std_logic;--10Hzclocksignalx:integerrange0to8;signaly:integerrange1to8;--x,y:coordinatesignalxm:integerrange0to5;signalym:integerrange0to5;--xm,ym:thelengthballmoveatonceinthedirectionsignalxmd,ymd:integerrange0to1;--thedirectioninwhichtheballmovessignalscore10,score11:integerrange0to9;signalscore20,score21:integerrange0to9;--differentdigitalsofbothplayers'scoressignalinnings1,innings2:integerrange0to4;--players'inningssignalrackety1,rackety2:integerrange1to8;signalracketx1:integerrange1to4;signalracketx2:integerrange5to8;--rackets'coordinates1515signalserve_flag1,serve_flag2:integerrange0to2;--flagoftherighttoservesignalhit_flag1,hit_flag2:integerrange0to1;--righttohitconstantspeed:integer:=5;proceduredig(signalnum:inintegerrange0to9;signalout1:outstd_logic_vector(0to7))is--outputofdigitaltubesbegincasenumiswhen0=out1=11111100;when1=out1=01100000;when2=out1=11011010;when3=out1=11110010;when4=out1=01100110;when5=out1=10110110;when6=out1=00111110;when7=out1=11100000;when8=out1=11111110;when9=out1=11100110;endcase;endproceduredig;beginp1:process(clk)--------------------get1000Hzclock------------------variablecount1:integerrange1to50000;beginifclk'eventandclk='1'thenifcount1=50000thencount1:=1;cl_1000='1';elsecount1:=count1+1;cl_1000='0';endif;endif;endprocessp1;P2:process(cl_1000)1616--------------------get10Hzclock------------------variablecount2:integerrange1to100;beginifcl_1000'eventandcl_1000='1'thenifcount2=100thencl_10='1';count2:=1;elsecl_10='0';count2:=count2+1;endif;endif;endprocessp2;p3:process(cl_1000)---------------------8*8output-------------------variablecount3:integerrange1to8;variablecountf:std_logic;--flagofwhettoshowbeginifcl_1000'eventandcl_1000='1'thenifcountf='1'then--showthetableandracketcountf:='0';ifcou
本文标题:二维乒乓球——数字电路与逻辑设计实验报告(VHDL)
链接地址:https://www.777doc.com/doc-4794249 .html