版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、32.數(shù)字電路與邏輯設(shè)計實驗實驗報告姓 名:xxx班 級:xxxxxxxx學 號:xxxxxxxx一、設(shè)計課題的任務(wù)要求 兩人乒乓球游戲機是以8*8點陣作為場地,中間的6*6共36個點作為球臺,最外圍的一圈點作為球拍移動的軌道,并通過數(shù)碼管顯示雙方的局數(shù)和比分。雙方個通過3個按鈕控制球拍的上下移動及發(fā)球(場上無球時)。球接觸到球拍后會自動改變方向和速度(在一定范圍內(nèi))。當球在甲方的半場移動出球臺范圍后,乙方得分,然后重新發(fā)球。直到達到規(guī)定比分后,比賽結(jié)束。(1) 以8*8點陣作為場地,中間的6*6共36個點作為球臺,最外圍的一圈點作為球拍移動的軌道,通過兩個按鍵控制球拍的移動;(2) 球的移動
2、速度:在x,y方向上均為0.2s/點0.6s/點(可為0),會在擊球時按一定規(guī)則自動改變;(3) 通過按鈕移動球拍,球拍不能移出自己的半場(8*4);(4) 球出界后,自動判定得分,球從球場中消失,等待下一次發(fā)球;(5) 用數(shù)碼管顯示局數(shù)和比分,參考正式比賽規(guī)則,采用7局4勝制:當一方得分超過11分,并超過對方兩分時,本局比賽結(jié)束,當一方率先贏得4局時,比賽結(jié)束,此時數(shù)碼管保持最終比分。(6) 按下復(fù)位鍵,比分清零,雙方重新開始比賽;(7) 雙方按乒乓球比賽規(guī)則獲得發(fā)球權(quán),沒有發(fā)球權(quán)的一方,發(fā)球開關(guān)無效。二、系統(tǒng)設(shè)計1、設(shè)計思路用x,y兩坐標表示8*8點的每個點。分別用一組信號表示球和兩球拍的
3、坐標,以及球的移動速度。以一定周期(0.1s),改變球的坐標,以達到移動球的目的,用一組信號(xm、ym)記錄球經(jīng)過幾個周期(0.1s)在想x或y方向上移動一個點,通過改變這兩個信號的大小,即可控制球移動的速度和方向。球拍的移動由按鈕控制,鑒于球拍只在最外圈移動,只需要上下兩個按鈕即可。當球拍在y方向上移動到邊緣時,會自動轉(zhuǎn)為在x方向上移動。球拍長度為3個點,只需記錄中間點的位置即可。當球與球拍接觸時(球的坐標與球拍中心的坐標在x,y兩個方向的差均不大于1),根據(jù)球與球拍中心的相對位置,改變xm、ym,從而將球擊回。當球位于邊緣部分時,自動更新比分,并將球的坐標更改為特殊值(x=0),使球在臺
4、面上消失。此時發(fā)球按鈕生效,按下發(fā)球按鈕后,會將球的坐標及球速按一定規(guī)則重置,球再次開始移動。當比分符合一定規(guī)則時,將自動清零,并更新局數(shù),有一方局數(shù)為4時,時分頻器不再提供時鐘信號。所有功能停止,系統(tǒng)保持在最后狀態(tài),直到復(fù)位。系統(tǒng)時鐘為50mhz,通過兩級分頻器分別產(chǎn)生1khz和10hz的時鐘信號供各模塊使用。數(shù)碼管和8*8點鐘使用1khz的時鐘信號,以掃描方式輸出,其中球拍和球臺與球在不同周期交替顯示,以簡化系統(tǒng)。1khz的時鐘信號同時用于按鍵防抖動。10hz時鐘信號用于球的坐標更新以及出界、擊球等狀態(tài)的判定。2、總體框圖3、分塊設(shè)計圖4、流程圖注:圖中梯形表示按鍵輸入5、狀態(tài)轉(zhuǎn)移圖三、波
5、形仿真及波形分析1、分頻器 本設(shè)計中用到1000hz和10hz的時鐘信號,采用兩級分頻器,由50mhz的主時鐘信號產(chǎn)生。分頻器1:輸入50mhz時鐘信號,產(chǎn)生1000hz時鐘信號(占空比為調(diào)節(jié),為1/50000)分頻器2:輸入1000hz時鐘信號(分頻器1產(chǎn)生),產(chǎn)生10hz時鐘信號(占空比為調(diào)節(jié),為1/100)2、球拍移動 本模塊集成了按鍵防抖動功能。lf為向上移動,ri為向下移動,reset重置;1、2表示兩名球員。球拍(racket)的坐標(rx1,ry1為球拍1的橫縱坐標,rx2,ry2為球拍2的橫縱坐標)表示其位置。球拍在8*8場地的最外圈移動,卻不會超出各自半場。reset鍵按下時
6、,坐標復(fù)位3、球臺顯示 根據(jù)輸入的球坐標(x,y)球拍坐標(racketx,rackety)顯示球,球臺和球拍。row,colg和colr為控制矩陣顯示的輸出,輸出為掃描方式。 特別要指出的是,所有坐標的有效范圍均不超過為1-8(特別的x為0不顯示球),而球拍只能在8*8矩陣的最外圍顯示。波形中超出此范圍的賦值不予考慮。4、數(shù)碼管輸出 數(shù)碼管采用掃描輸出,cat1-6(共陰極)分別對應(yīng),球員1的局數(shù)(innings1),比分的十位、個位(score11,score10),球員2比分的十位、個位(score21,score20),局數(shù)(innings2)。app為數(shù)碼管輸出,cat為共陰極,0電
7、平選通。5、球移動 由于情況過多,顧不采用枚舉法,而通過仿真依次驗證其功能。 發(fā)球后球在兩板的中間點間反彈,速度逐漸上升(范圍0-5,到達5后不再上升)racketx、y分別為板的橫縱坐標,xmo、ymo為兩方向上的移動速度,球的坐標以xmo、ymo為速度,按一定周期改變。xo、yo為球的橫縱坐標。球從板的邊緣反彈后,會改變y方向上的速度,達到最外圈(本例中為x=8)后判斷為出界,x設(shè)為0以記錄球在場外,等待下一次發(fā)球交換發(fā)球權(quán):發(fā)球時,將球的坐標設(shè)置在板的中間點之前(x=racketx1+1或racketx2-1,y=rackety1或y2),按乒乓球比賽規(guī)則,發(fā)兩次球后交換發(fā)球權(quán)(此時另一
8、方的發(fā)球鍵無效)開局時,只有player1有發(fā)球權(quán)。此為第三次發(fā)球,為player2發(fā)球。6、計分模塊當球在球臺最外圍(x,y中有至少一個等于1或8)時判斷為出界,并自動更改比分,按乒乓球比賽規(guī)則,得分率先超過11分,切高于對方2分時,贏得一局。如始終無法超出對方2分,則率先得到21分者贏得本局。贏得四局后比賽結(jié)束。系統(tǒng)停止在最后狀態(tài)(保持比分),知道按下reset鍵后方重新運行。score11、score21為十位,score10、score20為個位,innings1、2為局數(shù)取值范圍x為0到8,y為1到8。超過這個范圍的情況不予考慮。贏得4局后系統(tǒng)停止,等待reset復(fù)位。注:1、上述5
9、、球移動和6、計分模塊因多次仿真,故無法提供直接可用的波形文件,如需仿真,請在:報告分塊仿真 下找到相應(yīng)的工程自行按上圖設(shè)置仿真條件并仿真,以上波形圖均為作者如此仿真操作后生成。2、因本設(shè)計較為復(fù)雜,采用總體仿真難以設(shè)計全面的仿真條件(要考慮球在臺上的各種反彈情況),同時也無法直觀地觀察實驗結(jié)果以及檢查程序中出現(xiàn)的問題(輸出為數(shù)碼管以及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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度大理石石材行業(yè)知識產(chǎn)權(quán)保護合同12篇
- 2024年高風險項目利息支付借款協(xié)議3篇
- 2024蔬菜種子研發(fā)與推廣合作協(xié)議范本3篇
- 2024版維修改造施工合同
- 二零二五年度高壓開關(guān)設(shè)備采購及調(diào)試合同
- 二零二五年電力公司運維檢修人員勞動合同范本3篇
- 2025年度核電站設(shè)備安裝施工合同協(xié)議3篇
- 二零二五年度醫(yī)療設(shè)備租賃與維修一體化服務(wù)合同3篇
- 2025年度新型電子商務(wù)平臺安全協(xié)議應(yīng)用指南合同3篇
- 2024聘用至退休合同續(xù)簽書:醫(yī)療行業(yè)專家續(xù)聘6篇
- 第二章 運營管理戰(zhàn)略
- 《三本白皮書》全文內(nèi)容及應(yīng)知應(yīng)會知識點
- 專題14 思想方法專題:線段與角計算中的思想方法壓軸題四種模型全攻略(解析版)
- 醫(yī)院外來器械及植入物管理制度(4篇)
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 港口與港口工程概論
- 《念珠菌感染的治療》課件
- 門店裝修設(shè)計手冊
- 新概念英語第二冊考評試卷含答案(第49-56課)
- 商業(yè)倫理與企業(yè)社會責任(山東財經(jīng)大學)智慧樹知到期末考試答案章節(jié)答案2024年山東財經(jīng)大學
- 【奧運會獎牌榜預(yù)測建模實證探析12000字(論文)】
評論
0/150
提交評論