基于VHDL的乒乓球設(shè)計.doc
《基于VHDL的乒乓球設(shè)計.doc》由會員分享,可在線閱讀,更多相關(guān)《基于VHDL的乒乓球設(shè)計.doc(19頁珍藏版)》請在裝配圖網(wǎng)上搜索。
課程報告 設(shè)計課題: 乒乓球游戲的FPGA實現(xiàn) 姓 名: 黃琳 吳勝輝 許曉明 專 業(yè): 電子信息工程 學 號: 1115108018 1115106047 1115106052 日 期 2013 年11月25 日——2013 年 12 月1 日 指導教師: 傅 文 淵 華僑大學信息科學與工程學院電子工程系 目錄 1 項目名稱、內(nèi)容與要求 ………………………………………02頁 1.1 項目名稱…………………………………………………02頁 1.2 設(shè)計內(nèi)容…………………………………………………02頁 1.3 具體要求…………………………………………………02頁 2 系統(tǒng)整體架構(gòu) …………………………………………………02頁 2.1 設(shè)計原理…………………………………………………02頁 2.2 設(shè)計思路…………………………………………………03頁 3 系統(tǒng)設(shè)計………………………………………………………03頁 3.1乒乓球游戲機實體的設(shè)計………………………………03頁 3.2狀態(tài)機編程實現(xiàn)……………………………………… 04頁 3.3構(gòu)造體的設(shè)計……………………………………………07頁 3.4發(fā)揮部分……………………………………………… 08頁 3.5最后的整體模塊和管腳鎖定……………………………10頁 3.6編譯和波形仿真…………………………………………10頁 3.7分工說明…………………………………………………15頁 4 結(jié)束語…………………………………………………………15頁 參考書目…………………………………………………………16頁 一、 項目名稱、內(nèi)容與要求 1.1項目名稱 乒乓球游戲的FPGA實現(xiàn) 1.2設(shè)計內(nèi)容 設(shè)計一個由甲乙雙方參賽,二人乒乓球游戲機。 用8個LED排成一條直線,以中點為界,兩邊各代表參賽雙方的位置,其中一只點亮的LED指示球的當前位置,點亮的LED依次從左到右,或從右到左。 當“球”(點亮的那只LED)運動到某方的最后一位時,參賽者應(yīng)能果斷地按下位于自己一方的按鈕開關(guān),即表示啟動球拍擊球,若擊中,則球向相反方向運動,則對方得一分,同時蜂鳴器自動響起。 設(shè)置自動記分電路,甲乙雙方各用一位數(shù)碼管進行記分顯示,每計滿11分為1局。 1.3具體要求 (1)使用乒乓球游戲機的雙方在不同位置發(fā)球或擊球。 (2)乒乓球的位置和移動方向由燈亮和依次亮的方向決定。使用者根據(jù)球的位置發(fā)出相應(yīng)的動作。 (3)比賽用11分為一局來進行,雙方設(shè)置各自的記分牌,任意一方先記滿11分就獲勝此局。當記分牌清零后,開始新的一局比賽。 (4)(發(fā)揮部分)完善以上設(shè)計,使之更加符合乒乓球運動的各項規(guī)則。 二、系統(tǒng)整體架構(gòu) 2.1設(shè)計原理 兩人乒乓球游戲機是用8個發(fā)光二極管代表乒乓球臺,中間兩個發(fā)光二極管兼做乒乓球網(wǎng),用點亮的發(fā)光二極管按一定方向移動來表示球的運動。在游戲機的兩側(cè)各設(shè)置發(fā)球和擊球開關(guān),甲乙雙方按乒乓球比賽規(guī)則來操作開關(guān)。當甲方按動發(fā)球開關(guān)時,靠近甲方的第一個發(fā)光二極管亮,然后發(fā)光二極管由甲方向乙方依次點亮,代表乒乓球的移動。當球過網(wǎng)后按照設(shè)計者規(guī)定的球位乙方就可以擊球。若乙方提前擊球或者未擊到球,則甲方得分。然后重新發(fā)球進行比賽,知道一方記分達到11分為止,記分清零,重新開始新一局比賽。 2.2設(shè)計思路 根據(jù)系統(tǒng)設(shè)計的要求,乒乓球比賽游戲機的電路原理框圖如下: 三、系統(tǒng)設(shè)計 3.1乒乓球游戲機實體的設(shè)計 設(shè)計該乒乓球游戲機的輸入/輸出端口。首先考慮輸入端口,一般都應(yīng)該設(shè)置一個異步置位端口reset,用于在系統(tǒng)不正常時回到初始狀態(tài);一個發(fā)球輸入端serve,邏輯‘1’代表開始發(fā)球的指令;兩個擊球輸入端hit1和hit2,邏輯‘1’分別表示甲擊球和乙擊球;一個開始游戲按鈕startbutton,處于邏輯‘1’表示可以游戲;還得有一個時鐘輸入端口clk。 其次考慮輸出端口,芯片應(yīng)該有8個輸出端口來控制8個發(fā)光二極管,輸出邏輯‘1’即輸出一個高電平,可以使發(fā)光二極管點亮;另外,要直觀地表示雙方的得分,就得用到數(shù)碼管,每方用到1個,可以表示0~11的數(shù)字。另外,在發(fā)揮的部分,我們還設(shè)計了一個模塊來顯示雙方的局數(shù)以及最后的贏家。 實體的設(shè)計如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --引用必要的庫函數(shù)和包集合 entity compete is port(reset:in std_logic; clk_1:in std_logic; startbutton:in std_logic; --開始游戲輸入端口 serve:in std_logic_vector(1 downto 0); --發(fā)球輸入端口 hit1,hit2:in std_logic; --甲和乙的擊球輸入端口 light:out std_logic_vector(1 to 8); --控制8個發(fā)光二極管的輸出端口 speaker : out std_logic ; counta,countb:out std_logic_vector(3 downto 0)); --2個用于控制4個7段譯碼器的輸出端口 end compete; 3.2狀態(tài)機編程實現(xiàn) 狀態(tài)機設(shè)置了7個狀態(tài),分別是等待發(fā)球狀態(tài)(waitserve)、第一盞燈亮狀態(tài)(light1on)、第八盞燈亮狀態(tài)(light8on)、球向乙移動狀態(tài)(ballmoveto2)、球向甲移動狀態(tài)(ballmoveto1)、允許甲擊球狀態(tài)(allow1hit)和允許乙擊球狀態(tài)(allow2hit)。 狀態(tài)waitserve,light1on,ballmoveto2,allow2hit,light8on,ballmoveto1和allow1hit代表的具體數(shù)值依次是0到6.在波形模擬圖中是用數(shù)值來表示狀態(tài)的。 乒乓球游戲機中有四個計數(shù)器count1,count2,count3,count4分別記憶甲的得分和乙的得分,甲方贏的局數(shù)和乙方贏的局數(shù);一個i信號,用它的數(shù)值來控制狀態(tài)機外8個發(fā)光二極管的亮和暗,比如當i=1時表示第一個發(fā)光二極管亮,用發(fā)光二級管的輪流發(fā)光表示球的移動軌跡。 輸入狀態(tài)機的信號有游戲開關(guān)startbutton信號,它是1位二進制信號,數(shù)值為1表示可以進入游戲;serve信號,是一個2位二進制向量,“01”表示甲發(fā)球;兩個二進制信號hit1和hit2分別表示甲乙是否擊球,若數(shù)值為1,表示擊球,不為1表示不擊球。 以下是狀態(tài)機進程代碼。 p1: process(clk_1) --狀態(tài)機進程 --clk_1作為敏感信號觸發(fā)進程 begin --進程開始 if reset=1 then --異步置位 i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000"; elsif clk_1event and clk_1=1 then --當處于時鐘inclock上升沿時 if ((count1>"1010")and(count2<(count1-1))) then i<=0;count1<="0000";count2<="0000";count3<=count3+1; elsif ((count2>"1010")and(count1<(count2-1))) then i<=0;count1<="0000";count2<="0000";count4<=count4+1; elsif startbutton=0 then i<=0;count1<="0000";count2<="0000";count3<="0000";count4<="0000"; else --以下case語句是程序中最關(guān)鍵的狀態(tài)機部分 case state is when waitserve=> --進程處于等待發(fā)球狀態(tài) case serve is when "01"=> i<=1;state<=light1on;c<=0; when "10"=> i<=8;state<=light8on;c<=0; when "11"=>i<=0;c<=0; when others=> i<=0;c<=0; end case; when light1on=> --進程處于第一盞燈亮狀態(tài) i<=2; if hit2=1 then i<=0; count1<=count1+1;c<=1;state<=waitserve; else c<=0;state<=ballmoveto2; end if; when light8on=> --進程處于第八盞燈亮狀態(tài) i<=7; if hit1=1 then i<=0; count2<=count2+1;c<=1;state<=waitserve; else c<=0;state<=ballmoveto1; end if; when ballmoveto1=> --進程處于球向乙移動狀態(tài) if hit1=1 then i<=0; count2<=count2+1;c<=1;state<=waitserve; elsif i=2 then i<=1;c<=0; state<=allow1hit; else i<=i-1; end if; when ballmoveto2=> --進程處于球向乙移動狀態(tài) if hit2=1then i<=0; count1<=count1+1;c<=1;state<=waitserve; elsif i=7 then i<=8;c<=0; state<=allow2hit; else i<=i+1; end if; when allow1hit=> --進程處于允許甲擊球狀態(tài) if hit1=1 then i<=2;c<=0; state<=ballmoveto2; else count2<=count2+1;i<=0;c<=1; state<=waitserve; end if; when allow2hit=> --進程處于允許乙擊球狀態(tài) if hit2=1then i<=7;c<=0;state<=ballmoveto1; else count1<=count1+1;i<=0;c<=1; state<=waitserve; end if; end case; end if; end if; end process p1; counta<=count1;countb<=count2; --進程處i信號控制發(fā)光二極管的亮暗 3.3構(gòu)造體的設(shè)計 這里的設(shè)定能使得燈正常的移動: 代碼如下: p2:process(i) begin case i is when 8=> light<="10000000"; when(7)=> light<= "01000000"; when(6)=> light<= "00100000"; when(5)=> light<= "00010000"; when(4)=> light<= "00001000"; when(3)=> light<="00000100" ; when(2)=> light<="00000010"; when(1)=> light<="00000001" ; when others=> light<="00000000"; --其他情況所有發(fā)光二極管都暗 end case; end process p2; 該構(gòu)造體緊跟在實體設(shè)計之后,這樣就完成了數(shù)字乒乓游戲機的VHDL源程序編寫。從構(gòu)造體設(shè)計中可以看到,控制整個乒乓球游戲機運轉(zhuǎn)的就是狀態(tài)機進程,它對各個外圍部分起控制作用。它是整個程序的核心,起到一個中心控制器的作用。而外圍的部分,比如分數(shù)顯示,球的軌跡,都是通過狀態(tài)機傳出的信號來控制,這就是狀態(tài)機的功能和作用。程序中的球的軌跡,即發(fā)光二極管的亮暗是通過狀態(tài)機中傳出的i信號來控制的,而分數(shù)顯示則是通過狀態(tài)機中傳出的count1和count2信號來控制的。而狀態(tài)機中i信號和count1,count2信號的變化同時就可以影響到外圍的顯示部分——發(fā)光二極管和數(shù)碼管,從而表現(xiàn)出當時的乒乓球位置和雙方分數(shù)情況。這個核心模塊的封裝圖: 3.4發(fā)揮部分 實驗要求中,我們可以根據(jù)乒乓球比賽規(guī)則增進設(shè)計的完善,發(fā)揮部分如下: 1. 我們增加了雙方比賽中的局數(shù)現(xiàn)實; 2. 在發(fā)球時我們可以主動的決定發(fā)球方向; 3. 我們設(shè)定了一個數(shù)碼管來直接輸出雙方在這次比賽中的勝負(即在該數(shù)碼管就可以直觀的看出誰勝誰負); 4. 我們根據(jù)正規(guī)比賽中的規(guī)則,在判定局數(shù)時特別是在比數(shù)為11:10時對于判定準則進行了修改,使得雙方的比數(shù)必須為12:10,才能獲得該局的勝利。該段代碼如下: if ((counta>"1001")and (countb>"1001")) then if counta=(countb+2) then count3<=count3+1; elsif countb=(counta+2) then count4<=count4+1; end if; end if; 當然為了不影響11:9時的比賽判定之前的代碼也是修改為: if reset=1 then count3<="0000";count4<="0000"; elsif ((counta>"1010")and(countb<(counta-1))) then count3<=count3+1; elsif ((countb>"1010")and(counta<(countb-1))) then count4<=count4+1; end if; 最后,這是這個模塊的全體代碼: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; --引用必要的庫函數(shù)和包集合 entity sum is port( reset:in std_logic; clk_1:in std_logic; counta:in std_logic_vector(3 downto 0); countb:in std_logic_vector(3 downto 0); countc,countd,winer:out std_logic_vector(3 downto 0)); --2個用于控制4個7段譯碼器的輸出端口 end sum; architecture two of sum is signal count3,count4:std_logic_vector(3 downto 0):="0000"; signal win:std_logic_vector(3 downto 0):="0000"; begin process(clk_1) begin if clk_1event and clk_1=1 then if reset=1 then count3<="0000";count4<="0000"; elsif ((counta>"1010")and(countb<(counta-1))) then count3<=count3+1; elsif ((countb>"1010")and(counta<(countb-1))) then count4<=count4+1; end if; if ((counta>"1001")and (countb>"1001")) then if counta=(countb+2) then count3<=count3+1; elsif countb=(counta+2) then count4<=count4+1; end if; end if; end if; countc<=count3;countd<=count4; end process; process(clk_1) begin if clk_1event and clk_1=1 then if count3="0011" then win<="1010"; elsif count4="0011" then win<="1011"; else win<="0000"; end if; end if; winer<=win; end process; end two; 其中,winer是勝負輸出口,直接輸出a,b可以更加直觀的看出是誰的勝利; countc為甲方的局數(shù),countd為乙方的局數(shù)。以下為最后生成的模塊: 3.5最后的整體模塊和管腳鎖定 原理圖: 管腳鎖定: 3.6編譯和波形仿真 (1)下圖所示代表乙發(fā)球,由light端口輸出的高電平會驅(qū)動芯片以外的發(fā)光二極管使之點亮,這樣就可以通過發(fā)光二極管模擬乒乓球的運動軌跡。可以看到,在乙方發(fā)球后,甲方在球網(wǎng)提前擊球,則乙方加一分,即countb=1。以下為波形圖形: 以light為球軌跡的信號,以下為該情況下球的運行軌跡: (2)下圖是在甲方發(fā)球以后,甲子正確時刻擊球的波形仿真圖。乙在允許甲擊球狀態(tài)的時候擊球了,在圖上hit2在此時刻出現(xiàn)高電平,看到state轉(zhuǎn)移了狀態(tài)2(ballmoveto2,球向乙移動狀態(tài))當?shù)搅藸顟B(tài)3(allow2hit,允許乙擊球狀態(tài))乙沒有擊球,所以乙得分了,countb由0變到1,數(shù)碼管也顯示出相應(yīng)的變化: 以下為球在該情況下的運動軌跡: (3)下圖所示代表乙發(fā)球,由light端口輸出的高電平會驅(qū)動芯片以外的發(fā)光二極管使之點亮,這樣就可以通過發(fā)光二極管模擬乒乓球的運動軌跡??梢钥吹?,在甲該擊球的時候沒有擊球,也就是hit1在state狀態(tài)6(allow1hit,允許甲擊球狀態(tài))的時候沒有高電平‘1’輸入,則算乙得分,countb由0變到1,之后state回到狀態(tài)0(waitserve,等待發(fā)球狀態(tài))。從最后一行state值的變化,可以清楚地分析狀態(tài)轉(zhuǎn)移: 以下為該情況下的球運行軌跡: (4)以下為我們設(shè)計的創(chuàng)新部分波形仿真: 當甲方與乙方的分數(shù)比為12:10時,甲方獲得該局的勝利,即countc=1: 當甲方與乙方的分數(shù)比為10:10時,不符合比賽規(guī)則,則沒人比賽局數(shù)上加一: 當甲方與乙方的分數(shù)為11:10,11:11時的波形仿真: 最后,我們做出了對于一個比賽的模擬,其中包括提前擊球甲方獲得一局比賽的勝利,一方獲得一局比賽的勝利,和我們設(shè)定的比賽分數(shù)為10:10時的情況,以及最后由一方獲得三局比賽輸出最終的勝利者。該模擬圖形在下方: 3.7分工說明 本次的實驗是由我們?nèi)斯餐瓿?,但在合作的過程中我們也分工明確。吳勝輝同學和黃琳同學主要負責對核心模塊進行生成、編譯和仿真,許曉明同學主要負責對發(fā)揮部分的考慮。 結(jié)束語 在這個設(shè)計中,初步體現(xiàn)了狀態(tài)機的中心控制作用。通過狀態(tài)機進程傳出的信號,驅(qū)動了發(fā)光二極管以及七段譯碼器等外圍設(shè)備。狀態(tài)機進程傳出的i信號,控制了發(fā)光二極管的狀態(tài),狀態(tài)機進程傳出的count1和count2信號,控制了七段譯碼器的顯示。如果要用實際電路來實現(xiàn)乒乓球游戲機,就還要將設(shè)計下載到芯片中去,并且加上外圍電路,這些外圍電路包括按鍵等,即便如此,上面的設(shè)計還是不夠的,還存在兩個問題,一個是時鐘頻率問題,一個是按鍵問題,但由于時間及能力有限,就沒做太多的深入探討,但在以后的學習生活中我們?nèi)詴Υ祟悊栴}繼續(xù)加以研究分析。 參考文獻: [1] 趙建領(lǐng). 51系列單片機開發(fā)寶典[M]. 北京: 電子工業(yè)出版社, 2007. [2] 中國電子網(wǎng). http://www.21ic.com. [3] 電子電路圖網(wǎng). http://www.cndzz.com. [4] 百度:http://www.baidu.com- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 基于 VHDL 乒乓球 設(shè)計
鏈接地址:http://ioszen.com/p-6682965.html