北郵10210332陳大文-2012數(shù)字電路與邏輯設(shè)計實驗電子版報告_第1頁
北郵10210332陳大文-2012數(shù)字電路與邏輯設(shè)計實驗電子版報告_第2頁
北郵10210332陳大文-2012數(shù)字電路與邏輯設(shè)計實驗電子版報告_第3頁
北郵10210332陳大文-2012數(shù)字電路與邏輯設(shè)計實驗電子版報告_第4頁
北郵10210332陳大文-2012數(shù)字電路與邏輯設(shè)計實驗電子版報告_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)字電路與邏輯設(shè)計實驗報告PAGEPAGE542012年數(shù)字電路與邏輯設(shè)計實驗報告題目:簡易地鐵自動售票系統(tǒng)學(xué)院:信息與通信工程學(xué)院班級:2010211122姓名:陳大文學(xué)號:10210332班內(nèi)序號:05指導(dǎo)教師:袁東明老師摘要:VHDL語言對于復(fù)雜的數(shù)字系統(tǒng)的設(shè)計,它有獨特的作用。它的硬件描述能力強,能輕易的描述出硬件的結(jié)構(gòu)和功能。這種語言的應(yīng)用至少意味著兩種重大的改變:電路的設(shè)計可以通過文字描述的方式完成;電子電路可以當(dāng)作文件一樣來存儲。隨著現(xiàn)代技術(shù)的發(fā)展,這種語言的效益與作用日益明顯,每年均能夠以超過30的速度快速成長。這次課程設(shè)計就是利用VHDL語言設(shè)計地鐵售票系統(tǒng)的核心功能QuartusII軟件作為發(fā)平臺,設(shè)計城市地鐵售票系統(tǒng)程序并進(jìn)行仿真。使其實現(xiàn)選票種、選擇張數(shù)、出票、找零等功能。關(guān)鍵詞:地鐵,售票,VHDL語言,QuartusIIAbstract:VHDLlanguageisusedtodescribethebehaviorandstructureofelectronicsystemsbutisparticularlysuitedasalanguagetodescribethestructureandbehaviorofdigitalelectronichardwaredesigns.Theapplicationofitmeanstwochanges:electrocircuitdesigncanbedonebythekindoffiledescription.andelectrocircuitcanbestoredasafile.Itisusedtolowerthecostandreducethedesigncycle.Itcansupplydesigners’needseasily.Withthedevelopmentofmoderntechnologyitgrowsmorethan30everyyear.TheGraduationProjectjustsimulatetickedsalessystemofmetrouseVHDLlanguageanditundertheplatformofQuartusII.Thefunctionsstyleselect,numbersselect,ticketout,bidsallwillbeshowingintheemulator.Keyword:Subway,tickedsales,VHDL,QuartusII目錄一.實驗任務(wù)要求 11.基本要求 12.提高要求 1二.系統(tǒng)設(shè)計 11.設(shè)計思路 12.系統(tǒng)總體框圖 23.分模塊設(shè)計 6三.仿真波形及波形分析 91.a)系統(tǒng)復(fù)位 92.b)選擇車票種類 103.c)選擇車票數(shù)量 114.d)-f)投幣 125.g)系統(tǒng)自動出票 146.h)系統(tǒng)自動找零 157.i)再次購買 158.j)取消操作 169.k)整個購票過程結(jié)束 16四.源程序 171.主程序SubwayAutoTicketSellSystem.vhd 172.2k分頻模塊div_2k.vhd 303.500k分頻模塊div_500k.vhd 324.投幣按鍵防抖模塊keyin.vhd 34五.功能說明 351.a)系統(tǒng)復(fù)位 352.b)選擇車票種類 363.c)選擇車票數(shù)量 374.d)-f)投幣 385.g)系統(tǒng)自動出票 406.h)系統(tǒng)自動找零 417.i)再次購買 428.j)取消操作 439.k)整個購票過程結(jié)束 43六.元器件清單及資源利用情況 441.a(chǎn)).數(shù)碼管 442.b).LED燈 453.c).撥碼開關(guān) 454.d).按鈕 465.e).管腳 47七.故障及問題分析 471.?dāng)?shù)碼管顯示 472.按鍵防抖 47八.總結(jié)與結(jié)論 481.主程序SubwayAutoTicketSellSystem.vhd 482.鳴謝 49一、實驗任務(wù)要求設(shè)計制作一個簡易地鐵自動售票系統(tǒng)?;疽螅旱罔F票價統(tǒng)一為每張兩元,只能投入幣值為五元的人民幣進(jìn)行購票。能夠開機(jī)自檢,檢驗顯示器件正常。通過按鍵開關(guān)BTN輸入購票張數(shù)和投入的人民幣張數(shù)并恰當(dāng)顯示相應(yīng)信息。設(shè)置適當(dāng)?shù)穆曇籼崾净蝻@示提示表示取票和找零。一次購票成功后系統(tǒng)能夠恰當(dāng)?shù)剞D(zhuǎn)入下一次購票等待狀態(tài)。系統(tǒng)能夠復(fù)位。提高要求:將投幣種類增加為1元、5元和10元三種。系統(tǒng)設(shè)計設(shè)計思路購買車票時,乘客按“開始購票”按鈕開始購票;接著,選擇車票的種類,即單價,分2元、4元、6元;選擇購票數(shù)量,一次購票數(shù)限制在3張以內(nèi),選擇1張、2張、3張;然后,進(jìn)入投幣階段,投入錢幣,投入的錢幣設(shè)計為1元、5元、10元幣種;當(dāng)投入的錢幣達(dá)到所需金額時,系統(tǒng)進(jìn)入出票以及找零狀態(tài),售票機(jī)自動出票,并自動找出余額;然后,再次點擊“開始購票”進(jìn)行另一次購票。選擇出站口或投幣過程中,乘客都可以按“取消”按鈕取消該次交易。選擇出站口的過程中,若按“取消”按鈕,則售票機(jī)直接進(jìn)入到找零狀態(tài);投幣過程中,若按“取消”,則售票機(jī)將乘客已經(jīng)投入的錢幣全部退出,即進(jìn)入找零狀態(tài),。客人一次只能選擇一個車票種類。3種票類型用3位二進(jìn)制向量編碼表示,即001表示選擇2元車票,010表示選擇2元車票,100選擇2元車票。實驗之前設(shè)計的是3種票類型用2位二進(jìn)制碼表示,因為考慮到仿真及下載到實驗板模擬的方便,遂將之改為3位,使之每一個類型用一個按鍵控制。票機(jī)的進(jìn)幣口可識別三種紙幣,仿照c)中模式,擬用長度為3的二進(jìn)制表示。乘客可以連續(xù)多次投入錢幣,并且可以以任意順序投入。紙幣最多可以投入27元。用5位二進(jìn)制數(shù)表示5個狀態(tài),分別是狀態(tài)程序標(biāo)示代表狀態(tài)00001Selstyle等待選擇票種狀態(tài)00010Selticket等待選擇購票數(shù)量狀態(tài)00100Inputmoney等待放入錢幣狀態(tài)01000Ticketout出票狀態(tài)10000Givechagne找零狀態(tài)系統(tǒng)總體框圖圖1圖2圖3圖4圖5圖6分模塊設(shè)計經(jīng)過分析,本地鐵自動售票系統(tǒng)的設(shè)計需要實現(xiàn)以下幾項主要功能:票種選擇,票數(shù)選擇,投幣處理,出票及余額找零.本系統(tǒng)可以采用模塊化設(shè)計和有限狀態(tài)機(jī)的設(shè)計方案來實現(xiàn)。采用模塊化設(shè)計方法即從整個系統(tǒng)的功能出發(fā),將系統(tǒng)的整體逐步分解為若干個子系統(tǒng)和模塊,然后用VHDL語言對各個模塊進(jìn)行編程,最后形成頂層文件,在QuartusⅡ環(huán)境下進(jìn)行編譯與仿真,檢查所編程序是否運行正確。如果出現(xiàn)錯誤,需要進(jìn)行修改,直到完全通過為止。采用模塊化設(shè)計的優(yōu)點在于:對設(shè)計的描述從上到下逐步由粗略到詳細(xì),符合常規(guī)的邏輯思維習(xí)慣。便于由多個設(shè)計者同時進(jìn)行設(shè)計從而加速整個項目的開發(fā)進(jìn)度;每個子模塊都能夠靈活使用綜合和實現(xiàn)工具獨立進(jìn)行優(yōu)化,從而達(dá)到更好的優(yōu)化結(jié)果;調(diào)試、更改某個子模塊時,不會影響其他模塊的實現(xiàn)結(jié)果,保證了整個設(shè)計的穩(wěn)定性與可靠性。有限狀態(tài)機(jī)(FiniteStateMachine,簡稱FSM)是指輸出向量不僅依賴于當(dāng)前輸入向量,也依賴于過去輸入向量序列的電路.一個有限狀態(tài)機(jī)電路由寄存器邏輯(時序邏輯)和組合邏輯組成.有限狀態(tài)機(jī)是數(shù)字邏輯電路以及數(shù)字系統(tǒng)的重要組成部分,尤其應(yīng)用于數(shù)字系統(tǒng)核心部件的設(shè)計,以實現(xiàn)高效率高可靠性的邏輯控制。一般有限狀態(tài)機(jī)的VHDL組成:說明部分:主要是設(shè)計者使用TYPE語句定義新的數(shù)據(jù)類型,如:TYPEstatesIS(st0,st1,st2,st3,st4,st5);SIGNALpresent_state,next_state:states;主控時序邏輯部分:任務(wù)是負(fù)責(zé)狀態(tài)機(jī)運轉(zhuǎn)和在外部時鐘驅(qū)動下實現(xiàn)內(nèi)部狀態(tài)轉(zhuǎn)換的進(jìn)程。時序進(jìn)程的實質(zhì)是一組觸發(fā)器,因此,該進(jìn)程中往往也包括一些清零或置位的輸入控制信號,如Reset信號。主控組合邏輯部分:任務(wù)是根據(jù)狀態(tài)機(jī)外部輸入的狀態(tài)控制信號(包括來自外部的和狀態(tài)機(jī)內(nèi)部的非進(jìn)程的信號)和當(dāng)前的狀態(tài)值current_state來確定下一狀態(tài)next_state的取值內(nèi)容,以及對外部或?qū)?nèi)部其他進(jìn)程輸出控制信號的內(nèi)容。輔助邏輯部分:輔助邏輯部分主要是用于配合狀態(tài)機(jī)的主控組合邏輯和主控時序邏輯進(jìn)行工作,以完善和提高系統(tǒng)的性能。無論與基于VHDL的其它設(shè)計方案相比,還是與可完成相似功能的CPU相比,狀態(tài)機(jī)都有其難以逾越的優(yōu)越性,它主要表現(xiàn)在以下幾方面:由于狀態(tài)機(jī)的結(jié)構(gòu)模式相對簡單,設(shè)計方案相對固定,特別是可以定義符號化枚舉類型的狀態(tài),這一切都為VHDL綜合器盡可能發(fā)揮其強大的優(yōu)化功能提供了有利條件。而且,性能良好的綜合器都具備許多可控或不可控的專門用于優(yōu)化狀態(tài)機(jī)的功能。狀態(tài)機(jī)容易構(gòu)成性能良好的同步時序邏輯模塊,這對于對付大規(guī)模邏輯電路設(shè)計中令人深感棘手的競爭冒險現(xiàn)象無疑是一個上佳的選擇,加之綜合器對狀態(tài)機(jī)的特有的優(yōu)化功能,使的狀態(tài)機(jī)解決方案的優(yōu)越性更為突出。狀態(tài)機(jī)的VHDL設(shè)計程序?qū)哟畏置?,結(jié)構(gòu)清晰,易讀易懂,易排錯和修改。在高速運算和控制方面,狀態(tài)機(jī)更有其巨大的優(yōu)勢。由于在VHDL中,一個狀態(tài)機(jī)可以由多個進(jìn)程構(gòu)成,一個結(jié)構(gòu)體中可以包含多個狀態(tài)機(jī),而一個單獨的狀態(tài)機(jī)(或多個并行運行的狀態(tài)機(jī))以順序方式的所能完成的運算和控制方面的工作與一個CPU類似。就運行速度而言,狀態(tài)機(jī)狀態(tài)變換周期只有一個時鐘周期,而且,由于在每一狀態(tài)中,狀態(tài)機(jī)可以完成許多并行的運算和控制操作,所以,一個完整的控制程序,即使由多個并行的狀態(tài)機(jī)構(gòu)成,其狀態(tài)數(shù)也是十分有限的。因此有理由認(rèn)為,由狀態(tài)機(jī)構(gòu)成的硬件系統(tǒng)比CPU所能完成同樣功能的軟件系統(tǒng)的工作速度要高出兩個數(shù)量級。就可靠性而言,狀態(tài)機(jī)的優(yōu)勢也是十分明顯的。首先是由于狀態(tài)機(jī)的設(shè)計中能使用各種無懈可擊的容錯技術(shù);其次是當(dāng)狀態(tài)機(jī)進(jìn)入非法狀態(tài)并從中跳出所耗的時間十分短暫,通常只有2個時鐘周期,約數(shù)十個ns,尚不足以對系統(tǒng)的運行構(gòu)成損害.應(yīng)用VHDL設(shè)計狀態(tài)機(jī)的具體步驟如下:(1)根據(jù)系統(tǒng)要求確定狀態(tài)數(shù)量、狀態(tài)轉(zhuǎn)移的條件和各狀態(tài)輸出信號的賦值,并畫出狀態(tài)轉(zhuǎn)移圖;(2)按照狀態(tài)轉(zhuǎn)移圖編寫狀態(tài)機(jī)的VHDL設(shè)計程序;(3)利用EDA工具對狀態(tài)機(jī)的功能進(jìn)行仿真驗證。經(jīng)過綜合比較,決定采用狀態(tài)機(jī)來實現(xiàn)本系統(tǒng)的設(shè)計,這樣不僅思路很清楚而且可讀性也非常強.利用狀態(tài)機(jī)實現(xiàn)售票功能。需要首先把整個系統(tǒng)的所有狀態(tài)都給羅列出來,然后實現(xiàn)每個狀態(tài)的內(nèi)容,最后再利用一些變量將各個狀態(tài)連接起來,實現(xiàn)整個系統(tǒng)的基本功能.Kinin模塊是用來防抖的,由于按鍵動作的時刻和按下的時間長短是隨機(jī)的。并且存在由開關(guān)簧片反彈導(dǎo)致的電平抖動,抖動的時間一般小于20mS,因此必須為每個按鍵開關(guān)設(shè)置一個消抖和同步電路,此電路可有多種形式。按一次鍵,只產(chǎn)生一個脈沖,脈沖寬度為防抖動時鐘的脈寬。在投幣的時候,由于要多次投幣,多次按鍵,使之在按鍵的時候,每按一次,程序只會執(zhí)行一次。防抖動時鐘的頻率為100HZ左右,接下來得為其設(shè)置一個分頻系數(shù)為500k的分頻。div_500k是系數(shù)為500k的分頻,為的是把實驗板50mHz的頻率分為100Hz,使防抖電路正常工作。div_2k是系數(shù)為2k的分頻,為的是把實驗板50mHz的頻率分為25000Hz,每個數(shù)碼管工作頻率到2000Hz左右。仿真波形及波形分析a).系統(tǒng)復(fù)位圖7系統(tǒng)復(fù)位,Restart='1';系統(tǒng)進(jìn)入第一個狀態(tài)state=00001,系統(tǒng)所有數(shù)據(jù)清零,Selstyle,等待選擇票種狀態(tài),6個數(shù)碼管顯示000000;b).選擇車票種類圖8選擇車票種類,style=“100“代表買單價為6元的車票,系統(tǒng)進(jìn)入第二個狀態(tài)state=00010,Selticket,等待選擇購票數(shù)量狀態(tài),6個數(shù)碼管顯示600000;c).選擇車票數(shù)量圖9選擇車票數(shù)量,Tnum=“100“代表購票3張,系統(tǒng)進(jìn)入第三個狀態(tài)state=00100,Inputmoney,等待放入錢幣狀態(tài),MoneyInputAlarm=‘1‘代表錢幣不足,6個數(shù)碼管顯示630000;d).投入錢幣圖10投入錢幣,Money=”010”代表投入5元,錢幣不足,系統(tǒng)依舊停留在第三個狀態(tài)state=00100,MoneyInputAlarm=‘1‘代表錢幣不足,6個數(shù)碼管顯示630500,等待放入錢幣;e).第二次投入錢幣圖11第二次投入錢幣,Money=”100”代表投入10元,但錢幣依舊不足(6*3=18>5+10=15),判斷Castmoney<Totalmoney,系統(tǒng)依舊停留在第三個狀態(tài)state=00100,MoneyInputAlarm=’1’代表錢幣不足,6個數(shù)碼管顯示631500,等待放入錢幣;f).第三次投入錢幣圖12第三次投入錢幣,Money=“010“代表投入5元,錢幣足夠(6*3=18<5+10+5=20),判斷Castmoney>Totalmoney,MoneyInputAlarm=‘0‘代表錢幣已足,系統(tǒng)進(jìn)入第四個狀態(tài),state=01000,Ticketout,出票狀態(tài);g).系統(tǒng)自動出票系統(tǒng)自動出票,Tout=‘1‘顯示在3個周期代表出票3張,系統(tǒng)進(jìn)入第五個狀態(tài),state=10000,Givechagne,找零狀態(tài)。h).系統(tǒng)自動找零系統(tǒng)自動找零,Mout[0]=’1’持續(xù)兩個周期代表檢測restmoney>1,依次找出2張1元的紙幣,找零結(jié)束,6個數(shù)碼管顯示632032,State=”10000”代表狀態(tài)停留在找零階段。i).再次購買圖13之后,Rebuy=‘1‘,代表再次購票,進(jìn)入第一個狀態(tài)state=00001,系統(tǒng)數(shù)據(jù)清零,Selstyle,等待選擇票種狀態(tài),6個數(shù)碼管顯示000000;j).取消操作圖14在c),d),e)之后,如果想取消交易,cancelkey=’1’,系統(tǒng)進(jìn)入找零狀態(tài),如,在d)之后取消,自動找零,Mout[1]=‘1‘代表檢測到restmoney>5,找出一張5元的紙幣,找零結(jié)束,6個數(shù)碼管顯示630505; k).整個購票過程結(jié)束。源程序1.主程序SubwayAutoTicketSellSystem.vhdFileName:SubwayAutoTicketSellSystem.vhd--Description:Achievethefunctionofautoticketselling--Limition:None--System:Vhdl9.0--Soft:Quartus2-9.0--Author:ChenDawen--Revision:Version1.0,2012-10-31libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitySubwayAutoTicketSellSystemisport(Restart:instd_logic;--系統(tǒng)復(fù)位信號Rebuy:instd_logic;--開始購票操作Clk:instd_logic;--系統(tǒng)時鐘Cancelkey:instd_logic;--取消操作鍵Style:instd_logic_vector(2downto0);--車票種類Tnum:instd_logic_vector(2downto0);--所購票數(shù)Money:instd_logic_vector(2downto0);--投幣口MoneyInputAlarm:outstd_logic;--投幣不足報警信號Tout:outstd_logic;--出票Mout:outstd_logic_vector(1downto0);--余額找出State:outstd_logic_vector(4downto0);--系統(tǒng)狀態(tài)指示--beep:outstd_logic; --蜂鳴器信號SG:outstd_logic_vector(6downto0);--段碼 BT:outstd_logic_vector(5downto0) --位碼);endSubwayAutoTicketSellSystem;architecturebehaveofSubwayAutoTicketSellSystemis componentdiv_2K --引入div_2k分頻模塊 port(clk_in:instd_logic; clk_out:outstd_logic); endcomponent; componentdiv_500K --引入div_500k分頻模塊 port(clk_in2:instd_logic; clk_out2:outstd_logic); endcomponent;componentkeyin --引入keyin防抖模塊 port(clk_in1:instd_logic;reset:instd_logic;resetn:outstd_logic); endcomponent;typeTTis(selstyle,selticket,inputmoney,ticketout,givechange);--定義系統(tǒng)轉(zhuǎn)換狀態(tài)(等待選擇票種狀態(tài),等待選擇購票數(shù)量狀態(tài),等待放入錢幣狀態(tài),出票狀態(tài),找零狀態(tài)) signalclk_tmp:std_logic; --臨時時鐘 signalclk_tmp2:std_logic; --臨時時鐘2 signal CNT6:INTEGERRANGE0TO5;signal A:INTEGERRANGE0TO5;signalTstyle:std_logic_vector(6downto0);--車票單價顯示signalTnumber:std_logic_vector(6downto0);--車票數(shù)量顯示signalMinput1:std_logic_vector(6downto0);--投入金額十位顯示 signalMinput2:std_logic_vector(6downto0);--投入金額個位顯示signalMinput:std_logic_vector(4downto0);--投入金額計數(shù) signalToutnum0:std_logic_vector(6downto0);--出票數(shù)量顯示signalToutnum:std_logic_vector(1downto0);--出票數(shù)量計數(shù) signalChangeout0:std_logic_vector(6downto0);--輸出零錢數(shù)顯示signalChangeout:std_logic_vector(3downto0);--輸出零錢數(shù)量計數(shù)signalMoneyn:std_logic_vector(2downto0);--防抖之后實際投幣輸入beginu1:div_2kportmap(clk_in=>CLK,clk_out=>clk_tmp);--各種映射u2:div_500kportmap(clk_in2=>CLK,clk_out2=>clk_tmp2);u4:keyinportmap(clk_in1=>CLK_tmp2,reset=>money(0),resetn=>moneyn(0));u5:keyinportmap(clk_in1=>clk_tmp2,reset=>money(1),resetn=>moneyn(1));u6:keyinportmap(clk_in1=>clk_tmp2,reset=>money(2),resetn=>moneyn(2));以下為數(shù)碼管顯示程序模塊 process(CNT6)begincaseCNT6is --3線至6線譯碼器when0=>BT<="011111";A<=0; --A為位碼when1=>BT<="101111";A<=1;when2=>BT<="110111";A<=2;when3=>BT<="111011";A<=3;when4=>BT<="111101";A<=4;when5=>BT<="111110";A<=5;whenothers=>NULL;endcase; endprocess; process(clk_tmp)beginifclk_tmp'eventandclk_tmp='1'then--實現(xiàn)模6計數(shù)器 ifCNT6=5then CNT6<=0; else CNT6<=CNT6+1; endif; endif; endprocess; process(A) begincaseAis --實現(xiàn)數(shù)碼管的顯示功能 when0=>SG<=Tstyle; when1=>SG<=Tnumber; when2=>SG<=Minput1; when3=>SG<=Minput2; when4=>SG<=Toutnum0; when5=>SG<=Changeout0; whenothers=>NULL; endcase; endprocess; process(Minput)--投入金額數(shù)碼管顯示 begin caseMinputiswhen"11011"=>Minput1<="1101101";Minput2<="1110000";--27when"11010"=>Minput1<="1101101";Minput2<="1011111";--26when"11001"=>Minput1<="1101101";Minput2<="1011011";--25when"11000"=>Minput1<="1101101";Minput2<="0110011";--24when"10111"=>Minput1<="1101101";Minput2<="1111001";--23when"10110"=>Minput1<="1101101";Minput2<="1101101";--22when"10101"=>Minput1<="1101101";Minput2<="0110000";--21when"10100"=>Minput1<="1101101";Minput2<="1111110";--20when"10011"=>Minput1<="0110000";Minput2<="1111011";--19when"10010"=>Minput1<="0110000";Minput2<="1111111";--18when"10001"=>Minput1<="0110000";Minput2<="1110000";--17when"10000"=>Minput1<="0110000";Minput2<="1011111";--16when"01111"=>Minput1<="0110000";Minput2<="1011011";--15when"01110"=>Minput1<="0110000";Minput2<="0110011";--14when"01101"=>Minput1<="0110000";Minput2<="1111001";--13when"01100"=>Minput1<="1111110";Minput2<="1101101";--12when"01011"=>Minput1<="0110000";Minput2<="0110000";--11when"01010"=>Minput1<="0110000";Minput2<="1111110";--10when"01001"=>Minput1<="1111110";Minput2<="1111011";--09when"01000"=>Minput1<="1111110";Minput2<="1111111";--08when"00111"=>Minput1<="1111110";Minput2<="1110000";--07when"00110"=>Minput1<="1111110";Minput2<="1011111";--06when"00101"=>Minput1<="1111110";Minput2<="1011011";--05when"00100"=>Minput1<="1111110";Minput2<="0110011";--04when"00011"=>Minput1<="1111110";Minput2<="1111001";--03when"00010"=>Minput1<="1111110";Minput2<="1101101";--02when"00001"=>Minput1<="1111110";Minput2<="0110000";--01when"00000"=>Minput1<="1111110";Minput2<="1111110";--00 whenothers=>null; endcase; endprocess;process(Changeout)--找零金額數(shù)碼管顯示 begin caseChangeoutis when"1001"=>Changeout0<="1111011";--09 when"1000"=>Changeout0<="1111111";--08 when"0111"=>Changeout0<="1110000";--07 when"0110"=>Changeout0<="1011111";--06 when"0101"=>Changeout0<="1011011";--05 when"0100"=>Changeout0<="0110011";--04 when"0011"=>Changeout0<="1111001";--03 when"0010"=>Changeout0<="1101101";--02 when"0001"=>Changeout0<="0110000";--01 when"0000"=>Changeout0<="1111110";--00 whenothers=>null; endcase; endprocess; process(Toutnum)--出票數(shù)量數(shù)碼管顯示 begin caseToutnumis when"11"=>Toutnum0<="1111001";--03 when"10"=>Toutnum0<="1101101";--02 when"01"=>Toutnum0<="0110000";--01 when"00"=>Toutnum0<="1111110";--00 whenothers=>null; endcase; endprocess; 以上為數(shù)碼管顯示程序模塊 process(clk_tmp,restart)--下載時候所用時鐘頻率--process(clk,restart)--仿真時候所用時鐘頻率variablenext_state:TT;variableTm:integerrange0to6;--車票單價variabletotalmoney,castmoney,restmoney:integerrange0to27;--車票總額,投幣總額,找零總額variablenum:integerrange0to3;--所購票數(shù)variableempty:std_logic;--找零結(jié)束標(biāo)志beginif(clk_tmp'eventandclk_tmp='1')then--下載時候所用時鐘頻率--if(clk_tmp'eventandclk_tmp='1')then--仿真時候所用時鐘頻率State<="00001";--系統(tǒng)等待狀態(tài)ifRestart='1'then以下為系統(tǒng)復(fù)位初始化Tout<='0';Mout<="00";MoneyInputAlarm<='0';totalmoney:=0; castmoney:=0;restmoney:=0;Tstyle<="1111110";--數(shù)碼管顯示0Tnumber<="1111110";--數(shù)碼管顯示0Minput<="00000";--數(shù)碼管顯示0Toutnum<="00";--數(shù)碼管顯示0Changeout<="0000";--數(shù)碼管顯示0以上為系統(tǒng)復(fù)位初始化next_state:=selstyle;--系統(tǒng)復(fù)位,回到初始選站狀態(tài)elsecasenext_stateis whenselstyle=>--選擇出票種casestyleis--共3種車票類型when"000"=>Tm:=0;Tstyle<="1111110";--000代表未選擇 when"001"=>Tm:=2; Tstyle<="1101101";--001代表選擇單價2元車票 when"010"=>Tm:=4; Tstyle<="0110011";--010代表選擇單價2元車票 when"100"=>Tm:=6; Tstyle<="1011111";--100代表選擇單價2元車票 whenothers=>null; endcase; ifTm/=0then next_state:=selticket;--選票種結(jié)束,進(jìn)入選票數(shù)狀態(tài) elsenext_state:=selstyle;--未選票種,停留在選票種狀態(tài) endif; whenselticket=>--選擇票數(shù)State<="00010";--等待選擇購票數(shù)量狀態(tài)if(Cancelkey='1')thennext_state:=givechange;--選票期間取消操作,直接進(jìn)入找零狀態(tài)else caseTnumiswhen"001"=>--001代表選擇1張車票 totalmoney:=totalmoney+1*Tm;--計算票價 num:=1; Tnumber<="0110000"; --數(shù)碼管顯示1when"010"=>--010代表選擇2張車票 totalmoney:=totalmoney+2*Tm; num:=2; Tnumber<="1101101"; --數(shù)碼管顯示2when"100"=>--100代表選擇3張車票 totalmoney:=totalmoney+3*Tm; num:=3;--最多購3張票 Tnumber<="1111001"; --數(shù)碼管顯示3 whenothers=>null;endcase; iftotalmoney/=0then next_state:=inputmoney;--選票結(jié)束,進(jìn)入投幣狀態(tài) elsenext_state:=selticket;--未選票,停留在選票狀態(tài) endif;endif; wheninputmoney=>--進(jìn)行投幣State<="00100";--等待放入錢幣狀態(tài)ifMoneyn(0)='1'then--下載時所用投幣按鍵1元--ifMoney(0)='1'then--仿真時所用投幣按鍵1元castmoney:=castmoney+1;--投幣錢數(shù)計數(shù)增加1Minput<=minput+"00001";--投幣數(shù)碼管顯示增加1elsifMoneyn(1)='1'then--下載時所用投幣按鍵5元--elsifMoney(1)='1'then--仿真時所用投幣按鍵5元castmoney:=castmoney+5;--投幣錢數(shù)計數(shù)增加5Minput<=minput+"00101";--投幣數(shù)碼管顯示增加5elsifMoneyn(2)='1'then--下載時所用投幣按鍵10元--elsifMoney(2)='1'then--仿真時所用投幣按鍵10元castmoney:=castmoney+10;--投幣錢數(shù)計數(shù)增加10Minput<=minput+"01010";--投幣數(shù)碼管顯示增加10--連續(xù)投幣,并進(jìn)行累加 endif; if(Cancelkey='1')then--投幣期間取消操作,直接進(jìn)入找零狀態(tài)退還所投錢幣MoneyInputAlarm<='0';restmoney:=castmoney;next_state:=givechange;elseif(castmoney<totalmoney)then--比較投幣總額與車票總額MoneyInputAlarm<='1';--投幣不足警報亮next_state:=inputmoney;--投幣不足,繼續(xù)進(jìn)入投幣狀態(tài)elseMoneyInputAlarm<='0';--投幣不足警報滅next_state:=ticketout;--投幣足夠,進(jìn)入出票狀態(tài) endif;endif; whenticketout=>--出票 State<="01000";--等待出票狀態(tài) casenumis when0=>null; when1=> Tout<='1';--每個時鐘周期出一張票num:=num-1;--出票數(shù)減1Toutnum<=toutnum+"01";--數(shù)碼管顯示出票數(shù)加1 when2=> num:=num-1;--出票數(shù)減1 Tout<='1'; Toutnum<=toutnum+"01";--數(shù)碼管顯示出票數(shù)加1 when3=> num:=num-1;--出票數(shù)減1 Tout<='1'; Toutnum<=toutnum+"01";--數(shù)碼管顯示出票數(shù)加1 endcase; if(num=0)thenrestmoney:=castmoney-totalmoney;next_state:=givechange;--出票結(jié)束,余額找出 elsenext_state:=ticketout;--繼續(xù)出票 endif;--beep<='1'; --蜂鳴器工作-- beep<='0'after500ms;--延時500ms蜂鳴器停止工作whengivechange=>--余額找出,按從大到小原則退錢(10元,5元,1元) State<="10000";--等待找零狀態(tài)Tout<='0'; empty:='0'; if(restmoney>=5)then--5元 restmoney:=restmoney-5;--找零減5 Mout<="10";--找零數(shù)碼管顯示加5 Changeout<=changeout+"0101"after3000ms;elsif(restmoney>=1)then--1元 restmoney:=restmoney-1;--找零減1 Mout<="01";--找零數(shù)碼管顯示加1 Changeout<=changeout+"0001"after3000ms; elseMout<="00"; empty:='1';--余額找出結(jié)束標(biāo)志 endif; ifempty='1'then--找零結(jié)束,回到選站狀態(tài)-- next_state:=selstyle;-- totalmoney:=0;-- castmoney:=0;-- else next_state:=givechange;--繼續(xù)找零 endif;-- beep<='1'; --蜂鳴器工作-- beep<='0'after500ms;--延時500ms蜂鳴器停止工作-- whenothers=>--其他任何情況,均回到選站狀態(tài)-- next_state:=selstyle; ifrebuy='1'then--再次購票 next_state:=selstyle; State<="00001";--各種清零Tstyle<="1111110";Tout<='0';Mout<="00";totalmoney:=0; castmoney:=0;restmoney:=0;Tnumber<="1111110";Minput<="00000";Toutnum<="00";Changeout<="0000";else next_state:=givechange; endif; endcase; endif;endif; endprocess;endbehave;2.2k分頻模塊div_2k.vhdFileName:div_2k.vhd--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:Vhdl_9.0--Soft:Quartus2_9.0--Author:ChenDawen--Revision:Version1.0,2012-10-31LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_unsigned.all;entitydiv_2kisport(clk_in:instd_logic;clk_out:outstd_logic);enddiv_2k;architectureaofdiv_2kissignaltemp:integerrange0to1999;beginp1:process(clk_in)beginifclk_in'eventandclk_in='1'theniftemp=1999thentemp<=0;elsetemp<=temp+1;endif;endif;endprocessp1;p2:process(temp)beginiftemp=1999thenclk_out<='1';elseclk_out<='0';endif;endprocessp2;enda;3.500k分頻模塊div_500k.vhdFileName:div_500k.vhd--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:Vhdl_9.0--Soft:Quartus2_9.0--Author:ChenDawen--Revision:Version1.0,2012-10-31LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;useieee.std_logic_unsigned.all;entitydiv_500kis--防抖信號分頻為100Hzport(clk_in2:instd_logic;clk_out2:outstd_logic);enddiv_500k;architecturecofdiv_500kissignaltemp:integerrange0to4999999;beginp1:process(clk_in2)beginifclk_in2'eventandclk_in2='1'theniftemp=4999999thentemp<=0;elsetemp<=temp+1;endif;endif;endprocessp1;p2:process(temp)beginiftemp=4999999thenclk_out2<='1';elseclk_out2<='0';endif;endprocessp2;endc;4.投幣按鍵防抖模塊keyin.vhdFileName:keyin.vhd--Description:Helptoachievethefunctionofautoticketselling--Limition:None--System:Vhdl_9.0--Soft:Quartus2_9.0--Author:ChenDawen--Revision:Version1.0,2012-10-31LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;entitykeyinis--投幣按鍵防抖port(clk_in1:instd_logic;reset:instd_logic;resetn:outstd_logic);endkeyin;architecturebofkeyinissignalresetmp1,resetmp2:std_logic;beginprocess(clk_in1)beginifclk_in1'eventandclk_in1='1'thenresetmp2<=resetmp1;resetmp1<=reset;endif;endprocess;resetn<=resetmp1and(notresetmp2);endb;功能說明系統(tǒng)復(fù)位,SW0撥一次,Restart='1';LD7亮,系統(tǒng)進(jìn)入第一個狀態(tài)state=00001,系統(tǒng)所有數(shù)據(jù)清零,Selstyle,等待選擇票種狀態(tài),6個數(shù)碼管顯示000000;圖15選擇車票種類,BTN7,BTN6,BTN5分別代表2元車票,4元車票,6元車票,按下相應(yīng)按鈕后(此次選6元),數(shù)碼管DISP5顯示數(shù)字6,LD6亮,系統(tǒng)進(jìn)入第二個狀態(tài)state=00010,Selticket,等待選擇購票數(shù)量狀態(tài),6個數(shù)碼管顯示600000;圖16選擇車票數(shù)量,SW7,SW6,SW5分別代表1張票,2張票,3張票,撥下相應(yīng)的撥碼開關(guān)(此次選擇3張),數(shù)碼管DISP4顯示數(shù)字3,LD5亮,系統(tǒng)進(jìn)入第三個狀態(tài)state=00100,Inputmoney,等待放入錢幣狀態(tài),LD0亮,MoneyInputAlarm代表錢幣不足,6個數(shù)碼管顯示630000;圖17投入錢幣,BTN4,BTN3,BTN2,分別代表投入1元,5元,10元,按下相應(yīng)鍵位后(第一次按下5元),數(shù)碼管DISP3顯示數(shù)字0,DISP2顯示數(shù)字5,代表投入5元,錢幣不足,系統(tǒng)依舊停留在第三個狀態(tài)state=00100,LD5依舊亮,LD0依舊亮,MoneyInputAlarm亮代表錢幣不足,6個數(shù)碼管顯示630500,等待放入錢幣;圖18第二次投入錢幣,BTN4,BTN3,BTN2,分別代表投入1元,5元,10元,按下相應(yīng)鍵位后(第二次按下10元),數(shù)碼管DISP3顯示數(shù)字1,DISP2顯示數(shù)字5,代表投入10元,加上第一次投入的5元,數(shù)碼管顯示15,但錢幣依舊不足(6*3=18>5+10=15),判斷Castmoney<Totalmoney,系統(tǒng)依舊停留在第三個狀態(tài)state=00100,LD5依舊亮,LD0依舊亮,MoneyInputAlarm亮代表錢幣不足,6個數(shù)碼管顯示631500,等待放入錢幣;圖19第三次投入錢幣,BTN4,BTN3,

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論