VHDL數字系統(tǒng)課程地鐵售票系統(tǒng)設計報告_第1頁
VHDL數字系統(tǒng)課程地鐵售票系統(tǒng)設計報告_第2頁
VHDL數字系統(tǒng)課程地鐵售票系統(tǒng)設計報告_第3頁
VHDL數字系統(tǒng)課程地鐵售票系統(tǒng)設計報告_第4頁
VHDL數字系統(tǒng)課程地鐵售票系統(tǒng)設計報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE2-地鐵模擬售票系統(tǒng)撰寫日期:2013年9月13日目錄一、設計課題要求及分析 -3-二、 流程圖描述 -6-三、 狀態(tài)機設計和狀態(tài)轉移圖描述 -7-四、程序設計及解釋 -7-五、程序調試和驗證 -12-六、 結論 -14-七、 參考文獻 -15-

一、設計課題要求及分析設計題目:地鐵售票模擬系統(tǒng)功能描述:用于模仿地鐵售票的自動售票,完成地鐵售票的核心控制功能。功能要求:售票機有兩個進幣孔,一個是輸入硬幣,一個是輸入紙幣,硬幣的識別1元的硬幣,紙幣的識別5元,10元。乘客可以連續(xù)多次投入錢幣。乘客可以選擇的種類為2元、3元和4元,乘客一次只能選擇一個出站口。購買車票時,乘客先選擇出站名,然后選擇所需的票數,再進行投幣,投入的錢幣未達到所需金額時,顯示信號,提醒錢不夠,需要繼續(xù)投入錢幣,如果投入的錢幣達到所需金額時,售票機自動出票,并找出余額,本次交易結束,等待下一次的交易。在投幣期間,乘客可以按取消鍵取消本次操作,錢幣自動退出。設計分析:經過分析,本地鐵自動售票系統(tǒng)的設計需要實現以下幾項主要功能:站點選擇,票數選擇,投幣處理,出票及余額找零。本系統(tǒng)可以采用模塊化設計和有限狀態(tài)機的設計方案來實現。采用模塊化設計方法即從整個系統(tǒng)的功能出發(fā),將系統(tǒng)的整體逐步分解為若干個子系統(tǒng)和模塊,然后用VHDL語言對各個模塊進行編程,最后形成頂層文件,在QUARTUSⅡ環(huán)境下進行編譯與仿真,檢查所編程序是否運行正確。如果出現錯誤,需要進行修改,直到完全通過為止。采用模塊化設計的優(yōu)點在于:對設計的描述從上到下逐步由粗略到詳細,符合常規(guī)的邏輯思維習慣。便于由多個設計者同時進行設計從而加速整個項目的開發(fā)進度;每個子模塊都能夠靈活使用綜合和實現工具獨立進行優(yōu)化,從而達到更好的優(yōu)化結果;調試、更改某個子模塊時,不會影響其他模塊的實現結果,保證了整個設計的穩(wěn)定性與可靠性。有限狀態(tài)機(FiniteStateMachine,簡稱FSM)是指輸出向量不僅依賴于當前輸入向量,也依賴于過去輸入向量序列的電路.一個有限狀態(tài)機電路由寄存器邏輯(時序邏輯)和組合邏輯組成.有限狀態(tài)機是數字邏輯電路以及數字系統(tǒng)的重要組成部分,尤其應用于數字系統(tǒng)核心部件的設計,以實現高效率高可靠性的邏輯控制。一般有限狀態(tài)機的VHDL組成:說明部分:主要是設計者使用TYPE語句定義新的數據類型,如:TYPEstatesIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:states;主控時序邏輯部分:任務是負責狀態(tài)機運轉和在外部時鐘驅動下實現內部狀態(tài)轉換的進程。時序進程的實質是一組觸發(fā)器,因此,該進程中往往也包括一些清零或置位的輸入控制信號,如Reset信號。主控組合邏輯部分:任務是根據狀態(tài)機外部輸入的狀態(tài)控制信號(包括來自外部的和狀態(tài)機內部的非進程的信號)和當前的狀態(tài)值current_state來確定下一狀態(tài)next_state的取值內容,以及對外部或對內部其他進程輸出控制信號的內容。輔助邏輯部分:輔助邏輯部分主要是用于配合狀態(tài)機的主控組合邏輯和主控時序邏輯進行工作,以完善和提高系統(tǒng)的性能。無論與基于VHDL的其它設計方案相比,還是與可完成相似功能的CPU相比,狀態(tài)機都有其難以逾越的優(yōu)越性,它主要表現在以下幾方面:由于狀態(tài)機的結構模式相對簡單,設計方案相對固定,特別是可以定義符號化枚舉類型的狀態(tài),這一切都為VHDL綜合器盡可能發(fā)揮其強大的優(yōu)化功能提供了有利條件。而且,性能良好的綜合器都具備許多可控或不可控的專門用于優(yōu)化狀態(tài)機的功能。狀態(tài)機容易構成性能良好的同步時序邏輯模塊,這對于對付大規(guī)模邏輯電路設計中令人深感棘手的競爭冒險現象無疑是一個上佳的選擇,加之綜合器對狀態(tài)機的特有的優(yōu)化功能,使的狀態(tài)機解決方案的優(yōu)越性更為突出。狀態(tài)機的VHDL設計程序層次分明,結構清晰,易讀易懂,易排錯和修改。在高速運算和控制方面,狀態(tài)機更有其巨大的優(yōu)勢。由于在VHDL中,一個狀態(tài)機可以由多個進程構成,一個結構體中可以包含多個狀態(tài)機,而一個單獨的狀態(tài)機(或多個并行運行的狀態(tài)機)以順序方式的所能完成的運算和控制方面的工作與一個CPU類似。就運行速度而言,狀態(tài)機狀態(tài)變換周期只有一個時鐘周期,而且,由于在每一狀態(tài)中,狀態(tài)機可以完成許多并行的運算和控制操作,所以,一個完整的控制程序,即使由多個并行的狀態(tài)機構成,其狀態(tài)數也是十分有限的。因此有理由認為,由狀態(tài)機構成的硬件系統(tǒng)比CPU所能完成同樣功能的軟件系統(tǒng)的工作速度要高出兩個數量級。就可靠性而言,狀態(tài)機的優(yōu)勢也是十分明顯的。首先是由于狀態(tài)機的設計中能使用各種無懈可擊的容錯技術;其次是當狀態(tài)機進入非法狀態(tài)并從中跳出所耗的時間十分短暫,通常只有2個時鐘周期,約數十個ns,尚不足以對系統(tǒng)的運行構成損害.應用VHDL設計狀態(tài)機的具體步驟如下:(1)根據系統(tǒng)要求確定狀態(tài)數量、狀態(tài)轉移的條件和各狀態(tài)輸出信號的賦值,并畫出狀態(tài)轉移圖;(2)按照狀態(tài)轉移圖編寫狀態(tài)機的VHDL設計程序;(3)利用EDA工具對狀態(tài)機的功能進行仿真驗證。經過綜合比較,決定采用狀態(tài)機來實現本系統(tǒng)的設計,這樣不僅思路很清楚而且可讀性也非常強.利用狀態(tài)機實現售票功能,僅需要一個模塊,避免了考慮各模塊相連時的控制問題。因此需要首先把整個系統(tǒng)的所有狀態(tài)都給羅列出來,然后實現每個狀態(tài)的內容,最后再利用一些變量將各個狀態(tài)連接起來,實現整個系統(tǒng)的基本功能。狀態(tài)機設計:根據以上的分析,地鐵售票系統(tǒng)可以分為以下五個狀態(tài):(1)selstation:選站狀態(tài)(2)selticket:選票狀態(tài)(3)inputcoin:投幣狀態(tài)(4)ticketout:出票狀態(tài)(5)givechange:找零狀態(tài)而且系統(tǒng)每個狀態(tài)完成以下功能:等待、選站狀態(tài):在該狀態(tài)用戶完成選站功能,選站完成后,tp不為零,自動進入選票狀態(tài)。當無人使用時,系統(tǒng)也停留在該狀態(tài),等待下一個用戶使用。選票狀態(tài):在該狀態(tài)用戶完成選票功能,選票完成后,tmoney不為零,自動進入投幣狀態(tài)。按cancelkey鍵可取消操作,系統(tǒng)回到等待、選站狀態(tài)。投幣狀態(tài):在該狀態(tài)用戶可投幣,可多次投錢,可同時投硬幣和紙幣,但不可同時投一個以上硬幣或一張以上紙幣。用戶投幣后,在該狀態(tài)系統(tǒng)內部完成計算投幣總額的功能,并將計算結果跟所需錢數比較,若錢不夠,回到投幣狀態(tài),也可按cancelkey鍵將錢退出;若錢正好投夠,進入出票狀態(tài).出票結束后,若錢有多余,則自動進入找錢狀態(tài)。出票狀態(tài):在該狀態(tài)完成出票功能,票每周期出一張,直到出夠為止。票全部出完以后,自動進入出錢狀態(tài)。找零狀態(tài):在該狀態(tài)完成出幣功能,若余額不為零,繼續(xù)在此狀態(tài)出幣,若余額已為零,系統(tǒng)回到等待、選站狀態(tài)。給出tp,tmoney,pmoney,num,en幾個變量,控制狀態(tài)間的轉移。根據tp判斷是否完成選站,根據tmoney判斷是否完成選票,根據pmoney判斷投幣是否足夠,根據num判斷出票是否足夠,根據en判斷找錢是否結束.設計中輸入有clk,reset,station,tn,lettuce,coin,cancelkey.其中clk是時鐘周期信號,reset為系統(tǒng)復位信號,station是乘客所選的出站號,而tn表示乘客所選的票數,為方便設計,乘客一次購車票數限制在4張以內.Lettuce表示乘客投入的紙幣,Coin表示乘客投的硬幣,cancelkey是乘客在選票和投幣期間用來取消操作的.設計中輸出有Tout,Mout,MoneyInputAlarm,State.其中Tout表示出票,周期數即是出票數,Mout表示找出的零錢,若所投錢幣總額恰好為車票總額,則Mout一直為0,MoneyInputAlarm表示所投金額不足時發(fā)出的警報,當繼續(xù)投幣至足額時MoneyInputAlarm會自動恢復為0,交易正常進行.State是用來標號各個狀態(tài)的.加這個輸出主要是考慮到調試程序時能更方便地觀察到狀態(tài)之間的轉換,更容易發(fā)現問題,調試程序.流程圖描述:系統(tǒng)上電后首先對于整個系統(tǒng)進行進行復位,處于等待乘客選站狀態(tài);當乘客選擇了出站名之后,系統(tǒng)內部設定相應的票價(2元、3元和4元);然后系統(tǒng)進入選擇購買票數同時計算出票價總額;選票完成后系統(tǒng)轉到投幣狀態(tài),系統(tǒng)對于乘客所投入的硬幣(1元)和紙幣(5元,10元)進行識別,在每次投幣結束后累加投幣總額,然后判斷所投錢幣是否足夠,如果不足繼續(xù)停留在投幣狀態(tài);如果投幣足夠,系統(tǒng)進入到出票狀態(tài),每個周期出一張票,出票結束后進行余額找零;余額找零按照從大到小(10元,5元,1元)的原則逐額進行退錢,找零結束系統(tǒng)返回到初始等待選站狀態(tài);購票過程中,在選擇了站點以后,乘客可以按下取消鍵(cancelkey=1),系統(tǒng)返回等待選站狀態(tài),可以進行重新選站或結束本次操作.在投幣過程中,如果所投錢幣未達到票價總額,乘客按下取消鍵后(cancelkey=1),系統(tǒng)轉到余額找零狀態(tài)逐額找零,找零結束后,重新回到等待選站狀態(tài)。系統(tǒng)框圖描述圖1.系統(tǒng)流程圖狀態(tài)機設計和狀態(tài)轉移圖描述狀態(tài)轉移圖:圖2.狀態(tài)轉移圖程序設計及解釋程序源代碼及解釋:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityAutoTicketSellisport(Reset:instd_logic;--系統(tǒng)復位信號Clk:instd_logic;--系統(tǒng)時鐘Cancelkey:instd_logic;--取消操作鍵Station:instd_logic_vector(11downto0);--出站名Tn:instd_logic_vector(1downto0);--所購票數Coin:instd_logic_vector(1downto0);--硬幣投幣口Lettuce:instd_logic_vector(3downto0);--紙幣投幣口MoneyInputAlarm:outstd_logic;--投幣不足報警信號Tout:outstd_logic;--出票Mout:outstd_logic_vector(3downto0);--余額找出State:outstd_logic_vector(2downto0)--系統(tǒng)狀態(tài)指示);endAutoTicketSell;architecturebehaveofAutoTicketSellistypeFFis(selstation,selticket,inputcoin,ticketout,givechange);--定義系統(tǒng)轉換狀態(tài)(選站,選票,投幣,出票,找零)beginprocess(clk,reset)variablenext_state:FF:=selstation;variableTp:integerrange0to4;--車票單價variabletmoney,pmoney,rmoney:integerrange0to20;--車票總額,投幣總額,找零總額variablenum:integerrange0to3;--所購票數variableen:std_logic;--找零結束標志variablehalf:integerrange0to2;--表示投入1元硬幣beginif(Clk'eventandClk='1')thenifReset='1'next_state:=selstation;--系統(tǒng)復位,回到初始選站狀態(tài)elsecasenext_stateis whenselstation=>--選擇出站名 State<="000";Tout<='0';Mout<="0000";MoneyInputAlarm<='0';tmoney:=0; pmoney:=0;rmoney:=0;--初始化清零casestationiswhen"000000000000"=>Tp:=0; when"000001000010"=>Tp:=2;when"000000000000"=>Tp:=0; when"000001000010"=>Tp:=2; when"000001000011"=>Tp:=2; when"000001000100"=>Tp:=2; when"000001000101"=>Tp:=2; when"000001000110"=>Tp:=2; when"000001000111"=>Tp:=2; when"000001001000"=>Tp:=2; when"000001001001"=>Tp:=2; when"000001001010"=>Tp:=3; when"000001001011"=>Tp:=3; when"000001001100"=>Tp:=3; when"000001001101"=>Tp:=4; when"000001001110"=>Tp:=4; when"000001001111"=>Tp:=4; when"000001010000"=>Tp:=4; when"000001010001"=>Tp:=2; when"000001010010"=>Tp:=2; when"000001010011"=>Tp:=2; when"000001010100"=>Tp:=2; when"000001010101"=>Tp:=3; when"000001010110"=>Tp:=3; when"000001010111"=>Tp:=3; when"000001011000"=>Tp:=3; when"000001011001"=>Tp:=4; when"000001011010"=>Tp:=4; when"000001011011"=>Tp:=4; when"000001011100"=>Tp:=4; when"000001011101"=>Tp:=4; when"000001011110"=>Tp:=4; when"000001011111"=>Tp:=4; when"000001100000"=>Tp:=2; when"000001100001"=>Tp:=2; when"000001100010"=>Tp:=2; when"000001100011"=>Tp:=2; when"000001100100"=>Tp:=2; when"000001100101"=>Tp:=2; when"000001100110"=>Tp:=2; when"000001100111"=>Tp:=2; when"000001101000"=>Tp:=2; when"000001101001"=>Tp:=3; when"000001101010"=>Tp:=3; when"000001101011"=>Tp:=3; when"000001101100"=>Tp:=3; when"000001101101"=>Tp:=4; when"000001101110"=>Tp:=4; when"000001101111"=>Tp:=4; when"000001110000"=>Tp:=4; when"000001110001"=>Tp:=4; when"000001110010"=>Tp:=4; when"000001110011"=>Tp:=4; when"000001110100"=>Tp:=4; when"000001110101"=>Tp:=4; when"000001110110"=>Tp:=4; when"000001110111"=>Tp:=4; whenothers=>null; endcase; ifTp/=0then next_state:=selticket;--選站結束,進入選票狀態(tài) else next_state:=selstation;--未選站,停留在選站狀態(tài) endif; whenselticket=>--選擇票數 State<="001";if(Cancelkey='1')thennext_state:=selstation;--選票期間取消操作,回到選站狀態(tài)else caseTnis when"00"=> tmoney:=tmoney+1*Tp;--計算票價 num:=1; when"01"=> tmoney:=tmoney+2*Tp; num:=2; when"10"=> tmoney:=tmoney+3*Tp; num:=3;when"11"=> tmoney:=tmoney+4*Tp; num:=4;--最多購4張票 whenothers=>null;endcase; iftmoney/=0then next_state:=inputcoin;--選票結束,進入投幣狀態(tài) else next_state:=selticket;--未選票,停留在選票狀態(tài) endif;endif; wheninputcoin=>--進行投幣 State<="010";caseLettuceis--投入紙幣 when"0101"=>--5元 pmoney:=pmoney+5; when"1010"=>--10元 pmoney:=pmoney+10; whenothers=>null;--連續(xù)投幣,并進行累加 endcase; caseCoinis--投入硬幣 when"10"=>--1元 pmoney:=pmoney+1; whenothers=>null;--連續(xù)投幣,并進行累加 endcase; if(Cancelkey='1')then--投幣期間取消操作,退還所投錢幣MoneyInputAlarm<='0';rmoney:=pmoney;next_state:=givechange;else if(pmoney<tmoney)then--比較投幣總額與車票總額MoneyInputAlarm<='1'; next_state:=inputcoin;--投幣不足,繼續(xù)進入投幣狀態(tài)elseMoneyInputAlarm<='0'; next_state:=ticketout;--投幣足夠,進入出票狀態(tài) endif;endif; whenticketout=>--出票 State<="011"; casenumis when0=>null; when1=> Tout<='1';num:=num-1; when2=> num:=num-1; Tout<='1'; when3=> num:=num-1; Tout<='1';--每個時鐘周期出一張票 endcase; if(num=0)thenrmoney:=pmoney-tmoney;next_state:=givechange;--出票結束,余額找出 elsenext_state:=ticketout;--繼續(xù)出票 endif; whengivechange=>--余額找出,按從大到小原則退錢(10元,5元,1元,) State<="100";Tout<='0'; en:='0'; if(rmoney>=10)then--10元 rmoney:=rmoney-10; Mout<="1010"; elsif(rmoney>=5)then--5元 rmoney:=rmoney-5; Mout<="0101";elsif(rmoney>=1)then--1元 rmoney:=rmoney-1; Mout<="0001";elseMout<="0000";endif; en:='1';--余額找出結束標志 endif; ifen='1'then–找零結束,回到選站狀態(tài) next_state:=selstation; tmoney:=0; pmoney:=0; else next_state:=givechange;--繼續(xù)找零 endif; whenothers=>--其他任何情況,均回到選站狀態(tài) next_state:=selstation; endcase; endif;endif; endprocess;endbehave;程序調試和驗證程序編制完成后,對于系統(tǒng)的各項功能分別進行以下調試及仿真:(1)圖3顯示系統(tǒng)處于等待選站狀態(tài)的波形系統(tǒng)開機上電后首先進行復位(Reset=1),所有輸出均為零,系統(tǒng)處于等待選站狀態(tài)(state=000).圖3等待選站狀態(tài)的波形(2)圖4顯示選站未選票的波形選擇元通到下馬坊(000010101101),系統(tǒng)計算票價為3元(Tp=3),系統(tǒng)進入選票狀態(tài)(state=001)。其他所有輸出仍為零。圖4.4選站未選票的波形(3)圖5顯示選站和選票都完成的波形選擇2張票(Tn=2)后,車票總額為6元(tmoney=6),系統(tǒng)進入投幣狀態(tài)(state=010),同時MoneyInputAlarm=1,提醒進行投幣.圖5.顯示選站和選票都完成的波形圖6顯示投入10元紙幣后的波形圖6.投入10元紙幣后的波形投入10元紙幣后,MoneyInputAlarm變?yōu)?,表示投幣足夠,State由2變?yōu)?表示進入了出票狀態(tài),Tout在State3的2個周期都

溫馨提示

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

評論

0/150

提交評論