版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、32.数字电路与逻辑设计实验实验报告姓 名:xxx班 级:xxxxxxxx学 号:xxxxxxxx一、设计课题的任务要求 两人乒乓球游戏机是以8*8点阵作为场地,中间的6*6共36个点作为球台,最外围的一圈点作为球拍移动的轨道,并通过数码管显示双方的局数和比分。双方个通过3个按钮控制球拍的上下移动及发球(场上无球时)。球接触到球拍后会自动改变方向和速度(在一定范围内)。当球在甲方的半场移动出球台范围后,乙方得分,然后重新发球。直到达到规定比分后,比赛结束。(1) 以8*8点阵作为场地,中间的6*6共36个点作为球台,最外围的一圈点作为球拍移动的轨道,通过两个按键控制球拍的移动;(2) 球的移动
2、速度:在x,y方向上均为0.2s/点0.6s/点(可为0),会在击球时按一定规则自动改变;(3) 通过按钮移动球拍,球拍不能移出自己的半场(8*4);(4) 球出界后,自动判定得分,球从球场中消失,等待下一次发球;(5) 用数码管显示局数和比分,参考正式比赛规则,采用7局4胜制:当一方得分超过11分,并超过对方两分时,本局比赛结束,当一方率先赢得4局时,比赛结束,此时数码管保持最终比分。(6) 按下复位键,比分清零,双方重新开始比赛;(7) 双方按乒乓球比赛规则获得发球权,没有发球权的一方,发球开关无效。二、系统设计1、设计思路用x,y两坐标表示8*8点的每个点。分别用一组信号表示球和两球拍的
3、坐标,以及球的移动速度。以一定周期(0.1s),改变球的坐标,以达到移动球的目的,用一组信号(xm、ym)记录球经过几个周期(0.1s)在想x或y方向上移动一个点,通过改变这两个信号的大小,即可控制球移动的速度和方向。球拍的移动由按钮控制,鉴于球拍只在最外圈移动,只需要上下两个按钮即可。当球拍在y方向上移动到边缘时,会自动转为在x方向上移动。球拍长度为3个点,只需记录中间点的位置即可。当球与球拍接触时(球的坐标与球拍中心的坐标在x,y两个方向的差均不大于1),根据球与球拍中心的相对位置,改变xm、ym,从而将球击回。当球位于边缘部分时,自动更新比分,并将球的坐标更改为特殊值(x=0),使球在台
4、面上消失。此时发球按钮生效,按下发球按钮后,会将球的坐标及球速按一定规则重置,球再次开始移动。当比分符合一定规则时,将自动清零,并更新局数,有一方局数为4时,时分频器不再提供时钟信号。所有功能停止,系统保持在最后状态,直到复位。系统时钟为50mhz,通过两级分频器分别产生1khz和10hz的时钟信号供各模块使用。数码管和8*8点钟使用1khz的时钟信号,以扫描方式输出,其中球拍和球台与球在不同周期交替显示,以简化系统。1khz的时钟信号同时用于按键防抖动。10hz时钟信号用于球的坐标更新以及出界、击球等状态的判定。2、总体框图3、分块设计图4、流程图注:图中梯形表示按键输入5、状态转移图三、波
5、形仿真及波形分析1、分频器 本设计中用到1000hz和10hz的时钟信号,采用两级分频器,由50mhz的主时钟信号产生。分频器1:输入50mhz时钟信号,产生1000hz时钟信号(占空比为调节,为1/50000)分频器2:输入1000hz时钟信号(分频器1产生),产生10hz时钟信号(占空比为调节,为1/100)2、球拍移动 本模块集成了按键防抖动功能。lf为向上移动,ri为向下移动,reset重置;1、2表示两名球员。球拍(racket)的坐标(rx1,ry1为球拍1的横纵坐标,rx2,ry2为球拍2的横纵坐标)表示其位置。球拍在8*8场地的最外圈移动,却不会超出各自半场。reset键按下时
6、,坐标复位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电
7、平选通。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),按乒乓球比赛规则,发两次球后交换发球权(此时另一
8、方的发球键无效)开局时,只有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
9、、球移动和6、计分模块因多次仿真,故无法提供直接可用的波形文件,如需仿真,请在:报告分块仿真 下找到相应的工程自行按上图设置仿真条件并仿真,以上波形图均为作者如此仿真操作后生成。2、因本设计较为复杂,采用总体仿真难以设计全面的仿真条件(要考虑球在台上的各种反弹情况),同时也无法直观地观察实验结果以及检查程序中出现的问题(输出为数码管以及8*8点阵的坐标,并且为扫描输出方式,不以观察),故在各模块仿真正确的情况下,不再进行整体仿真四、源程序-filename : table_tennis-author : shenkewei-time : 2011-10-10-library ieee;use
10、ieee.std_logic_1164.all;entity table_tennis isport(lf1,lf2,ri1,ri2,serve1,serve2 : in std_logic;-1,2 : two player ; lf: move left ; ri :move right ; hit : hit the ball ;reset : in std_logic;row : out std_logic_vector(7 downto 0); colg,colr : out std_logic_vector(0 to 7); - row,colg,colr : 8*8 output
11、cat : out std_logic_vector(1 to 6); -digitron chioceaap : out std_logic_vector(0 to 7); -digitronclk : in std_logic);end table_tennis;architecture a of table_tennis is signal cl_1000: std_logic ; -1000hz clocksignal cl_10 : std_logic ; -10hz clocksignal x : integer range 0 to 8 ;signal y : integer r
12、ange 1 to 8 ; -x,y : coordinatesignal xm : integer range 0 to 5 ;signal ym : integer range 0 to 5 ; -xm,ym:the length ball move at once in the directionsignal xmd ,ymd : integer range 0 to 1 ; -the direction in which the ball movessignal score10,score11 : integer range 0 to 9;signal score20,score21
13、: integer range 0 to 9; -different digitals of both players scoressignal innings1,innings2 : integer range 0 to 4; -players innings signal rackety1,rackety2 : integer range 1 to 8; signal racketx1 : integer range 1 to 4; signal racketx2 : integer range 5 to 8; -racketscoordinatessignal serve_flag1,s
14、erve_flag2 : integer range 0 to 2; -flag of the right to servesignal hit_flag1,hit_flag2 : integer range 0 to 1 ; - right to hitconstant speed : integer := 5 ;procedure dig (signal num: in integer range 0 to 9; signal out1 : out std_logic_vector(0 to 7) is -output of digital tubesbegincase num iswhe
15、n 0 = out1 out1 out1 out1 out1 out1 out1 out1 out1 out1 =11100110;end case;end procedure dig;beginp1 : process(clk)-get 1000hz clock-variable count1 : integer range 1 to 50000 ; beginif clkevent and clk =1 then if count1=50000 then count1 := 1; cl_1000=1; else count1 :=count1+1; cl_1000=0; end if; e
16、nd if; end process p1;p2 : process(cl_1000)-get 10hz clock-variable count2 : integer range 1 to 100 ; beginif cl_1000event and cl_1000 =1 then if count2=100 then cl_10 =1; count2 := 1; else cl_10 row row row row row row row row =01111111; end case; if (count3=1 or count3=8) then -upside/downside col
17、g colr(1 to 3) colr(1 to 3) colr(1 to 3) colr(1 to 3) =011; end case; else colr(1 to 3) colr(4 to 6) colr(4 to 6) colr(4 to 6) colr(4 to 6) =001; end case; else colr(4 to 6) =000; end if; else colr(1 to 6)=000000; colg(0 to 7)=01111110; end if; if (rackety1=count3 and racketx1=2) or (rackety1-count3
18、=1 or rackety1-count3=-1) and racketx1=1) then -racket of player1 colr(0) =1; else colr(0) =7) or (rackety2-count3=1 or rackety2-count3=-1) and racketx2=8) then -racket of player2 colr(7) =1; else colr(7) =0; end if; elsif countf=0 then -show the ball countf:=1; if y/=count3 then colr colr colr colr
19、 colr colr colr colr colr colr x x y y=y+1;end case;county:=0;else county:=county+1;end if;else county:=0;end if;end if; if x=0 and serve1=1 then -serve the ball if serve_flag1/=0 then x=racketx1+1;y=rackety1; -put the ball hit_flag1=0;hit_flag2=1; -give right to hit xmd=1;xm=1;ym=0; -reset the spee
20、d serve_flag1=serve_flag1-1; if serve_flag1=1 then serve_flag2=2; end if; end if; end if; if x=0 and serve2=1 then if serve_flag2/=0 then x=racketx2-1;y=rackety2; hit_flag1=1;hit_flag2=0; xmd=0;xm=1;ym=0; serve_flag2=serve_flag2-1; if serve_flag2=1 then serve_flag1=2 and rackety1=7 and x=2 then - ba
21、ll moves into the racket if rackety1=y then xmd=1; - ball moves backwards in the direction of x hit_flag1=0; hit_flag2=1; - change the right to hit if xm/=speed then xm=xm+1; -renew the speed end if; if ym/=speed and ym/=0 then ym=ym+1; end if; elsif rackety1-y=1 then xmd=1; hit_flag1=0; hit_flag2=1
22、; if ym=0 then ym=1; ymd ym if ym/=speed then ym=ym+1; end if; end case; end if; elsif rackety1-y=-1 then xmd=1; hit_flag1=0; hit_flag2=1; if ym=0 then ym=1; ymd ym if ym/=speed then ym=ym+1; end if; end case; end if; end if; elsif (rackety1-y=1 or rackety1-y=-1) and (rackety1=1 or rackety1=8) and y
23、m /=0 then if racketx1-x=-1 then xmd=1; ymd=1-ymd; hit_flag1=0; hit_flag2=1; if xm/=speed then xm=xm+1; end if; if ym/=speed then ym=ym+1; end if; elsif racketx1=x then xmd=1; ymd=1-ymd; hit_flag1=0; hit_flag2=1; xm=xm-1; elsif racketx1-x=-2 then xmd=1; ymd=1-ymd; hit_flag1=0; hit_flag2=1; if xm/=sp
24、eed then xm=xm+1; end if; end if; elsif x=2 and racketx1=1 and (rackety1=1 and y=2) and ym=0 then xmd=1; ymd=1; hit_flag1=0; hit_flag2=1; ym=1; elsif x=2 and racketx1=1 and (y=7 and rackety1=8) and ym=0 then xmd=1; ymd=0; hit_flag1=0; hit_flag2=1; ym=2 and rackety2=7 and x=7 then if rackety2=y then
25、xmd=0; hit_flag1=1; hit_flag2=0; if xm/=speed then xm=xm+1; end if; if ym/=speed and ym/=0 then ym=ym+1; end if; elsif rackety2-y=1 then xmd=0; hit_flag1=1; hit_flag2=0; if ym=0 then ym=1; ymd ym if ym/=speed then ym=ym+1; end if; end case; end if; elsif rackety2-y=-1 then xmd=0; hit_flag1=1; hit_fl
26、ag2=0; if ym=0 then ym=1; ymd ym if ym/=speed then ym=ym+1; end if; end case; end if; end if; elsif (rackety2-y=1 or rackety2-y=-1) and (rackety2=1 or rackety2=8) and ym/=0 then if racketx2-x=1 then xmd=0; ymd=1-ymd; hit_flag1=1; hit_flag2=0; if xm/=speed then xm=xm+1; end if; if ym/=speed then ym=y
27、m+1; end if; elsif racketx2-x=2 then xmd=0; ymd=1-ymd; hit_flag1=1; hit_flag2=0; if xm/=speed then xm=xm+1; end if; elsif racketx2=x then xmd=0; ymd=1-ymd; hit_flag1=1; hit_flag2=0; xm=xm-1; end if; elsif x=7 and racketx2=8 and (rackety2=1 and y=2) and ym=0 then xmd=0; ymd=1; hit_flag1=1; hit_flag2=
28、0; ym=1; elsif x=7 and racketx2=8 and (y=7 and rackety2=8) and ym=0 then xmd=0; ymd=0; hit_flag1=1; hit_flag2=0; ym=1; end if; end if; if x=1 then - out of the table x=0; - the mark of time-out if score20=9 then score21=score21+1; score20=0; else score20=score20+1; end if; elsif x=8 then x=0; if sco
29、re10=9 then score11=score11+1; score10=0; else score10=score10+1; end if; elsif (y=1 or y=8) and x/=0 then x=0; if x=4 then if score20=9 then score21=score21+1; score20=0; else score20=score20+1; end if; else if score10=9 then score11=score11+1; score10=0; else score10=score10+1; end if; end if;end
30、if;if score11=2 or (score11=1 and score10=1 and score21=0) or (score11=1 and score21=1 and score10-score20=2) then -get one inning if innings1+innings2=0 or innings1+innings2=2 or innings1+innings2=4 or innings1+innings2=6 then - reset the right to serve serve_flag2=2; serve_flag1=0; else serve_flag
31、1=2; serve_flag2=0; end if; innings1=innings1+1; score11=0; score10=0; score21=0; score20=0;elsif score21=2 or (score21=1 and score20=1 and score11=0) or (score11=1 and score21=1 and score20-score10=2) then if innings1+innings2=0 or innings1+innings2=2 or innings1+innings2=4 or innings1+innings2=6 t
32、hen serve_flag2=2; serve_flag1=0; else serve_flag1=2; serve_flag2=0; end if; innings2=innings2+1; score11=0; score10=0; score21=0; score20=0;end if; if reset=1 then -reset score11=0; score10=0; score21=0; score20=0; innings1=0; innings2=0; x=0; serve_flag1=2; serve_flag250 then if ctu_1=1000 then ct
33、u_1:=0; else ctu_1:=ctu_1+1; end if; else ctu1:=0; ctu_1:=0; end if; if ctu150 and ctu_150 then - deicde the input of button if rackety1/=8 and racketx1=1 then -move the racket rackety1=rackety1+1; elsif rackety1=8 and racketx1/=4 then racketx1=racketx1+1; elsif rackety1=1 then racketx150 then if ctu_2=1000 then ctu_2:=0; else ctu_2:=ctu_2+1; end if; else ctu2:=0; ctu_2:=0; end if; if ctu250 and ctu_250 then if rackety2/=8 and racketx2=8 then rackety2=rackety2+1; elsif racketx2/=5 and rackety2=8 then racketx2=racketx2-1; elsif rac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国腮红行业投资前景及策略咨询研究报告
- 2024年绞股蓝苦茶项目可行性研究报告
- 2025至2030年中国净化单元行业投资前景及策略咨询研究报告
- 化工课程设计课题
- 小班树枝自然课程设计
- 2024年度外贸实习报告市场反馈与分析合同3篇
- 2024年度液体化学品运输合同风险评估报告范本3篇
- 湖南省邵阳市洞口县第九中学2025届高三六校第一次联考英语试卷含解析
- 山东省五莲县2025届高三第一次调研测试数学试卷含解析
- 山西省古县、离石区、高县2025届高考临考冲刺英语试卷含解析
- 【MOOC】油气地质与勘探-中国石油大学(华东) 中国大学慕课MOOC答案
- 山东省济南市2023-2024学年高一上学期1月期末考试 物理 含答案
- 管理咨询服务实施方案
- 2024二十届三中全会知识竞赛题库及答案
- 成人重症患者人工气道湿化护理专家共识 解读
- 机器学习(山东联盟)智慧树知到期末考试答案章节答案2024年山东财经大学
- 科研设计及研究生论文撰写智慧树知到期末考试答案章节答案2024年浙江中医药大学
- 商业伦理与企业社会责任(山东财经大学)智慧树知到期末考试答案章节答案2024年山东财经大学
- 2024年辅警招聘考试试题库及完整答案(全优)
- 2024年江苏省普通高中学业水平测试小高考生物、地理、历史、政治试卷及答案(综合版)
- 《孟子》精读学习通章节答案期末考试题库2023年
评论
0/150
提交评论