數(shù)電綜合實驗報告-貪吃蛇.docx_第1頁
數(shù)電綜合實驗報告-貪吃蛇.docx_第2頁
數(shù)電綜合實驗報告-貪吃蛇.docx_第3頁
數(shù)電綜合實驗報告-貪吃蛇.docx_第4頁
數(shù)電綜合實驗報告-貪吃蛇.docx_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

北 京 郵 電 大 學 數(shù)電綜合實驗報告實驗名稱: 簡易貪吃蛇游戲機 學 院: 信息與通信工程 姓 名: 班 級: 學 號: 班內序號: 一設計課題的任務要求用一個 88 點陣作為基本顯示屏,4 個連續(xù)移動的的發(fā)光點表示一條蛇,用任意出現(xiàn)的一個亮點表示老鼠,用4 個排成一條線的發(fā)光點表示“墻”,用四個按鍵控制蛇的運動方向,完成貪食蛇游戲,蛇撞“墻”、邊或者游戲時間到,則游戲結束。(1). 老鼠出現(xiàn)的地方是隨機的,在某個地點出現(xiàn)的時間是5秒鐘,如果5秒鐘之內沒有被吃掉,它就會在其它地方隨機出現(xiàn);(2). 用數(shù)碼管顯示得分情況和游戲的剩余時間,每吃掉一只老鼠就加一分。二 系統(tǒng)設計1設計思路 采取模塊化的設計思想,主要分為控制和顯示模塊,控制模塊主要針對各種控制信號進行控制處理,比如蛇的移動,倒計時,方向控制等,而進行控制時,控制圖形的變化的信號有很多,有外部按鍵輸入,內部時鐘驅動,判斷的狀態(tài)也比較多,蛇的位置,老鼠的位置,墻的位置等,在設計過程中將操作“串行化”,即利用高速時鐘將判斷和操作過程分為多個周期完成,簡化設計。而顯示模塊主要完成鼠,蛇,墻以及分數(shù),剩余時間的顯示,而此模塊要獨立于顯示內容,其內容與控制模塊進行修改,這樣使兩個模塊可以獨立地進行工作,具有很好的擴展性和實現(xiàn)性。2. 總體框圖(1)系統(tǒng)機構圖貪吃蛇控制電路游戲初始設置:墻、蛇身、鼠初始化方向控制時間、速度控制剩余時間顯示點陣顯示計分顯示 老鼠位置控制墻4點鼠蛇身4點(2)邏輯流程圖流程圖:Reset 等待按鍵 Start/pause是否按下 否 是計時、計分開始,墻初始化是60秒時間到蛇初始化位置并顯示鼠初始化位置并顯示5秒時間到否否蛇身移動 是 按下一次 再次按下鼠位置重置Start/pause上下左右分數(shù)增加長度增加撞蛇撞邊撞墻吃鼠是是是是否否否否MDS圖:Wait Eating mouseNew mouse Moving Change directionMoving into boundaryReset downMoving into Snake Restart startkey downtimeouTimeout (3)功能模塊圖:計分器點陣顯示顯示存儲器計時器Reset控制模塊控制器分頻器方向控制模塊Start/pause控制模塊 CP3.模塊設計(1)分頻模塊:由于實驗板上的時鐘頻率為50MHZ,相對于電路延時時間來說,頻率太高,故需要分頻將頻率降低來適應器件的反應時間要求;同時用來掃描點陣和數(shù)碼管的頻率與用來控制的時鐘信號頻率是不同的,相對而言用來掃描顯示的頻率要相對低一些,用來掃描按鍵和控制的時鐘頻率要低一些,所以此處將50MHZ的頻率分為1MHZ和2KHZ,1MHZ的頻率用來掃描按鍵和進行信號控制,2KHZ用于掃描顯示,在控制模塊中,又進行了二次分頻,用來控制蛇的移動,鼠步的減少,倒計時時間等,不選擇直接在分頻模塊中將所有的所需時鐘頻率全部分出的原因是在不同的進程中可能會對同一控制信號進行修改,所以這樣就會出現(xiàn)多重驅動的問題,然而在進程內部進行二次分頻就可以避免出現(xiàn)這種情況。(2)游戲控制模塊: 這部分又可細分為四個小的模塊:蛇狀態(tài)判斷模塊,鼠隨機產(chǎn)生模塊,方向控制模塊,蛇移動及時間控制模塊。1. 蛇狀態(tài)判斷模塊:主要完成對蛇“死”“活”狀態(tài)的修改,而產(chǎn)生狀態(tài)變化的情況有:按下reset鍵,改變開始暫停鍵的狀態(tài),蛇撞墻,總計是時間到,以及游戲通關(即游戲總得分為3分即為通關),而這些情況中reset鍵的優(yōu)先級最高,當按下reset鍵時蛇的狀態(tài)都會被置為“死(0)”的狀態(tài),而當“start/pause”鍵狀態(tài)為“1”的話蛇的狀態(tài)將會被置成“活(1)”,蛇撞墻,總時間到,通關都會將蛇的狀態(tài)置為“死(0)”。2. 鼠隨機產(chǎn)生模塊:這部分主要完成產(chǎn)生新的老鼠坐標,思路是利用兩個不同模值的計數(shù)器,分別對8取模,獲得0到7之間的兩個數(shù)作為新老鼠的橫縱坐標,同時對產(chǎn)生的新左邊進行判斷,當和墻的坐標重合時進行修正,此處是將橫坐標減一。而新老鼠的產(chǎn)生時刻是總計是時間到,鼠被吃掉,或蛇走十步后,剛開始是把這一部分單獨作為一個線程,但是后來由于對鼠的產(chǎn)生標志信號的控制不是很好處理,所以這部分只是負責產(chǎn)生下次新老鼠的位置坐標,而真正的賦值操作在對蛇的控制狀態(tài)線程里面。3. 方向控制模塊:主要對控制蛇移動方向的信號進行修改,敏感信號為reset鍵和按鍵掃描時鐘,但reset鍵的優(yōu)先級較高,當reset鍵按下時,方向控制信號將會被設置成默認的向右,而其他四個方向控制鍵的檢測則是在時鐘信號的驅動下進行,由于按鍵掃描時鐘頻率為1MHZ,相對較高,所以不會有很大的遲鈍感覺。4. 蛇移動和倒計時模塊:由于此處設計的蛇移動時間間隔恰好是一秒,和倒計時的時間間隔一樣,所以將這兩個功能放在了一個進程中,這個進程中同時包含對蛇初始位置,總計時時間,鼠步的初始時間等初始化設置,原因也是為了避免出現(xiàn)雙重驅動的問題。此處的時鐘信號為1MHZ,在此線程內部進行了二次分頻將其分為1HZ,用來控制蛇的移動以及時間計數(shù),在1HZ時鐘的驅動下進行剩余時間,剩余鼠步,以及蛇位置坐標的修改控制。(3)顯示模塊: 此模塊主要完成鼠,墻,蛇,分數(shù),剩余時間的顯示,因為要同時顯示這幾項,故需要進行動態(tài)掃描,即在某一時間段內只顯示其中一位,程序中用一個模為六的計數(shù)器實現(xiàn)在不同的計數(shù)值下顯示不同的項,分別如下:T=0時,掃描老鼠坐標T=1時,掃描蛇頭坐標和右邊第一個數(shù)碼管為SCORE顯示T=2時,掃描蛇身2坐標T=3時,掃描蛇身3坐標和左邊第一個數(shù)碼管為總計時高位計時顯示T=4時,掃描蛇身4坐標。T=5時,掃描墻的坐標和左邊第四個數(shù)碼管為總計時的低位計時顯示 功能說明:1.游戲初始化:按下reset(btn0)鍵,會對鼠的位置,蛇的位置以及默認移動方向,游戲總時間進行初始化設置,此時分數(shù)顯示為零,時間為六十秒。 2.游戲開始和暫停:當初始化之后將sw0撥上去即為開始游戲,撥下來即為暫停,暫停后蛇,鼠的位置保持不變,分數(shù)時間保持不變,再次將sw0撥回去即可繼續(xù)游戲。 3.方向控制:btn7,btn6,btn5,btn4分別對應著上下左右四個方向。 4.當蛇撞墻時,蛇死,游戲重啟。 5.當游戲總時間到時,游戲重啟。 6.當老鼠十秒后沒有被吃掉將會出現(xiàn)在別的地方。 7.當老鼠被蛇吃掉后將會出現(xiàn)新的老鼠,并且分數(shù)將會加一分。 8.當吃鼠分數(shù)達到三分時,點陣將會全亮,分數(shù)固定顯示,剩余時間位熄滅,表示游戲通關,按下reset鍵可重新開始游戲。三仿真波形及波形分析仿真時的clk_kscan頻率為clk_sscan的2倍,clk_kscan的內部分頻比為1:100.(1)按下reset鍵后鼠,蛇的位置初始化Start=0,故蛇的位置沒有變墻位置蛇初始位置鼠初始位置(2)蛇的位置右移蛇的位置向右移動Start=1(3)分數(shù)和時間的初始化顯示初始化時間高位6初始化時間地位0初始化分數(shù)0(4)在仿真波形的設置中曾將direction設為“1000”,故蛇的移動方向變?yōu)橄蛏?,同時也可觀察新老鼠的產(chǎn)生蛇向上移動產(chǎn)生新的鼠的坐標(5)在游戲過程中再次按按下reset鍵將會重啟游戲再次復位后蛇鼠坐標重置(6)總得計時時間的變化剩余時間減一四源程序(1)分頻模塊library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div is port(clk:in std_logic; clk_s,clk_k:out std_logic); end entity; architecture div_a of div is signal counter_sscan:integer range 0 to 24999; -分頻得2khz時鐘 signal counter_kscan:integer range 0 to 49; -分頻得1mhz時鐘begin div_sscan1:process(clk) begin if clkevent and clk=1 then if counter_sscan=24999 then counter_sscan=0; else counter_sscan=counter_sscan+1; end if; end if; end process div_sscan1;div_sscan2:process(counter_sscan) begin if counter_sscan12499 then -占空比為50% clk_s=1; else clk_s=0; end if; end process div_sscan2; div_kscan1:process(clk) begin if clkevent and clk=1 then if counter_kscan=49 then counter_kscan=0; else counter_kscan=counter_kscan+1; end if ; end if; end process div_kscan1;div_kscan2:process(counter_kscan) begin if counter_kscan25 then clk_k=1; else clk_kclkk,clk_s=clk_sscan,clk_k=clk_kscan);-端口映射 wx=5;wy0=5;wy1=4;wy2=3;wy3=2; decide:process(clk_kscan,reset) begin if reset=1 then -檢測reset鍵 state=0; score=0; moux=3;mouy=4; elsif clk_kscanevent and clk_kscan=1 then if start=1 then state=1; -檢測start/pause鍵 end if; if counter_move=1499999 then -內分頻,所得頻率為一秒(實際分頻-時若果計數(shù)器的值按照理值去設置所得的時鐘頻率明顯快于一秒,故此處將計-數(shù)模值加大為原來的1.5倍) if time_flag=0 then -剩余時間為零 state=0; if mouxx=wx and(mouyy=wy0 or mouyy=wy1 or mouyy=wy2 or mouyy=wy3) then -判斷下個要產(chǎn)生老鼠的位置是否與墻重合 moux=mouxx-1; else moux=mouxx; -進行新老鼠位置的賦值 end if; mouy=mouyy;elsif (sx0=wx and(sy0=wy0 or sy0=wy1 or sy0=wy2 or sy0=wy3) then -蛇撞墻 state=0; if mouxx=wx and(mouyy=wy0 or mouyy=wy1 or mouyy=wy2 or mouyy=wy3) then moux=mouxx-1; else moux=mouxx; end if; mouy=mouyy; end if; if mousetime=0 then -老鼠剩余時間為零 if (mouxx=wx and(mouyy=wy0 or mouyy=wy1 or mouyy=wy2 or mouyy=wy3) then moux=mouxx-1; else moux=mouxx; end if; mouy=mouyy; end if; if sx0=moux and sy0=mouy then -老鼠被吃掉,分數(shù)加一 score=score+1; if (mouxx=wx and(mouyy=wy0 or mouyy=wy1 or mouyy=wy2 or mouyy=wy3) then moux=mouxx-1; else moux=mouxx; end if; mouy=mouyy; end if; if score=3 then -得分為3分時游戲通關 state=0; end if; end if; end if; end process decide;random:process(clk_kscan) - 用于產(chǎn)生隨機老鼠的進程 begin if clk_kscanevent and clk_kscan=1 then if mcx=100 then mcx=0; else mcx=mcx+1; end if; if mcy=200 then mcy=0; else mcy=mcy+1; end if; mouxx=mcx rem 8; -產(chǎn)生0到7的老鼠的坐標 mouyy=mcy rem 8; end if; end process random; dirc:process(clk_kscan,reset) -方向控制進程 begin if reset=1 then -reset鍵檢測 temp_turnif temp_turn/=2 then temp_turnif temp_turn/=0 then temp_turnif temp_turn/=1 then temp_turnif temp_turn/=3 then temp_turn temp_turn=temp_turn; end case; end if;end process dirc; move:process(clk_kscan,state) begin if state=0then -蛇死后游戲時間,老鼠時間,蛇位置的重置 mousetime=9; timeh=6;timel=0; sx0=3;sy0=0;sx1=2;sy1=0; sx2=1;sy2=0;sx3=0;sy3=0; time_flag=1; -將初始剩余時間標志設為1 elsif clk_kscanevent and clk_kscan=1 then if state=1 and start=1 then -開始鍵為一時才開始移動 if counter_move=1499999 then if mousetime=0 then -老鼠時間的控制 mousetime=9; else mousetime=mousetime-1; end if; if timel=0 and timeh/=0 then -總游戲剩余時間的控制 timel=9; timeh=timeh-1; time_flag=1; elsif timel=0 and timeh=0 then time_flag=0; else timel=timel-1; time_flagif sy0=7 then sy0=sy0-7; else sy0if sy0=0 then sy0=sy0+7; else sy0if sx0=7 then sx0=sx0-7; else sx0if sx0=0 then sx0=sx0+7; else sx0=sx0-1; end if; end case; sx1=sx0; sy1=sy0; sx2=sx1; sy2=sy1; sx3=sx2; sy3=sy2; if sx0=moux and sy0=mouy then -蛇吃鼠后鼠剩余時間的重置 mousetime=9; end if; counter_move=0; else counter_move=counter_move+1; -內分頻計數(shù)器加一 end if; end if; end if; end process move; show:process(clk_sscan) -數(shù)碼管和點陣掃描顯示進程 begin if clk_sscanevent and clk_sscan=1 then row=11111111; -將所有的行置1,列置0(新實驗-板的列為1,行為0時點被點亮) col=00000000; if temp_show=5 then temp_show=0; else temp_show=temp_show+1; end if; if score=3 then -得分為三時保留分數(shù)顯示,使點陣全亮 col=11111111; row=00000000; temp_light=score; w_light col(moux)=1;row(mouy)=0; -顯示老鼠坐標 temp_light=score; w_light col(sx0)=1;row(sy0)=0; -顯示蛇頭坐標和得分 w_light col(sx1)=1;row(sy1)=0; -顯示蛇身第二個坐標 temp_light=timeh; w_light col(sx2)=1;row(sy2)=0; -顯示蛇身第三個坐標和時間的高位 w_light col(sx3)=1;row(sy3)=0; -顯示蛇身的第四個坐標 temp_light=timel; w_lightcol(wx)=1;row(wy0)=0; -顯示時間的低位和墻的位置 w_light=101111; row(wy1)=0; row(wy2)=0; row(wy3)d_lightd_lightd_lightd_lightd_lightd_lightd_lightd_lightd_lightd_lightd_light=0000000; end case; end if; end process lightshow; end tancs_a;五元器件清單和資源利用情況 1.元器件系統(tǒng)時鐘:CLK重啟按鍵RESET:BTN0開始/暫停按鍵:SW0方向控制鍵:BTN7,BTN6,BTN5,BTN4點陣行顯示:ROW0ROW7點陣列顯示:COL0COL7數(shù)碼管的段選:AA,AB,AC,AD,AE,AF,AG數(shù)碼管的位選信號:CAT0-CAT52.資源利用情況六故障及問題分析1.在對整個系統(tǒng)的模塊進行劃分的時候,沒能正確的應用硬件思想來進行規(guī)劃,而只是簡單地將其劃分為幾個獨立的模塊,沒能顧及各種控制信號的之間的聯(lián)系,只是想當然的將其在某種情況下進行修改,但是實際上vhdl是不支持不同進程以及不同時鐘沿下對同一信號進行修改的,所以后來將程序寫完之后又重新進行了大規(guī)模的合并和修改,浪費了很多時間。2.對于時序電路的工作機制不是特別熟悉,然后最初決定需要分出幾個頻率以及決定頻率的大小的時候有點不知所措,后來經(jīng)過一次次實驗和比較,最終采取了分出兩個頻率,再進一步內分頻的模式,其實這樣做不是很好,這也是由于前面的模塊劃分不是那么清楚明確而導致的,在以后的學習工作中應盡量避免出現(xiàn)這樣的情況。3.對于上電時的初始化問題,最初設想是能夠讓系統(tǒng)一上電就能使用,而不是一定要先按下reset鍵之后才能繼續(xù)往下,但是這一問題到最后也沒能解決,因為對于硬件電路來說,他沒有一個固定的執(zhí)行起點,許多操作都是并行執(zhí)行的,而且那些控制信號的值剛開始是不確定的,所以后來還是選擇了用按鍵實現(xiàn)初始化操作,這一問題是否有好的解決方法還有待于進一步研究。4.蛇移動時的撞墻問題,最初的計劃是打算讓蛇碰到邊界就會死掉,但還來經(jīng)過多次測試總是存在問題,最后改為蛇移動到邊上后還可以從另外一邊穿出,不過最后的形式也是經(jīng)過了很長時間的摸索才最終實現(xiàn)的,最大的收獲就是對信號賦值的理解更深入了一步,信號賦值總是在進程結束時才進行,而且并不像軟件中的順序賦值,所以當你要將你修改過的信號作為一個判斷條件時要特別小心,很容易出現(xiàn)差錯。5.實現(xiàn)倒計時計數(shù)值不按照順序遞減,也即在進行if,else請款判斷時沒有將所有的情況考慮到,這樣會產(chǎn)生時間的跳變,后來增加了時間控制標志位,很好的解決了這一問題。6.吃到老鼠后不加分,這個問題也很讓人頭疼,因為覺得程序里面的判斷語句沒有什么邏輯錯誤,而就是不能實現(xiàn)預期的功能,后來經(jīng)過認真分析應該是與判斷語句存放的位置有關,最后將加分這一操作從原來的move進程移到decide這一進程中,解決了這一問題。7.當老鼠時間到后產(chǎn)生新老鼠時,點陣上會閃的很厲害,一會后才會確定老鼠的位置,后來發(fā)現(xiàn)主要產(chǎn)生原因是兩個進程之間時的同步問題,因為在move進程中對蛇頭坐標修改后,當下一個時鐘到來前,若蛇頭坐標跟老鼠坐標重合時,在decide進程時鐘驅動下(剛開始設置的頻率比控制蛇移動的時鐘頻率高很多)會進行多次判斷,只要滿足蛇頭坐標等于老鼠坐標即會改變老鼠的位置,所以會出現(xiàn)老鼠的位置不斷變化的情況,而當蛇移動一步后就不滿足此條件,鼠的坐標就不會改變了,后來將產(chǎn)生新老鼠的進程和蛇移動的進程時鐘同步起來就解決了這一問題。8.方向鍵的選擇,實驗過程中對于采用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論