VHDL 貪吃蛇游戲?qū)嶒?yàn)報(bào)告_第1頁
VHDL 貪吃蛇游戲?qū)嶒?yàn)報(bào)告_第2頁
VHDL 貪吃蛇游戲?qū)嶒?yàn)報(bào)告_第3頁
VHDL 貪吃蛇游戲?qū)嶒?yàn)報(bào)告_第4頁
VHDL 貪吃蛇游戲?qū)嶒?yàn)報(bào)告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

1、1/ 22貪吃蛇游戲本實(shí)驗(yàn)以設(shè)計(jì)貪吃蛇游戲?yàn)檎n題。最終結(jié)果是以 8*8 點(diǎn)陣作為本游戲的顯示界面,通過按鍵 BTN1BTN2BTN3BTN4 分別控制蛇點(diǎn)表示老鼠,當(dāng)蛇頭吃到老鼠時(shí),老鼠則在點(diǎn)陣上改變位置,也就是時(shí),就自動(dòng)加一分,并在數(shù)碼管顯示。每隔五分鐘,在蛇沒有吃到老味性和難度性。8*8 點(diǎn)陣,貪吃蛇,數(shù)碼管,EPM7128SLC815數(shù)電實(shí)驗(yàn)開發(fā)板88 4 個(gè)排成一蛇游戲,蛇撞“墻”、邊或者游戲時(shí)間到,則游戲結(jié)束。1. 老鼠出現(xiàn)的地方是隨機(jī)的,在某個(gè)地點(diǎn)出現(xiàn)的時(shí)間是5 秒鐘,如果5 秒鐘之內(nèi)沒有被吃掉,它就會(huì)在其它地方出現(xiàn);2. 用數(shù)碼管顯示得分情況和游戲的剩余時(shí)間,每吃掉一只老鼠就加一

2、分;3. 游戲時(shí)間和速度可以手動(dòng)設(shè)置。4. 選做:增加游戲難度或自擬其它功能。當(dāng)開啟電源時(shí),初始化EPM7128SLC815 數(shù)電實(shí)驗(yàn)開發(fā)板。8*88*8 次點(diǎn)亮六個(gè)蛇身和一個(gè)老鼠所對應(yīng)的點(diǎn),由于掃描頻率是 1MHz(遠(yuǎn)BTN1,BTN2BTN3BTN4 七段數(shù)碼管上顯示得分情況,每當(dāng)蛇吃到一個(gè)老鼠時(shí)則自動(dòng)加一分,并在數(shù)碼管上顯示出當(dāng)前得分。設(shè)置一個(gè)控件 SW1 來對得分進(jìn)行復(fù)位,即每當(dāng)SW1有效時(shí),則得分清零。初始化 8*8 點(diǎn)陣 號通 過 控 件, 輸入蛇的運(yùn)號2/ 22通過比較決定否是沒 有 吃 到 內(nèi)蛇還沒老鼠自動(dòng)改 時(shí) 鐘 蛇的運(yùn)動(dòng)方向 snake_m 設(shè)置為兩位二進(jìn)制的變量:假設(shè)“

3、00”011011控制方向dir 0001”1011則蛇運(yùn)動(dòng)方向的狀態(tài)轉(zhuǎn)移圖如下:3/ 22”00”11”“01” ”按照系統(tǒng)的設(shè)計(jì)思路其流程圖如下:4/ 22啟 動(dòng)游戲結(jié)束5/ 22在本課題中最主要的是如何讓蛇在 8*8點(diǎn)陣上顯示并且讓蛇身 snake_x和 snake_y變量定義為wordword數(shù)據(jù)類型是我自己定義的(type word isarray (1 to 7)of std_logic_vector(2 downto 0)snake_x和 snake_y 1到 7 3位的二進(jìn)制變量(從“000”到“111上,即 snake_m=00 dir=“如下:if (snake_m=00)

4、 thenif (dir=10) thensnake_m=10;if (snake_m=10)and(snake_x(1)=000) then -左,snake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake

5、_x(1)=111;elsif (snake_m=10) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);6/ 22snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=snake_x(1)-1;這就解決了蛇的移動(dòng)問題,另外對于顯示

6、模塊和控制模塊比較簡單,在分塊電路設(shè)計(jì)中將分別介紹。控制方向模塊:通過按鍵BTN1,BTN2,BTN3,BTN4如下:process(clk)beginif (clkevent)and(clk=0) then-shang,xia zou ,youif (key=1000) then -shangdir=00;elsif (key=0100) then-xiadir=01;elsif (key=0010) then- zoudir=10;elsif (key=0001) then-youdir=11;end if;end if;end process;時(shí)鐘分頻模塊:由于系統(tǒng)所用的晶振為1MHZ,

7、而要求是蛇1S移動(dòng)一次,這就要1MHZ晶振進(jìn)行分頻,采用 10e6分頻,是分頻得到的時(shí)鐘 CLK2周期為 1S,其設(shè)計(jì)源代碼如下:P0:process(clk)beginif (clkevent and clk=1) thenif count=1000000 thencount=0;7/ 22clk1=not clk1;elsecount=count+1;end if;end if;掃描顯示模塊:掃描顯示時(shí)每來一個(gè)時(shí)鐘就對整個(gè)8*8點(diǎn)陣上的點(diǎn)亮的條件是行為高電平0時(shí),則對應(yīng)的點(diǎn)就被點(diǎn)亮,其源代碼如下:process(clk)- 顯示部分beginif (clkevent and clk=1)

8、thenif count1=8 thencount1=1;else count1 rown rown rown rown rown rown rown rown rown coln coln coln coln coln coln coln coln coln=11111111;end if;col=coln;8/ 22row=rown;end process;蛇身移動(dòng)模塊:蛇身移動(dòng)時(shí)首先判斷蛇的移動(dòng)方向 snake_m,然后和控制方向dirprocess(clk1)-蛇的運(yùn)動(dòng)beginif (clk1event and clk1=1) thenif (snake_m=10)and(snake

9、_x(1)=000) then -左,snake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=111;elsif (snake_m=10) thensnake_x(6)=snake_x(5);s

10、nake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=snake_x(1)-1;elsif (snake_m=00)and(snake_y(1)=111) then -上snake_x(6)=snake_x(5);snake_x(5)=s

11、nake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);9/ 22snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=000;elsif (snake_m=00) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake

12、_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=snake_y(1)+1;elsif (snake_m=11)and(snake_x(1)=111) then -右snake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake

13、_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=000;elsif (snake_m=11) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=sna

14、ke_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=snake_x(1)+1;elsif (snake_m=01)and(snake_y(1)=000) then -下snake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);10/ 22snake_x(2)=snake_x(1);snake_y(6)=snake_y(

15、5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=111;elsif (snake_m=01) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_

16、y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=snake_y(1)-1;end if;end if;end process;老鼠隨機(jī)顯示模塊及計(jì)分模塊:在老鼠顯示模塊中,有三項(xiàng)功能:第一項(xiàng),當(dāng)SW1有效時(shí),這時(shí)對計(jì)分進(jìn)行清零;第二項(xiàng),當(dāng) 5s到來,而蛇沒有吃到老鼠,則改變老鼠的位置,當(dāng)蛇吃到老鼠,改變蛇的位置;第三項(xiàng),在七段數(shù)碼管上顯示得分情況,其中還設(shè)置six這個(gè)輸入變量對數(shù)碼進(jìn)行片選。其相關(guān)源代碼如下:process(clk)beginif (clkevent and clk=1) thenif sw1=1 then

17、seven=1111110;else if count2=5000000 thencount=1;snake_x(7)=snake_y(3)+1;snake_y(7)=snake_x(4)-1;else count2=count2+1;11/ 22end if;else ifsnake_x(1)=snake_x(7) and snake_y(1)=snake_y(7)thenscore=score+1;snake_x(7)=snake_y(3)+1;snake_y(7)sevensevensevensevensevensevensevensevensevensevensevensevensev

18、ensevensevensevenseven=0000000;end case;six=011111;end if;end process;1、2、3、4、5、蛇可以在點(diǎn)陣上自動(dòng)移動(dòng);可以通過控件控制蛇的移動(dòng)方向;可以在七段數(shù)碼管上顯示當(dāng)前游戲者的得分;可以通過復(fù)位鍵來對當(dāng)前得分清零;可以在蛇沒有吃到老鼠而且時(shí)間已過 5S 時(shí)對蛇的位置進(jìn)行自動(dòng)改變。12/ 22本實(shí)驗(yàn)中開始時(shí)遇到的最大問題時(shí)如何讓蛇在在 8*8 點(diǎn)陣上顯顯示原理,于是設(shè)計(jì)了蛇的移動(dòng)和顯示。就這樣過了兩周時(shí)間,真正序調(diào)試的過程中都得以解決,其中遇到一個(gè)比較多的問題是 if 語句要時(shí)由于過多的使用 ifcase 等一系列語句造成的

19、,故在程序設(shè)計(jì)施下完成所要求的任務(wù)??偨Y(jié)和結(jié)論:在本次試驗(yàn)中,所有的步驟,從實(shí)驗(yàn)設(shè)計(jì)到最后將所有的代碼以解決時(shí)是快樂,特別是的當(dāng)蛇在點(diǎn)陣上跑動(dòng)時(shí),心里只能用happy取,其中首先想到的是計(jì)分模塊,這個(gè)模塊很快就解決,接下來我又占有邏輯宏單元為99%,系統(tǒng)一共有128 個(gè)邏輯宏單元,而我已經(jīng)使用了 127 個(gè)。后來,我發(fā)現(xiàn)通過簡化某些程序段,特別是簡化if 語13/ 22句的使用可以騰出一些邏輯宏單元出來,接著我又將在每隔 5S游戲樣驗(yàn)收程序的時(shí)間到了,雖然算不上perfect,但畢竟在發(fā)現(xiàn)問題和能力,一種思路的設(shè)計(jì),發(fā)現(xiàn)問題,解決問題的能力。硬件:EPM7128SLC815數(shù)字電路實(shí)驗(yàn)開發(fā)板計(jì)

20、算機(jī)軟件:ALTER公司開發(fā)的quartus II 7.1版本Adobe ReaderOffice wordlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity snake is-shi tiport(clk:in std_logic;-shi zhong duankou-fu wei duankou-kong zhi fangxiangsw1:in std_logic;key:in std_logic_vector(3 downto 0);duankoucol:out std_logic

21、_vector(7 downto 0); -lie zuobiaorow:out std_logic_vector(7 downto 0); -hang zuobiaosix:out std_logic_vector( 5 downto 0); -qi duan shu ma guan depian xuanseven:out std_logic_vector(6 downto 0) -qi duan shu ma guan);14/ 22end entity snake;architecture behav of snake is-jie gou tisignal dir: std_logi

22、c_vector (1 downto 0); -kong zhi she yi dongde fang xiangsignal rown:std_logic_vector(7 downto 0); -hang xin haosignal coln:std_logic_vector(7 downto 0); -lie xinhaotype word is array (1 to 7)of std_logic_vector(2 downto 0);-dingyiword shuju leixingsignal snake_y:word;signal snake_x:word;-dingyi zon

23、g zuobiao- dingyi heng zuibiao-10e6 fen pin xinhao-1miao shi zhongsignal count:integer range 0 to 1000000;signal clk1:std_logic;signal clk2:std_logic;signal count1:integer range 1 to 7;-5miao shi zhong-sheshen he laoshusignal count2:integer range 1 to 5000000; -5*10e6 fen pinsignal snake_m: std_logi

24、c_vector (1 downto 0);-she yidong defangxiangsignal score:std_logic_vector(3 downto 0); -jisuan defenbeginP0:process(clk)-10e6 fenpinbeginif (clkevent and clk=1) thenif count=1000000 thencount=0;clk1=not clk1;elsecount=count+1;end if;end if;end process;p1:process(clk)shixianbegin-kongzhi fangxiang d

25、eif (clkevent)and(clk=0) then -shang,xia zou ,youif (key=1000) thendir=00;-shang-xia-zou-youelsif (key=0100) thendir=01;elsif (key=0010) thendir=10;elsif (key=0001) thendir=11;end if;15/ 22end if;end process;p2:process(clk)fangxiangbegin-she xia yibu de yidongif (clkevent)and(clk=0) thenif (snake_m=

26、00) thenif (dir=00) thensnake_m=00;elsif (dir=01) thensnake_m=00;elsif (dir=10) thensnake_m=10;elsif (dir=11) thensnake_m=11;end if;elsif (snake_m=01) thenif (dir=00) thensnake_m=01;elsif (dir=01) thensnake_m=01;elsif (dir=10) thensnake_m=10;elsif (dir=11) thensnake_m=01;end if;elsif (snake_m=10) th

27、enif (dir=00) thensnake_m=00;elsif (dir=01) thensnake_m=01;elsif (dir=10) thensnake_m=10;elsif (dir=11) thensnake_m=11;end if;elsif (snake_m=11) thenif (dir=00) thensnake_m=00;elsif (dir=01) thensnake_m=01;elsif (dir=10) thensnake_m=11;16/ 22elsif (dir=11) thensnake_m=11;end if;end if;end if;end pro

28、cess;p3:process(clk)sheshenbegin-zai dianzhen shang xianshiif (clkevent and clk=1) thenif count1=8 thencount1=1;else count1 rown rown rown rown rown rown rown rown rown coln coln coln coln coln coln coln coln coln=11111111;end if;col=coln;row=rown;end process;p4: process(clk)laoshu he jufen mokuai-c

29、hangsheng suiji17/ 22beginif (clkevent and clk=1) thenif sw1=1 thenseven=1111110;else if count2=5000000 thencount=1;snake_x(7)=snake_y(3)+1;snake_y(7)=snake_x(4)-1;else count2=count2+1;end if;else if snake_x(1)=snake_x(7) and snake_y(1)=snake_y(7)thenscore=score+1;snake_x(7)=snake_y(3)+1;snake_y(7)s

30、evensevensevensevensevensevensevensevensevensevensevensevensevensevensevensevenseven=0000000;end case;six=011111;end if;end process;p5: process(clk1)mokuaibegin-sheshen yudongif (clk1event and clk1=1) thenif (snake_m=10)and(snake_x(1)=000) then -zuo18/ 22snake_x(6)=snake_x(5);snake_x(5)=snake_x(4);s

31、nake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=111;elsif (snake_m=10) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2)

32、;snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_x(1)=snake_x(1)-1;elsif (snake_m=00)and(snake_y(1)=111) then -shangsnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_

33、x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=000;elsif (snake_m=00) thensnake_x(6)=snake_x(5);snake_x(5)=snake_x(4);snake_x(4)=snake_x(3);snake_x(3)=snake_x(2);snake_x(2)=snake_x(1);snake_y(6)=snake_y(5);snake_y(5)=snake_y(4);snake_y(4)=snake_y(3);19/ 22snake_y(3)=snake_y(2);snake_y(2)=snake_y(1);snake_y(1)=snake_y(1)+1;elsif (snake_m=11)and(snake_x(1)=111) then -yousnake_x(6)=snake_x(5);sn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論