數(shù)電實(shí)驗(yàn)報(bào)告-貪吃蛇-北郵_第1頁
數(shù)電實(shí)驗(yàn)報(bào)告-貪吃蛇-北郵_第2頁
數(shù)電實(shí)驗(yàn)報(bào)告-貪吃蛇-北郵_第3頁
數(shù)電實(shí)驗(yàn)報(bào)告-貪吃蛇-北郵_第4頁
數(shù)電實(shí)驗(yàn)報(bào)告-貪吃蛇-北郵_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2/131/13簡(jiǎn)易貪食蛇游戲機(jī)學(xué)院:信息與通信工程專業(yè):班級(jí):姓名:學(xué)號(hào):班內(nèi)序號(hào):

簡(jiǎn)易貪食蛇游戲機(jī)一.設(shè)計(jì)課題的任務(wù)要求基本任務(wù):用一個(gè)8×8點(diǎn)陣做為基本顯示屏,4個(gè)連續(xù)移動(dòng)的的發(fā)光點(diǎn)表示一條蛇,用任意出現(xiàn)的一個(gè)亮點(diǎn)表示老鼠,用4個(gè)排成一條線的發(fā)光點(diǎn)表示“墻”,用四個(gè)按鍵控制蛇的運(yùn)動(dòng)方向,完成貪食蛇游戲,蛇撞“墻”、邊或者游戲時(shí)間到,則游戲結(jié)束。1.老鼠出現(xiàn)的地方是隨機(jī)的,在某個(gè)地點(diǎn)出現(xiàn)的時(shí)間是5秒鐘,如果5秒鐘之內(nèi)沒有被吃掉,它就會(huì)在其它地方出現(xiàn);2.用數(shù)碼管顯示得分情況和游戲的剩余時(shí)間,每吃掉一只老鼠就加一分;提高要求:1.游戲時(shí)間和速度可以手動(dòng)設(shè)置。2.增加游戲難度或自擬其它功能。二.系統(tǒng)設(shè)計(jì)1.設(shè)計(jì)思路當(dāng)復(fù)位鍵置為1時(shí),8*8點(diǎn)陣也初始化為全不亮,每來一個(gè)時(shí)鐘脈沖就對(duì)8*8點(diǎn)陣進(jìn)行一次掃描,并依次點(diǎn)亮四個(gè)蛇身點(diǎn)、一個(gè)老鼠點(diǎn)、四個(gè)墻點(diǎn),由于掃描頻率遠(yuǎn)遠(yuǎn)超出人眼所能分辨的范圍,故人眼看來蛇身是連續(xù)的。在數(shù)碼管上顯示得分與倒計(jì)時(shí)情況。用四個(gè)按鍵分別控制蛇的運(yùn)動(dòng)方向“上下左右”,每次按鍵時(shí)通過和蛇原來的運(yùn)動(dòng)方向進(jìn)行比較來控制蛇接下來的運(yùn)動(dòng)方向。當(dāng)蛇撞墻、出界、游戲時(shí)間到時(shí)游戲結(jié)束,點(diǎn)陣全亮。每當(dāng)蛇吃到一個(gè)老鼠時(shí)則自動(dòng)加一分并重設(shè)老鼠位置。老鼠存活5秒鐘時(shí)重設(shè)老鼠位置。用M序列發(fā)生器實(shí)現(xiàn)老鼠位置的隨機(jī)變化。2.總體框架圖:點(diǎn)陣顯示顯示存儲(chǔ)器點(diǎn)陣顯示顯示存儲(chǔ)器方向控制模塊方向控制模塊控制器控制器分頻器分頻器計(jì)時(shí)器計(jì)分器計(jì)時(shí)器計(jì)分器復(fù)位開關(guān)方向輸入按鍵3.邏輯劃分框圖數(shù)碼管顯示分?jǐn)?shù)和倒計(jì)時(shí)數(shù)碼管顯示分?jǐn)?shù)和倒計(jì)時(shí)點(diǎn)陣顯示蛇、鼠、墻over,snaker,snakec,shownumratr,ratc控制器控制器控制蛇的運(yùn)動(dòng)、鼠的位置clk3clk2clk1overdir分頻器和輸入方向寄存器分頻器和輸入方向寄存器clearkey外界輸入器復(fù)位鍵和方向輸入鍵外界輸入器復(fù)位鍵和方向輸入鍵4.流程圖6.分塊電路設(shè)計(jì)點(diǎn)陣顯示模塊此模塊采用頻率為1Mhz的時(shí)鐘clk3。每來一個(gè)時(shí)鐘就對(duì)整個(gè)8*8點(diǎn)陣全部掃描一次,當(dāng)某個(gè)點(diǎn)的行為低電平,列為高電平時(shí)被點(diǎn)亮。由于蛇身有4個(gè)移動(dòng)的點(diǎn),墻有4個(gè)固定的點(diǎn)以及一個(gè)老鼠的亮點(diǎn),那么一共有9個(gè)點(diǎn)需要在8*8點(diǎn)陣上顯示。所以我將時(shí)鐘用point分成9個(gè)周期,每個(gè)周期掃描一個(gè)點(diǎn)。clk3頻率很高,雖然是逐點(diǎn)掃描,但由于視覺暫留我們看到的是9個(gè)點(diǎn)同時(shí)亮。當(dāng)復(fù)位信號(hào)clear置為1時(shí),點(diǎn)陣全不亮。當(dāng)結(jié)束信號(hào)over置為1時(shí),點(diǎn)陣全亮。數(shù)碼管顯示模塊當(dāng)一個(gè)數(shù)碼管要穩(wěn)定顯示需要頻率不小于50hz,總共4個(gè)數(shù)碼管,需要采用500hz的時(shí)鐘clk2.用cat信號(hào)對(duì)數(shù)碼管進(jìn)行片選,用seven信號(hào)儲(chǔ)存7個(gè)管腳的電平。共有4個(gè)數(shù)字需要顯示,用數(shù)組shownum儲(chǔ)存分?jǐn)?shù)與游戲時(shí)間。用state變量將時(shí)鐘clk2分成4個(gè)周期,每個(gè)周期顯示state對(duì)應(yīng)的shounum(state)。復(fù)位信號(hào)clear置為1時(shí),數(shù)碼管全不亮。控制器倒記時(shí)和老鼠5秒換位置要分頻出1赫茲的一個(gè)clk1。并且1赫茲的頻率十分適合蛇的移動(dòng),所以我將clk1信號(hào)作為了蛇移動(dòng)的觸發(fā)信號(hào)。復(fù)位信號(hào)clear=1將蛇的位置、方向、老鼠位置、墻的位置、游戲時(shí)間、分?jǐn)?shù)等初始化。蛇身的移動(dòng)。用4個(gè)點(diǎn)表示蛇,從蛇尾開始,依次等于前一個(gè)蛇身點(diǎn)坐標(biāo)。蛇頭的移動(dòng)按照狀態(tài)轉(zhuǎn)移圖編寫程序。實(shí)際編寫時(shí)我將對(duì)出界情況的判斷加了進(jìn)去。給定dir時(shí),若出界,游戲結(jié)束。若否,當(dāng)蛇頭方向direction不和輸入值dir正好相反時(shí),蛇頭步進(jìn),將dir的值賦給蛇頭當(dāng)前方向direction;當(dāng)蛇頭方向direction和輸入值dir正好相反時(shí),若蛇頭出界,游戲結(jié)束,若不出界,蛇頭按照原來的direction方向步進(jìn)。重設(shè)老鼠位置設(shè)置一個(gè)重設(shè)老鼠標(biāo)志setrat。當(dāng)老鼠存活時(shí)間滿5s或蛇吃到老鼠時(shí),將setrat標(biāo)志置為1,否則為0.當(dāng)setrat=1時(shí),用M序列發(fā)生器隨機(jī)重設(shè)老鼠位置。當(dāng)重設(shè)后的老鼠和墻的位置重合時(shí),修改老鼠位置。分頻器和外界輸入方向寄存器EPM1270T144C5數(shù)電實(shí)驗(yàn)開發(fā)板的時(shí)鐘clk頻率為50Mhz??刂破餍枰粋€(gè)頻率為1hz的時(shí)鐘clk1,數(shù)碼管顯示需要一個(gè)頻率為500hz的時(shí)鐘clk2,點(diǎn)陣顯示需要一個(gè)頻率為1Mhz的時(shí)鐘clk3.由于游戲結(jié)束時(shí)只有數(shù)碼管需要保持顯示結(jié)束時(shí)的時(shí)間和分?jǐn)?shù),所以當(dāng)over置為1時(shí),clk1和clk3的分頻器停止,只有clk2的分頻器繼續(xù)工作。外界輸入的方向用key表示,key值為“1000”、“0100”、“0010”、“0001”時(shí)分別表示上、下、左、右。將輸入的方向值賦給dir。dir設(shè)置為兩位二進(jìn)制變量:“00”表示“上”,“01”表示“下”,“10”表示“左”,“11”表示“右”。三.仿真波形及波形分析為方便仿真,將時(shí)鐘clk改為1Mhz,將clk3改為100khz,將點(diǎn)陣顯示、數(shù)碼管顯示的時(shí)鐘頻率都改為clk,將控制模塊顯示的時(shí)鐘改為clk3。1.點(diǎn)陣顯示仿真:如圖所示,當(dāng)clear=1時(shí),點(diǎn)陣的行都為高電平,列都為低電平,點(diǎn)陣全不亮。從clear置為0后clk的第一個(gè)上升沿開始,點(diǎn)陣掃描顯示蛇、鼠、墻。先顯示前四個(gè)蛇點(diǎn)(蛇點(diǎn)初始位置:行為0,1,2,3;列為1),然后顯示鼠,接著顯示四個(gè)墻點(diǎn)(行為3,4,5,6;列為4)。然后重新掃描蛇、鼠、墻。如上圖,over=1時(shí),點(diǎn)陣行都變成低電平,列都變成高電平,點(diǎn)陣全亮。2.數(shù)碼管顯示仿真如圖,clear=1時(shí)數(shù)碼管全不亮。clear置為0后,數(shù)碼管輪流開始顯示shounum數(shù)組中的元素。當(dāng)cat=011111和101111時(shí),分別顯示得分的十位和個(gè)位。由于得分為0,所以這兩個(gè)數(shù)碼管的管腳電平為1111110,即都顯示為0.此時(shí)時(shí)間為59,當(dāng)cat=111101時(shí)顯示游戲時(shí)間的十位,所以該數(shù)碼管的seven值為1011011,即顯示為5.當(dāng)cat=111110時(shí),顯示游戲時(shí)間的個(gè)位9,該數(shù)碼管的seven值為1111011,即顯示為9。從圖中可以看出,當(dāng)游戲時(shí)間為58時(shí),顯示游戲時(shí)間的個(gè)位的cat=111110的數(shù)碼管對(duì)應(yīng)的seven值變?yōu)?111110,即顯示為8.3.控制模塊仿真從圖中可以看到,clear置為1時(shí),蛇的位置被初始化。時(shí)間初始化為59。clear=0后,每個(gè)clk3的上升沿,蛇頭移動(dòng)一步,蛇身分別跟著前一個(gè)點(diǎn)移動(dòng)。當(dāng)游戲進(jìn)行了5秒時(shí),蛇頭到達(dá)點(diǎn)陣最上邊,這時(shí)由于對(duì)方向輸入鍵key的設(shè)置,蛇開始向右走。當(dāng)?shù)褂?jì)時(shí)為49s時(shí),蛇頭到達(dá)點(diǎn)陣最右邊。此時(shí)蛇繼續(xù)向右走,出界,over置為1,游戲結(jié)束。從圖中可以看出,老鼠每5秒重置一次位置。四.源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitytanshisheis port( clk,clear:instd_logic;--時(shí)鐘、復(fù)位/開始開關(guān) key:instd_logic_vector(3downto0);--方向控制鍵 seven:outstd_logic_vector(6downto0);--七位數(shù)碼管的7根二極管 cat:outstd_logic_vector(5downto0);--控制數(shù)碼管顯示 row,col:outstd_logic_vector(7downto0));--點(diǎn)陣行、列坐標(biāo)endtanshishe;architecturegameoftanshisheis signalsetrat,over:std_logic;--重設(shè)老鼠、游戲結(jié)束信號(hào) signalratr,ratc,rat:integerrange0to7;--老鼠行、列坐標(biāo) signalt:std_logic_vector(2downto0); signalrattime:integerrange0to4;--老鼠出現(xiàn)時(shí)間 typedotsisarray(integerrange<>)ofintegerrange0to7; signalsnaker,snakec:dots(3downto0);--蛇行、列坐標(biāo) constantwallr:dots(3downto0):=(6,5,4,3);--墻的行坐標(biāo)(常數(shù)) constantwallc:dots(3downto0):=(4,4,4,4);--強(qiáng)的列坐標(biāo)(常數(shù)) signalclk1,clk2,clk3:std_logic;--clk1:1秒clk2:500hz時(shí)鐘signaltmp1:integerrange0to49999999;--分頻1signaltmp2:integerrange0to99999;--分頻2signaltmp3:integerrange0to49;--分頻3 signaldir:std_logic_vector(1downto0);--保存下一時(shí)刻方向 signaldirection:integerrange0to3;--當(dāng)前蛇方向:0->上,1->下,2->左,3->右 signalpoint:integerrange0to8;--當(dāng)前點(diǎn)陣上顯示的點(diǎn) typefigureisarray(integerrange<>)ofintegerrange0to9; signalshownum:figure(3downto0);--shownum(3)和shownum(2)分別為得分的高位和地位,shownum(1)和shownum(0)分別為剩余時(shí)間的高位和地位begin p1:process(clk,over,clear)--分頻同時(shí)保存下一時(shí)刻蛇的移動(dòng)方向 begin ifclear='1'then dir<="00";tmp1<=0;tmp2<=0; elsifclk'eventandclk='1'then if(tmp2=99999)thentmp2<=0;clk2<='1';elsetmp2<=tmp2+1;clk2<='0';endif;ifover/='1'then if(tmp1=49999999)thentmp1<=0;clk1<='1';elsetmp1<=tmp1+1;clk1<='0';endif;if(tmp3=49)thentmp3<=0;clk3<='1';elsetmp3<=tmp3+1;clk3<='0';endif; casekeyis when"1000"=>dir<="00"; when"0100"=>dir<="01"; when"0010"=>dir<="10"; when"0001"=>dir<="11"; whenothers=>null; endcase; endif; endif; endprocess; p2:process(clear,clk3,over)--點(diǎn)陣顯示模塊 begin ifclear='1'then row<="11111111"; col<="00000000"; point<=0; else if(over='1')then--游戲結(jié)束col<="11111111";row<="00000000";else ifclk3'eventandclk3='1'then col<="00000000"; row<="11111111"; ifpoint=8then point<=0; elsepoint<=point+1; endif; casepointis when0|1|2|3=>row(snaker(point))<='0'; col(snakec(point))<='1'; when4=>row(ratr)<='0';col(ratc)<='1'; when5|6|7|8=>row(wallr(point-5))<='0';col(wallc(point-5))<='1'; whenothers=>col<="00000000";row<="11111111"; endcase; endif; endif; endif; endprocess; p3:process(clear,clk1,shownum(0),dir)--控制模塊 variableratr1,ratc1:integerrange0to7; begin ifclear='1'then--復(fù)位 snaker<=(3,2,1,0); snakec<=(1,1,1,1); direction<=0; over<='0'; shownum(3)<=0; shownum(2)<=0; shownum(1)<=5; shownum(0)<=9; setrat<='1'; else ifclk1'eventandclk1='1'then ifrattime=4thenrattime<=0;--老鼠出現(xiàn)時(shí)間 elserattime<=rattime+1; endif; ifshownum(0)=0then--剩余時(shí)間 shownum(0)<=9; shownum(1)<=shownum(1)-1; else shownum(0)<=shownum(0)-1; endif; foriin0to2loop--thesnakemoves--蛇的步進(jìn) snaker(i)<=snaker(i+1); snakec(i)<=snakec(i+1); endloop; casediris when"00"=>ifsnaker(3)=7then--向上出界游戲結(jié)束 over<='1'; elsifdirection/=1then--蛇頭向上步進(jìn)(蛇頭方向不和輸入值相反時(shí)) snaker(3)<=snaker(3)+1; snakec(3)<=snakec(3); direction<=0; else ifsnaker(3)=0then--蛇頭方向和輸入值相反,若蛇頭向下出界,游戲結(jié)束 over<='1'; else snaker(3)<=snaker(3)-1;--蛇頭向下未出界,向下步進(jìn) snakec(3)<=snakec(3); endif; endif; when"01"=>ifsnaker(3)=0then--若蛇頭向下出界,游戲結(jié)束 over<='1'; elsifdirection/=0then--蛇頭方向不和輸入值相反,向下步進(jìn) snaker(3)<=snaker(3)-1; snakec(3)<=snakec(3); direction<=1; elsifsnaker(3)=7then--蛇頭方向和輸入值相反,若蛇頭向上出界游戲結(jié)束 over<='1'; else snaker(3)<=snaker(3)+1;--蛇頭向上未出界,向上步進(jìn) snakec(3)<=snakec(3); endif; when"10"=>ifsnakec(3)=0then--左 over<='1'; elsifdirection/=3then snakec(3)<=snakec(3)-1; snaker(3)<=snaker(3); direction<=2; elsifsnakec(3)=7then over<='1'; else snakec(3)<=snakec(3)+1; snaker(3)<=snaker(3); endif; when"11"=>ifsnakec(3)=7then--右 over<='1'; elsifdirection/=2then snakec(3)<=snakec(3)+1; snaker(3)<=snaker(3); direction<=3; elsifsnakec(3)=0then over<='1'; else snakec(3)<=snakec(3)-1; snaker(3)<=snaker(3); endif; endcase; ifsetrat='1'then--重設(shè)老鼠位置 ratr1:=rat; ratc1:=rat+2; foriin0to3loop ifratr1=wallr(i)andratc1=wallc(i)then ratr1:=ratr1+1; ratc1:=ratc1+1; exit; endif; endloop; ratr<=ratr1; ratc<=ratc1; rattime<=0; setrat<='0'; endif;if(shownum(1)=0andshownum(0)=0)then--游戲時(shí)間到 over<='1';else ifrattime=4thensetrat<='1';--重設(shè)老鼠位置 endif; ifsnaker(3)=ratrandsnakec(3)=ratcthen--吃到老鼠 setrat<='1'; ifshownum(2)=9then--加一分 shownum(2)<=0; shownum(3)<=shownum(3)+1; else shownum(2)<=shownum(2)+1; endif; else foriin0to3loop ifsnaker(3)=wallr(i)andsnakec(3)=wallc(i)then--蛇撞墻 over<='1'; exit; endif; endloop;endif;endif; endif; endif; endprocess; p4:process(clear,clk2)--在數(shù)碼管上顯示得分和剩余時(shí)間 variablestate:integerrange0to3:=0; begin ifclear='1'thencat<="111111"; elsifclk2'eventandclk2='1'then state:=state+1; casestateis when3=>cat<="011111"; when2=>cat<="101111"; when1=>cat<="111101"; when0=>cat<="111110"; endcase; caseshownum(state)is when0=>seven<="1111110"; when1=>seven<="0110000"; when2=>seven<="1101101"; when3=>seven<="1111001"; when4=>seven<="0110011"; when5=>seven<="1011011"; when6=>seven<="1011111"; when7=>seven<="1110000"; when8=>seven<="1111111"; when9=>seven<="1111011"; whenothers=>seven<="0000000"; endcase; endif; endprocess; p5:process(clk1,t)--M序列發(fā)生器beginift="000"thent<="001";elsifclk1'eventandclk1='1'thent(0)<=t(0)xort(2);t(1)<=t(0);t(2)<=t(1);endif;casetiswhen"000"=>rat<=0;when"001"=>rat<=1;when"010"=>rat<=2;when"011"=>rat<=3;when"100"=>rat<=4;when"101"=>rat<=5;when"110"=>rat<=6;when

溫馨提示

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

評(píng)論

0/150

提交評(píng)論