![北郵數電實驗報告_簡易迷宮游戲_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/14/466e9087-4f69-4965-a5bd-b7c29e2bf487/466e9087-4f69-4965-a5bd-b7c29e2bf4871.gif)
![北郵數電實驗報告_簡易迷宮游戲_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/14/466e9087-4f69-4965-a5bd-b7c29e2bf487/466e9087-4f69-4965-a5bd-b7c29e2bf4872.gif)
![北郵數電實驗報告_簡易迷宮游戲_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/14/466e9087-4f69-4965-a5bd-b7c29e2bf487/466e9087-4f69-4965-a5bd-b7c29e2bf4873.gif)
![北郵數電實驗報告_簡易迷宮游戲_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/14/466e9087-4f69-4965-a5bd-b7c29e2bf487/466e9087-4f69-4965-a5bd-b7c29e2bf4874.gif)
![北郵數電實驗報告_簡易迷宮游戲_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/14/466e9087-4f69-4965-a5bd-b7c29e2bf487/466e9087-4f69-4965-a5bd-b7c29e2bf4875.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數字電路與邏輯設計實驗簡易迷宮游戲專 業(yè):電子信息工程姓 名:班 級:2012211102學 號:班內序號:設計課題的任務要求(一) 實驗目的1. 熟練掌握 VHDL 語言和QuartusII 軟件的使用;2. 理解狀態(tài)機的工作原理和設計方法;3. 掌握利用 EDA 工具進行自頂向下的電子系統(tǒng)設計方法;(二) 相關知識本實驗主要利用狀態(tài)機來設計實現一個簡易迷宮系統(tǒng),本系統(tǒng)分為控制器與受控電路兩部分。控制器主要控制整個系統(tǒng)按設定的工作方式實現點陣、計時器、數碼管工作的通與斷,并使用邏輯判斷判決小人是否移動與否和移動的方向。同時本實驗也運用到了包括分頻器、計數器、數碼管、點陣等相關知識。主要利用六
2、位數碼管顯示30s計時和小人移動步數,用點陣顯示開機畫面、迷宮地圖、小人移動過程和游戲失敗、勝利的相應畫面。(三) 實驗任務基本要求:1、 用88點陣進行游戲顯示。2、 迷宮游戲如圖1所示,采用雙色點陣顯示,其中紅色LED為迷宮墻壁,綠色LED表示人物。通過BTN0BTN3四個按鍵控制迷宮中的人物進行上下左右移動,使人物從起始點出發(fā),走到迷宮的出口,游戲結束3、 普通計時模式:通過按鍵BTN7啟動游戲,必須在30秒內找到出口,否則游戲失敗,用兩個數碼管進行倒計時顯示。游戲勝利或者失敗均要在88點陣上有相應的畫面出現。4、 迷宮中的人物在行走過程中,如果碰到墻壁,保持原地不動提高要求:1. 多種
3、迷宮地圖可以選擇。2. 在計時的基礎上增加計步的功能,每按一次控制按鍵步數加1,碰壁不計算步數,計步結果用數碼管顯示。3. 增加了計時顯示的精確度,讓倒計時精確到0.01s4.增加了開機畫面,當按下START開始鍵后,點陣上開始顯示“GO- 6-5-4-3-2-1”的開始畫面。系統(tǒng)設計(一) 設計思路此程序利用自頂向下的設計思想。首先要考慮實現基本功能所需要哪些模塊,倒計時的功能要用數碼管來實現,地圖的顯示和迷宮游戲中動畫的交互要用88點陣來實現,方向的選擇和開始游戲需要獨立按鍵來顯示,這些都是最頂層的模塊。然后,要實現這些模塊,第一需要適當的時鐘頻率來驅動,這就要完成一個分頻器,根據點陣、數
4、碼管以及獨立按鍵各自的特征完成相應頻率的分配。實現倒計時功能的時候,需要一個計時器在每秒改變一次數碼管的顯示狀態(tài),于是還需要一個計時器模塊。而數碼管動態(tài)掃描需要相應的LED燈亮滅,這就需要先定義好了顯示相應數字的時候對應八段LED的高低電平狀態(tài)。點陣的顯示控制原理和數碼管類似,都是一個較高頻率的動態(tài)掃描過程,只是代碼量更大。其次,也是該程序最關鍵的地方就是綠色小人移動的控制。題干中說明小人撞墻后原地不動,不撞墻的時候進行移動。這就需要我們判斷是否撞墻。經過和同學的商討,我絕對將點陣坐標化,而小人所處的位置用(x,y)表示并實時的更新,然后將墻壁坐標封裝好,當下一步的坐標在墻壁坐標的集合中則判定
5、為撞墻,否則根據方向進行移動。而終點坐標也都是提前用代碼設定好的,這樣通過坐標顯示出點陣應該進行的下一畫面。到此為止,該實驗的基本功能都已經規(guī)劃得較為清晰。對于提高要求,我通過一個拔碼開關控制初始迷宮地圖的選擇,在程序中加入一個輸入信號來選擇相應地圖;在程序中添加兩個計數變量,分別表示步數的個位和十位,兩者添加到判斷撞墻與否的邏輯語句中,在數碼管顯示模塊中增加兩個數碼管的顯示便可實現。此外,為了豐富點陣界面,我還添加了開機畫面,通過一個1s加1的變量掃描顯示“GO- 6-5-4-3-2-1”;想到很多倒計時顯示中個都精確到了0.01s甚至更精確,我又增加兩個數碼管來顯示倒計時的小數點后兩位。(
6、二) 總體框圖1. 系統(tǒng)結構框圖2. 邏輯劃分方框圖3. 控制模塊流程圖4. 狀態(tài)轉移圖 (三) 分塊設計 點陣模塊:點陣模塊主要分為點陣掃描顯示模塊、小人移動邏輯判斷模塊。掃描顯示模塊,主要是對迷宮地圖、開機動畫以及小人移動變化后的圖案進行動態(tài)掃描,完成游戲交互。開機畫面通過一個一秒更新一次的變量,然后通過case語句來完成掃描;地圖圖案的顯示也是同樣的方案,只不過要勝利或者失敗的邏輯判斷。小人移動的邏輯判斷模塊,主要通過坐標定位。首先將地圖中墻壁的坐標位置封裝好,然后將小人時刻的位置定義為(x,y),再根據按鍵對x,y進行變化,最后通過判斷新的坐標是否在封裝好的墻壁集合中來進行移動與否的判
7、決。如果移動則更新(x,y);如果不移動,則保持(x,y)不變。數碼管顯示模塊:數碼管顯示模塊主要分為30s倒計時模塊和小人移動步數計數模塊倒計時模塊中將一個1KHZ的時鐘信號進行四次的十分頻,可以得到一個精確到0.01s的倒計時。每個變量都是十進制的數,再將它們傳送到數碼管動態(tài)掃描模塊,便可以順利地顯示30s倒計時。小人移動步數計數模塊,定義兩個計數變量count、count10分別表示計數的個位和十位,將其放在小人移動邏輯判斷模塊中,當邏輯判定為移動,則將count加一,當加到10的時候進位。再將兩者傳送到數碼管動態(tài)掃描模塊,就可以實時顯示小人移動的步數。按鍵防抖模塊:該程序再一開始開發(fā)的
8、時候并沒有加防抖模塊,而是盡可能地找到一個最佳的按鍵掃描控制頻率,使得既可以得到靈敏可靠的按鍵控制,又可以再長按一次后進行多步移動,這樣可以方便用戶的操作,一開始測試得到的按鍵掃描頻率為5Hz。但是好像要求按鍵必須加防抖,并且為了提高按鍵輸入可靠性,由于機械觸點的彈性振動, 因而在按鍵閉合和斷開的瞬間均會出現一連串的抖動,按鍵的抖動會造成按一次鍵產生的開關狀態(tài)被 CPU 誤讀幾次。 為了使 CPU 能正確地讀取按鍵 狀態(tài),必須在按鍵閉合或斷開時,消除產生的前沿或后沿抖動。一、 仿真波形及波形分析(一) 復位、開始()注:以下關于點陣顯示的仿真都是最開始測試用的模塊,并不包含點陣動態(tài)顯示的所有狀
9、態(tài),只是挑選其中一些典型狀態(tài)展示,而且點陣掃描紅色和綠色是分開的。1.復位:當按下復位鍵的時候,停止對點陣的掃描,點陣上無任務圖形顯示。2開始:當按下開始鍵的時候,點陣開始進行行掃描,開始倒計時顯示“GO- 6-5-4-3-2-1”,上圖為點陣用紅色LED顯示“GO”。(二)點陣顯示勝利、失敗勝利:當玩家在30s之內到達了迷宮的終點,游戲結束并點陣顯示“V”的標志。上圖為當信號victory置高電平的時候,點陣開始行掃描,并將紅色、綠色LED均點亮顯示“V”,上圖可明顯地看出。失敗:當玩家在30s之內沒有到達迷宮的終點,游戲結束并且點陣顯示“X”的標志。上圖為信號fail置高電平的時候,點陣開
10、始行掃描,并將紅色、綠色LED均點亮顯示“X”,由上圖可以明顯地看出。(三)數碼管倒計時數碼管倒計時:實際上應該是四位數碼管從30.00s倒計時,為了方便展示將倒計時的計數變量改成二進制,上圖中輸出信號ledshow代表數碼管段選的信號,而ledstate代表數碼管位選的信號,變量ledsao表示分五次對四位數字加上一個小數點進行掃描。上圖紅色圈中表示顯示小數點,“00000001”表示小數點,而ledstate在“111110 111101 111011 110111 111011 ”五個狀態(tài)之間循環(huán)表示對四位數字和一個小數點的顯示。而ledshow顯示相應的數字。(四)按鍵防抖按鍵防抖:k
11、eyin輸入一個持續(xù)時間約為0.1s的按鍵信號并用高頻時鐘模擬抖動,keyout輸出一個時鐘周期的高電平。二、 源程序(注釋)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;ENTITY maze ISPORT(clk:IN STD_LOGIC; -總時鐘start,reset:IN STD_LOGIC; -開始和復位鍵l,r,f,b,mapflag:IN STD_LOGIC;-BTN -b/r/f/b分別代表小人向左、右、前、后移動;mapflag代表兩種地圖的選擇dotshow:OUT STD
12、_LOGIC_VECTOR(23 DOWNTO 0); -點陣顯示ledstate:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -數碼管狀態(tài)ledshow:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -數碼管顯示END maze;ARCHITECTURE main of maze IS signal cnt : integer range 0 to 25000; -分頻器的計數 signal cnt1 : integer range 0 to 25000000; signal cnt2 : integer range 0 to 5000000;
13、signal clk_tmp : std_logic; -分頻器的臨時信號 signal clk_tmp1 : std_logic; signal tclk: std_logic; signal clk_tmp2 : std_logic; signal key_tmp0,key_tmp1,key_tmp2,key_tmp3:std_logic; signal row: std_logic_vector(7 downto 0); -點陣行狀態(tài) signal cul: std_logic_vector(15 downto 0); -點陣列狀態(tài) signal aclk: std_logic; -點陣
14、倒計時開機畫面的時鐘信號 signal binclk: std_logic; -按鍵時鐘信號shared variable tend : integer range 0 to 1; signal tostart : std_logic; -開始標志信號 signal preset : std_logic; -邏輯判斷模塊重置signal dotreset : std_logic; -點陣模塊重置 signal ledreset : std_logic; -數碼管重置 signal treset : std_logic; -計時器重置 signal pwork : std_logic; -邏輯判
15、斷模塊工作 signal dotwork : std_logic; -點陣工作 signal ledwork : std_logic; -數碼管工作 signal twork : std_logic; -計時器工作 signal worked : std_logic; signal vic : std_logic; - 成功signal fal : std_logic ; - 失敗type nst is array(0 to 9)of std_logic_vector(7 downto 0);signal ledshowed:nst; shared variable rowsao:intege
16、r range 0 to 9; -點陣的行掃描shared variable ledsao :integer range 0 to 6; -數碼管的掃描shared variable daojishi :integer range 0 to 7; -開機動畫倒計時掃描shared variable dotsao :integer range 0 to 3;shared variable mapsao :integer range 0 to 9;shared variable x :integer range -7 to 0; -小人的坐標shared variable y :integer r
17、ange -6 to 1;shared variable count :integer range 0 to 9; -count和count10分別代表步數的個位和十位shared variable count10 :integer range 0 to 9;shared variable timems :integer range 0 to 9;shared variable time001s :integer range 0 to 9; -以下分別代表30倒計時的位數shared variable time01s :integer range 0 to 9;shared variable
18、time1s :integer range 0 to 9;shared variable time10s :integer range 0 to 9;begin -數碼管顯示高低電平初始化ledshowed(1)=01100000;ledshowed(2)=11011010;ledshowed(3)=11110010;ledshowed(4)=01100110;ledshowed(5)=10110110;ledshowed(6)=10111110;ledshowed(7)=11100000;ledshowed(8)=11111110;ledshowed(9)=11110110;ledshowe
19、d(0)=11111100;tdiv:process(clk,clk_tmp) - 計時器分頻-1Kbeginif (clkevent and clk=1) thenif cnt=24999 thencnt=0;clk_tmp= not clk_tmp;elsecnt=cnt+1;end if;end if;tclk=clk_tmp;end process;adiv:process(clk,clk_tmp1) -點陣分頻-1HZbeginif (clkevent and clk=1) thenif cnt1=24999999 thencnt1=0;clk_tmp1= not clk_tmp1;
20、elsecnt1=cnt1+1;end if;end if;aclk=clk_tmp1;end process;usediv:process(clk,clk_tmp2) -按鍵控制判斷分頻-5HZbeginif (clkevent and clk=1) thenif cnt2=4999999 thencnt2=0;clk_tmp2= not clk_tmp2;elsecnt2=cnt2+1;end if;end if;binclk=clk_tmp2;end process;process(clk_fd) -防抖模塊begin if (clk_fdevent and clk_fd=1) then
21、 key_tmp0 = keyin; key_tmp1 = key_tmp0;end if; end process; -利用信號賦值延時將前后信號相與完成防抖 key_tmp2 = key_tmp0 and key_tmp1; process(clk_fd ) begin if (clk_fdevent and clk_fd=1) then key_tmp3 = key_tmp2; keyout= not( key_tmp2 ) and key_tmp3; end if; end process; end; -時鐘上升沿輸出一個時鐘周期寬度的脈沖control:process(clk,res
22、et,start) -控制器beginif (clkevent and clk=1) thenif (start=1) thentostart=1;end if;if (reset=1 or tend=1) then preset=1; dotreset=1; ledreset=1; treset=1; tostart=0; dotwork=0; else preset=0;dotreset=0;ledreset=0;treset=0;if(tostart=1)thendotwork=1; -啟動點陣模塊end if;end if;end if;end process;a:process(ac
23、lk,dotreset) -點陣工作模塊beginif (dotreset=1) thendotsao:=0;elseif ( aclkevent and aclk=1) thenif(vic=1 or fal=1)thenif(dotsao=2)thendotsao:=dotsao+1;end if;end if;end if;end if;end process;process(tclk,dotreset)beginif (dotreset=1) thenmapsao:=0;elseif (tclkevent and tclk=1) thenif(mapsao=9)thenmapsao:=
24、0;elsemapsao:=mapsao+1;end if;end if;end if;end process;process(aclk,dotwork,worked,dotreset)beginif (dotreset=1) thendaojishi:=0;elseif (aclkevent and aclk=1 and dotwork=1 and worked=0) thenif(daojishi=7)thendaojishi:=0;elsedaojishi:=daojishi+1;end if;end if;end if;end process;process(tclk,dotreset
25、)beginif (dotreset=1) thenrowsao:=0;elseif (tclkevent and tclk=1) thenif(rowsao=9)thenrowsao:=0;elserowsao:=rowsao+1;end if;end if;end if;end process;process(clk,dotreset,dotwork,mapflag) -開機動畫begin if (dotreset=1) thendotshow=000000000000000000000000;tend:=0;worked=0;twork=0;pworkcase rowsao iswhen
26、 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdot
27、showdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase rowsao iswhen 1=dotshowdotshowdotshowdotshowdotshowdotshowdotshowdo
28、tshowdotshowdotshowworked=1;pwork=1;ledwork=1;twork=1;if (reset=1) thenpwork=0;ledwork=0;twork=0;end if;end case;elseif(fal=1)thentwork=0;pwork=0; if(dotsaodotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshow=111111111111111100000000;end case;elsetend:=1;end if;elsif(vic=1)thentwor
29、k=0;pwork=0;if(dotsaodotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase x iswhen 0=culculculculculculculculrowrowrowrowrowrowrowrow=01111111;end case;dotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowdotshowcase x iswhen 0=culculculculculculculculrowrowrowrowrowrowrowrow=01111111;end case;dotshow=row&cul;end case;end if;end if;end if;end if;end if;end process;p:process(clk,preset,pwork,binclk,l,r,f,b) -邏輯判斷模塊variable derx :integer range -1 to 1;variable dery :integer range -1 to 1;b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年專屬定制軟件開發(fā)協(xié)議書
- 2025年定期體檢服務合同協(xié)議
- 2025年公共藝術項目合同范本
- 2025年江蘇省房產買賣合同參考版本
- 2025年互聯網金融服務平臺支付協(xié)議
- 2025年員工互派協(xié)議實施策劃要點
- 2025年企業(yè)軟件銷售區(qū)域代理協(xié)議
- 2025年連鎖經營合作協(xié)議書
- 2025年農業(yè)機械作業(yè)合同范本
- 2025年保險經紀公司合作框架協(xié)議
- 2024年計算機二級WPS考試題庫(共380題含答案)
- 【履職清單】2024版安全生產責任體系重點崗位履職清單
- 跨學科實踐活動10調查我國航天科技領域中新型材料新型能源的應用課件九年級化學人教版(2024)下冊
- 2022年全國醫(yī)學博士英語統(tǒng)一考試試題
- 學校工作總結和存在的不足及整改措施
- Petrel中文操作手冊(1-3)
- 《工業(yè)自動化技術》課件
- 代理分銷銷售協(xié)議書
- (績效考核)鉗工技能鑒定考核試題庫
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
- 裝卸工安全培訓課件
評論
0/150
提交評論