版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、數(shù)字電路與邏輯設(shè)計實驗簡易迷宮游戲?qū)?業(yè):電子信息工程姓 名:班 級:2012211102學(xué) 號:班內(nèi)序號:設(shè)計課題的任務(wù)要求(一) 實驗?zāi)康?. 熟練掌握 VHDL 語言和QuartusII 軟件的使用;2. 理解狀態(tài)機(jī)的工作原理和設(shè)計方法;3. 掌握利用 EDA 工具進(jìn)行自頂向下的電子系統(tǒng)設(shè)計方法;(二) 相關(guān)知識本實驗主要利用狀態(tài)機(jī)來設(shè)計實現(xiàn)一個簡易迷宮系統(tǒng),本系統(tǒng)分為控制器與受控電路兩部分??刂破髦饕刂普麄€系統(tǒng)按設(shè)定的工作方式實現(xiàn)點陣、計時器、數(shù)碼管工作的通與斷,并使用邏輯判斷判決小人是否移動與否和移動的方向。同時本實驗也運用到了包括分頻器、計數(shù)器、數(shù)碼管、點陣等相關(guān)知識。主要利用六
2、位數(shù)碼管顯示30s計時和小人移動步數(shù),用點陣顯示開機(jī)畫面、迷宮地圖、小人移動過程和游戲失敗、勝利的相應(yīng)畫面。(三) 實驗任務(wù)基本要求:1、 用88點陣進(jìn)行游戲顯示。2、 迷宮游戲如圖1所示,采用雙色點陣顯示,其中紅色LED為迷宮墻壁,綠色LED表示人物。通過BTN0BTN3四個按鍵控制迷宮中的人物進(jìn)行上下左右移動,使人物從起始點出發(fā),走到迷宮的出口,游戲結(jié)束3、 普通計時模式:通過按鍵BTN7啟動游戲,必須在30秒內(nèi)找到出口,否則游戲失敗,用兩個數(shù)碼管進(jìn)行倒計時顯示。游戲勝利或者失敗均要在88點陣上有相應(yīng)的畫面出現(xiàn)。4、 迷宮中的人物在行走過程中,如果碰到墻壁,保持原地不動提高要求:1. 多種
3、迷宮地圖可以選擇。2. 在計時的基礎(chǔ)上增加計步的功能,每按一次控制按鍵步數(shù)加1,碰壁不計算步數(shù),計步結(jié)果用數(shù)碼管顯示。3. 增加了計時顯示的精確度,讓倒計時精確到0.01s4.增加了開機(jī)畫面,當(dāng)按下START開始鍵后,點陣上開始顯示“GO- 6-5-4-3-2-1”的開始畫面。系統(tǒng)設(shè)計(一) 設(shè)計思路此程序利用自頂向下的設(shè)計思想。首先要考慮實現(xiàn)基本功能所需要哪些模塊,倒計時的功能要用數(shù)碼管來實現(xiàn),地圖的顯示和迷宮游戲中動畫的交互要用88點陣來實現(xiàn),方向的選擇和開始游戲需要獨立按鍵來顯示,這些都是最頂層的模塊。然后,要實現(xiàn)這些模塊,第一需要適當(dāng)?shù)臅r鐘頻率來驅(qū)動,這就要完成一個分頻器,根據(jù)點陣、數(shù)
4、碼管以及獨立按鍵各自的特征完成相應(yīng)頻率的分配。實現(xiàn)倒計時功能的時候,需要一個計時器在每秒改變一次數(shù)碼管的顯示狀態(tài),于是還需要一個計時器模塊。而數(shù)碼管動態(tài)掃描需要相應(yīng)的LED燈亮滅,這就需要先定義好了顯示相應(yīng)數(shù)字的時候?qū)?yīng)八段LED的高低電平狀態(tài)。點陣的顯示控制原理和數(shù)碼管類似,都是一個較高頻率的動態(tài)掃描過程,只是代碼量更大。其次,也是該程序最關(guān)鍵的地方就是綠色小人移動的控制。題干中說明小人撞墻后原地不動,不撞墻的時候進(jìn)行移動。這就需要我們判斷是否撞墻。經(jīng)過和同學(xué)的商討,我絕對將點陣坐標(biāo)化,而小人所處的位置用(x,y)表示并實時的更新,然后將墻壁坐標(biāo)封裝好,當(dāng)下一步的坐標(biāo)在墻壁坐標(biāo)的集合中則判定
5、為撞墻,否則根據(jù)方向進(jìn)行移動。而終點坐標(biāo)也都是提前用代碼設(shè)定好的,這樣通過坐標(biāo)顯示出點陣應(yīng)該進(jìn)行的下一畫面。到此為止,該實驗的基本功能都已經(jīng)規(guī)劃得較為清晰。對于提高要求,我通過一個拔碼開關(guān)控制初始迷宮地圖的選擇,在程序中加入一個輸入信號來選擇相應(yīng)地圖;在程序中添加兩個計數(shù)變量,分別表示步數(shù)的個位和十位,兩者添加到判斷撞墻與否的邏輯語句中,在數(shù)碼管顯示模塊中增加兩個數(shù)碼管的顯示便可實現(xiàn)。此外,為了豐富點陣界面,我還添加了開機(jī)畫面,通過一個1s加1的變量掃描顯示“GO- 6-5-4-3-2-1”;想到很多倒計時顯示中個都精確到了0.01s甚至更精確,我又增加兩個數(shù)碼管來顯示倒計時的小數(shù)點后兩位。(
6、二) 總體框圖1. 系統(tǒng)結(jié)構(gòu)框圖2. 邏輯劃分方框圖3. 控制模塊流程圖4. 狀態(tài)轉(zhuǎn)移圖 (三) 分塊設(shè)計 點陣模塊:點陣模塊主要分為點陣掃描顯示模塊、小人移動邏輯判斷模塊。掃描顯示模塊,主要是對迷宮地圖、開機(jī)動畫以及小人移動變化后的圖案進(jìn)行動態(tài)掃描,完成游戲交互。開機(jī)畫面通過一個一秒更新一次的變量,然后通過case語句來完成掃描;地圖圖案的顯示也是同樣的方案,只不過要勝利或者失敗的邏輯判斷。小人移動的邏輯判斷模塊,主要通過坐標(biāo)定位。首先將地圖中墻壁的坐標(biāo)位置封裝好,然后將小人時刻的位置定義為(x,y),再根據(jù)按鍵對x,y進(jìn)行變化,最后通過判斷新的坐標(biāo)是否在封裝好的墻壁集合中來進(jìn)行移動與否的判
7、決。如果移動則更新(x,y);如果不移動,則保持(x,y)不變。數(shù)碼管顯示模塊:數(shù)碼管顯示模塊主要分為30s倒計時模塊和小人移動步數(shù)計數(shù)模塊倒計時模塊中將一個1KHZ的時鐘信號進(jìn)行四次的十分頻,可以得到一個精確到0.01s的倒計時。每個變量都是十進(jìn)制的數(shù),再將它們傳送到數(shù)碼管動態(tài)掃描模塊,便可以順利地顯示30s倒計時。小人移動步數(shù)計數(shù)模塊,定義兩個計數(shù)變量count、count10分別表示計數(shù)的個位和十位,將其放在小人移動邏輯判斷模塊中,當(dāng)邏輯判定為移動,則將count加一,當(dāng)加到10的時候進(jìn)位。再將兩者傳送到數(shù)碼管動態(tài)掃描模塊,就可以實時顯示小人移動的步數(shù)。按鍵防抖模塊:該程序再一開始開發(fā)的
8、時候并沒有加防抖模塊,而是盡可能地找到一個最佳的按鍵掃描控制頻率,使得既可以得到靈敏可靠的按鍵控制,又可以再長按一次后進(jìn)行多步移動,這樣可以方便用戶的操作,一開始測試得到的按鍵掃描頻率為5Hz。但是好像要求按鍵必須加防抖,并且為了提高按鍵輸入可靠性,由于機(jī)械觸點的彈性振動, 因而在按鍵閉合和斷開的瞬間均會出現(xiàn)一連串的抖動,按鍵的抖動會造成按一次鍵產(chǎn)生的開關(guān)狀態(tài)被 CPU 誤讀幾次。 為了使 CPU 能正確地讀取按鍵 狀態(tài),必須在按鍵閉合或斷開時,消除產(chǎn)生的前沿或后沿抖動。一、 仿真波形及波形分析(一) 復(fù)位、開始()注:以下關(guān)于點陣顯示的仿真都是最開始測試用的模塊,并不包含點陣動態(tài)顯示的所有狀
9、態(tài),只是挑選其中一些典型狀態(tài)展示,而且點陣掃描紅色和綠色是分開的。1.復(fù)位:當(dāng)按下復(fù)位鍵的時候,停止對點陣的掃描,點陣上無任務(wù)圖形顯示。2開始:當(dāng)按下開始鍵的時候,點陣開始進(jìn)行行掃描,開始倒計時顯示“GO- 6-5-4-3-2-1”,上圖為點陣用紅色LED顯示“GO”。(二)點陣顯示勝利、失敗勝利:當(dāng)玩家在30s之內(nèi)到達(dá)了迷宮的終點,游戲結(jié)束并點陣顯示“V”的標(biāo)志。上圖為當(dāng)信號victory置高電平的時候,點陣開始行掃描,并將紅色、綠色LED均點亮顯示“V”,上圖可明顯地看出。失敗:當(dāng)玩家在30s之內(nèi)沒有到達(dá)迷宮的終點,游戲結(jié)束并且點陣顯示“X”的標(biāo)志。上圖為信號fail置高電平的時候,點陣開
10、始行掃描,并將紅色、綠色LED均點亮顯示“X”,由上圖可以明顯地看出。(三)數(shù)碼管倒計時數(shù)碼管倒計時:實際上應(yīng)該是四位數(shù)碼管從30.00s倒計時,為了方便展示將倒計時的計數(shù)變量改成二進(jìn)制,上圖中輸出信號ledshow代表數(shù)碼管段選的信號,而ledstate代表數(shù)碼管位選的信號,變量ledsao表示分五次對四位數(shù)字加上一個小數(shù)點進(jìn)行掃描。上圖紅色圈中表示顯示小數(shù)點,“00000001”表示小數(shù)點,而ledstate在“111110 111101 111011 110111 111011 ”五個狀態(tài)之間循環(huán)表示對四位數(shù)字和一個小數(shù)點的顯示。而ledshow顯示相應(yīng)的數(shù)字。(四)按鍵防抖按鍵防抖: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; -開始和復(fù)位鍵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); -數(shù)碼管狀態(tài)ledshow:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -數(shù)碼管顯示END maze;ARCHITECTURE main of maze IS signal cnt : integer range 0 to 25000; -分頻器的計數(shù) 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、倒計時開機(jī)畫面的時鐘信號 signal binclk: std_logic; -按鍵時鐘信號shared variable tend : integer range 0 to 1; signal tostart : std_logic; -開始標(biāo)志信號 signal preset : std_logic; -邏輯判斷模塊重置signal dotreset : std_logic; -點陣模塊重置 signal ledreset : std_logic; -數(shù)碼管重置 signal treset : std_logic; -計時器重置 signal pwork : std_logic; -邏輯判
15、斷模塊工作 signal dotwork : std_logic; -點陣工作 signal ledwork : std_logic; -數(shù)碼管工作 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; -數(shù)碼管的掃描shared variable daojishi :integer range 0 to 7; -開機(jī)動畫倒計時掃描shared variable dotsao :integer range 0 to 3;shared variable mapsao :integer range 0 to 9;shared variable x :integer range -7 to 0; -小人的坐標(biāo)shared variable y :integer r
17、ange -6 to 1;shared variable count :integer range 0 to 9; -count和count10分別代表步數(shù)的個位和十位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倒計時的位數(shù)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 -數(shù)碼管顯示高低電平初始化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) -開機(jī)動畫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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)員工轉(zhuǎn)正述職報告8篇
- 學(xué)習(xí)自我鑒定范文集合十篇
- 醫(yī)生年終工作總結(jié)7篇
- 某國際機(jī)場線工程施工組織設(shè)計
- 2025年部編版新教材語文一年級下冊第五單元教案
- 七年級語文的教學(xué)工作個人總結(jié)范文(33篇)
- 人教版2022年三年級語文期末復(fù)習(xí)-作文訓(xùn)練(童話)B卷
- 2025年合成材料阻燃劑項目合作計劃書
- 攤位租賃協(xié)議書
- 2025年城市市容管理服務(wù)項目發(fā)展計劃
- 歷代反腐完整
- 《現(xiàn)代控制理論》(劉豹-唐萬生)
- 廣東省佛山市南海區(qū)三水區(qū)2022-2023學(xué)年七年級上學(xué)期期末歷史試題(無答案)
- 譯林版小學(xué)英語六年級上冊英文作文范文
- 淺談“五育并舉”背景下中小學(xué)勞動教育的探索與研究 論文
- 大樹的故事 單元作業(yè)設(shè)計
- 新加坡雙語教育政策發(fā)展研究
- (全國通用版)小學(xué)英語四大時態(tài)綜合練習(xí)(含答案)
- 走近翻譯學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
- 互聯(lián)網(wǎng)體檢對話版
- 西方憲政民主主義思潮34張課件
評論
0/150
提交評論