狀態機及其VHDL設計說明_第1頁
狀態機及其VHDL設計說明_第2頁
狀態機及其VHDL設計說明_第3頁
狀態機及其VHDL設計說明_第4頁
狀態機及其VHDL設計說明_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

./第7章狀態機及其VHDL設計容提要:有限狀態機〔FiniteStateMachine,簡稱FSM是一類很重要的時序電路,是許多數字系統的核心部件,也是實時系統設計中的一種數學模型,是一種重要的、易于建立的、應用比較廣泛的、以描述控制特性為主的建模方法,它可以應用于從系統分析到設計的所有階段。有限狀態機的優點在于簡單易用,狀態間的關系清晰直觀。建立有限狀態機主要有兩種方法:"狀態轉移圖"和"狀態轉移表"。標準狀態機通常可分為Moore和Mealy兩種類型。本章主要介紹了基于VHDL的常見有限狀態機的類型、結構、功能及表達方法,重點是如何有效地設計與實現。學習要求:了解狀態機的基本結構、功能和分類,掌握有限狀態機的一般設計思路與方法、狀態機編碼方案的恰當選取、Moore和Mealy狀態機的本質區別及設計實現。關鍵詞:狀態機<StateMachine>,Moore,Mealy,VHDL設計<VHDLDesign>7.1狀態機的基本結構和功能7.2一般狀態機的VHDL設計7.2.1狀態機的一般組成7.2.2狀態機的編碼方案7.3摩爾狀態機的VHDL設計7.4米立狀態機的VHDL設計7.1狀態機的基本結構和功能狀態機的基本結構如圖7.1所示。除了輸人信號、輸出信號外,狀態機還包含一組寄存器記憶狀態機的部狀態。狀態機寄存器的下一個狀態及輸出,不僅同輸入信號有關,而且還與寄存器的當前狀態有關,狀態機可以認為是組合邏輯和寄存器邏輯的特殊組合。它包括兩個主要部分:即組合邏輯部分和寄存器。組合邏輯部分又可分為狀態譯碼器和輸出譯碼器,狀態譯碼器確定狀態機的下一個狀態,即確定狀態機的激勵方程,輸出譯碼器確定狀態機的輸出,即確定狀態機的輸出方程。寄存器用于存儲狀態機的部狀態。輸出輸出輸入狀態譯碼器狀態寄存器狀態狀態圖7.1狀態機的基本結構圖7.1狀態機的基本結構狀態機的基本操作有兩種:1.狀態機的部狀態轉換。狀態機經歷一系列狀態,下一狀態由狀態譯碼器根據當前狀態和輸入條件決定。2.產生輸出信號序列。輸出信號由輸出譯碼器根據當前狀態和輸入條件確定。用輸入信號決定下一狀態也稱為"轉移"。除了轉移之外,復雜的狀態機還具有重復和歷程功能。從一個狀態轉移到另一狀態稱為控制定序,而決定下一狀態所需的邏輯稱為轉移函數。在產生輸出的過程中,根據是否使用輸入信號可以確定狀態機的類型。兩種典型的狀態機是米立〔Mealy狀態機和摩爾〔Moore狀態機。摩爾狀態機的輸出只是當前狀態的函數,而米立狀態機的輸出一般是當前狀態和輸入信號的函數。對于這兩類狀態機,控制定序都取決于當前狀態和輸入信號。大多數實用的狀態機都是同步的時序電路,由時鐘信號觸發進行狀態的轉換。時鐘信號同所有的邊沿觸發的狀態寄存器和輸出寄存器相連,使狀態的改變發生在時鐘的上升或下降沿。在數字系統中.那些輸出取決于過去的輸入和當前的輸入的部分都可以作為有限狀態機。有限狀態機的全部"歷史"都反映在當前狀態上。當給FSM一個新的輸入時,它就會產生一個輸出。輸出由當前狀態和輸入共同決定,同時FSM也會轉移到下一個新狀態,也是隨著FSM的當前狀態和輸入而定。FSM中,其部狀態存放在寄存器中,下一狀態的值由狀態譯碼器中的一個組合邏輯——轉移函數產生,狀態機的輸出由另一個組合邏輯——輸出函數產生。建立有限狀態機主要有兩種方法:狀態轉移圖〔狀態圖和狀態轉移表〔狀態表。它們是等價的,相互之間可以轉換。狀態轉移圖如圖7.2所示,圖中每個橢圓表示狀態機的一個狀態,而箭頭表示狀態之間的一個轉換,引起轉換的輸入信號及當前輸出表示在轉換箭頭上。摩爾狀態機和米立狀態機的表示方法不同,摩爾狀態機的狀態譯碼輸出寫在狀態圈,米立狀態機的狀態譯碼輸出寫在箭頭旁,如圖7.3所示。輸入輸入/出輸入/出輸入/出輸入/出輸入/出輸入/出狀態A狀態B狀態C狀態D狀態E狀態狀態B01狀態A00I/01I/01狀態A狀態B圖7.2狀態轉移圖圖7.3摩爾和米立狀態機圖7.2狀態轉移圖圖7.3摩爾和米立狀態機如果能夠寫出FSM的狀態轉移圖,就可以使用VHDL的狀態機語句對它進行描述。狀態轉移表形式如表7.1所示。表中的行列出了全部可能的輸入信號組合和部狀態以及相應的次狀態和輸出,因此狀態表規定了狀態機的轉換函數和輸出函數。然而,狀態表不適合具有大量輸入的系統,因為隨著輸入的增加其狀態數和系統的復雜性會顯著增加。表7.1狀態轉移表現態輸入次態輸出S0-SnI0-ImS0-SnQ0-QP狀態轉移圖、狀態轉移表這兩種有限狀態機的建立方法是等價的,都描述了同一硬件結構,它們可以相互轉換,但各有優缺點,分別適合于不同場合。7.2一般狀態機的VHDL設計7.2.1狀態機的一般組成用VHDL設計有限狀態機方法有多種,但最一般和最常用的狀態機設計通常包括說明部分,主控時序部分,主控組合部分和輔助進程部分。1>說明部分說明部分中使用TYPE語句定義新的數據類型,此數據類型為枚舉型,其元素通常都用狀態機的狀態名來定義。狀態變量定義為信號,便于信息傳遞,并將狀態變量的數據類型定義為含有既定狀態元素的新定義的數據類型。說明部分一般放在結構體的ARCHITECTURE和BEGIN之間。2>主控時序進程是指負責狀態機運轉和在時鐘驅動正負現狀態機轉換的進程。狀態機隨外部時鐘信號以同步方式工作,當時鐘的有效跳變到來時,時序進程將代表次態的信號next_state中的容送入現態信號current_state中,而next_state中的容完全由其他進程根據實際情況而定,此進程中往往也包括一些清零或置位的控制信號。3>主控組合進程根據外部輸入的控制信號〔包括來自外部的和狀態機容的非主控進程的信號或〔和當前狀態值確定下一狀態next_state的取值容,以及對外或對部其他進程輸出控制信號的容。4>輔助進程用于配合狀態機工作的組合、時序進程或配合狀態機工作的其他時序進程。在一般狀態機的設計過程中,為了能獲得可綜合的,高效的VHDL狀態機描述,建議使用枚舉類數據類型來定義狀態機的狀態,并使用多進程方式來描述狀態機的部邏輯。例如可使用兩個進程來描述,—個進程描述時序邏輯,包括狀態寄存器的工作和寄存器狀態的輸出,另一個進程描述組合邏輯,包括進程間狀態值的傳遞邏輯以及狀態轉換值的輸出。必要時還可以引入第三個進程完成其它的邏輯功能。下例描述的狀態機由兩個主控進程構成,其中進程REG為主控時序進程,COM為主控組合進程。[例7.1]LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYs_machineISPORT<clk,reset:INSTD_LOGIC;State_inputs:INSTD_LOGIC_VECTOR<0TO1>;comb_outputs:OUTSTD_LOGIC_VECTOR<0TO1>>;ENDENTITYs_machine;ARCHITECTUREbehvOFs_machineISTYPEstatesIS<st0,st1,st2,st3>;--定義states為枚舉型數據類型SIGNALcurrent_state,next_state:states;BEGINREG:PROCESS<reset,clk>--時序邏輯進程BEGINIFreset='1'THEN--異步復位Current_state<=st0;ELSIFclk='1'ANDclk'EVENTTHENcurrent_state<=next_state;--當檢測到時鐘上升沿時轉換至下一狀態ENDIF;ENDPROCESS;--由信號current_state將當前狀態值帶出此進程,進入進程COMCOM:PROCESS<current_state,state_Inputs>--組合邏輯進程BEGINCASEcurrent_stateIS--確定當前狀態的狀態值WHENst0=>comb_outputs<="00";--初始狀態譯碼輸出"00"IFstate_inputs="00"THEN--根據外部的狀態控制輸入"00"next_state<=st0;--在下一時鐘后,進程REG的狀態將維持為st0ELSEnext_state<=st1;--否則,在下一時鐘后,進程REG的狀態將為st1ENDIF;WHENst1=>comb_outputs<="01";--對應狀態st1的譯碼輸出"01"IFstate_inputs="00"THEN--根據外部的狀態控制輸人"00"next_state<=st1;--在下一時鐘后,進程REG的狀態將維持為st1ELSEnext_state<=st2;--否則,在下一時鐘后,進程REG的狀態將為st2ENDIF;WHENst2=>comb_outputs<="10";--以下依次類推IFstate_inputs="11"THENnext_state<=st2;ELSEnext_state<=st3;ENDIF;WHENst3=>comb_outputs<="11";IFstate_inputs="11"THENnext_state<=st3;ELSEnext_state<=st0;ENDIF;ENDCASE;ENDPROCESS;ENDARCHITECTUREbehv;圖7.4為上述狀態機的工作時序圖。reset為異步復位信號,低電平有效,而clk為上升沿有效。如在第3個脈沖上升沿到來時current_state="st0",state_inputs="01",輸出comb_outputs="01"。第4個脈沖上升沿到來時current_state="st1",state_inputs="00",輸出comb_outputs="01"。綜合后的RTL圖如圖7.5所示。圖7.4例7.1狀態機的工作時序圖圖7.5例7.1狀態機的RTL圖一般來說,程序的不同進程間是并行運行的,但由于敏感信號設置的不同和電路的延遲,在時序上進程間的動作是有先后的。如對上例中的狀態轉換行為來說,有進程REG和COM,它們的敏感信號表分別為〔reset,clk和〔current_state,state_inputs,在clk上升沿到來時,進程REG將首先運行,完成狀態轉換的賦值操作。如果外部控制信號state_inputs不變,只有當來自進程REG的信號current_state改變時,進程COM才開始動作,并將根據current_state和state_inputs的值來決定下一有效時鐘沿到來后,進程REG的狀態轉換方向。這個狀態機的兩位組合邏輯輸出comb_outputs是對當前狀態的譯碼。我們可以通過這個輸出值來了解狀態機部的運行情況,同時還可以利用外部控制信號state_inputs任意改變狀態機的狀態變化模式。注意:在上例中,有兩個信號起到了互反饋的作用,完成了兩個進程間的信息傳遞的功能,這兩個信號分別是current_state〔進程REG->進程COM>和next_state<進程COM->進程REG>。在VHDL中可以有兩種方式來創建反饋機制:即使用信號的方式和使用變量的方式。通常傾向于使用信號的方式〔如例7.1。一般而言,在進程中使用變量傳遞數據,然后使用信號將數據帶出進程。在設計過程中,如果希望輸出的信號具有寄存器鎖存功能,則需要為此輸出寫第3個進程,并把clk和reset信號放入敏感信號表中。但必須注意避免由于寄存器的引入而創建了不必要的異步反饋路徑。根據VHDL綜合器的規則,對于所有可能的輸入條件,如果進程中的輸出信號沒有被明確的賦值時,此信號將自動被指定,即在未列出的條件下保持原值,這就意味著引入了寄存器。因此,我們在程序的綜合過程中,應密切注意VHDL綜合器給出的警告信息,并根據警告信息對程序作必要的修改。一般來說,利用狀態機進行設計有如下幾個步驟:<1>分析設計要求,列出狀態機的全部可能狀態,并對每一個狀態進行編碼。<2>根據狀態轉移關系和輸出函數畫出狀態轉移圖。<3>由狀態轉移圖,用VHDL語句對狀態機描述。7.2.2狀態機的編碼方案在狀態機的編碼方案中,有兩種重要的編碼方法:二進制編碼和一位熱碼<One—Hot>編碼。在二進制編碼的狀態機中,狀態位<B>與狀態<S>的數目之間的關系為B=log2S,如兩位狀態位就有00,01,10,11四個不同狀態,它們在不同的控制信號下可以進行狀態轉換,但如果各觸發器又沒有準確地同時改變其輸出值,那么在狀態01變到10時則會出現暫時的11或00狀態輸出,這類險象可能使整個系統造成不可預測的結果。這時,采用格雷碼二進制編碼是特別有益,在該編碼方案中,每次僅一個狀態位的值發生變化。一位熱碼編碼就是用n個觸發器來實現n個狀態的編碼方式,狀態機中的每一個狀態都由其中一個觸發器的狀態來表示。如4個狀態的狀態機需4個觸發器,同一時間僅一個狀態位處于邏輯1電平,四個狀態分別為:0001、0010、0100、1000。在實際應用中,根據狀態機的復雜程度、所使用的器件系列和從非法狀態退出所需的條件來選擇最適合的編碼方案,使之能確保高效的性能和資源的利用。對復雜的狀態機,二進制編碼需用的觸發器的數目比一位熱碼編碼的少。如100個狀態的狀態機按二進制編碼僅用7個觸發器就可以實現,而一位熱碼編碼則要求100個觸發器。另一方面,雖然一位熱碼編碼要求用較多的觸發器,但邏輯上通常相對簡單些。在二進制編碼的狀態機中,控制從一個狀態轉換到另一個狀態的邏輯與所有7個狀態位以及狀態機的輸入均有關。這類邏輯通常要求到狀態位輸入的函數是多輸入變量的。然而,在一熱戀位編碼的狀態機中,到狀態位的輸入常常是其它狀態位的簡單函數。站在器件結構的角度,不同結構支持其確定的編碼類型。MAX+plusII編譯程序對所采用的器件系列自動地選擇最合適的編碼方法〔除非在設計文件中規定了具體的編碼方案。例如,FLEX7000器件系列是寄存器增強型〔Register-intensive,以這類器件為對象的狀態機最好選用一位熱碼編碼方案來實現。由于一位熱碼編碼的狀態機降低了送到每一個狀態位的邏輯電路的復雜程度,因而可提高用FLEX7000器件實現的狀態機的性能。MAX5000和MAX7000器件系列最適合二進制狀態機編碼方案。這兩類器件都能夠利用共享和并聯的擴展乘積項有效地實現復雜的邏輯函數。因此,在這兩類器件小,可以容納復雜的組合邏輯函數而不會浪費資源或損失性能。另外,在選擇編碼方案時,必須考慮狀態機可能進入的潛在的非法狀態的數目。如果違反了狀態位觸發器的建立或保持時間,又沒有定義所有可能出現的狀態,則你的設計會終止在非法狀態上。MAX+plusII設計進入方法允許你定義非法狀態和規定你的狀態機如何從非法狀態中退出。例如,用二進制編碼實現一個14個狀態的狀態機需4個狀態位。這將有16個可能的狀態,故該狀態機僅有兩個可能的狀態是非法狀態。然而一位熱碼編碼的狀態機通常有更多的潛在的非法狀態。14個狀態的一位熱碼編碼的狀態機需要14個狀態。一位熱碼編碼的狀態機的非法狀態數目由方程式〔2n-n確定,其中n為狀態機的狀態個數。因此,一位熱碼編碼的14位狀態共有16370個可能的非法狀態。然而,只要設計中不違反狀態位觸發器的建立和保持時間,狀態機將不會進入非法狀態。7.3摩爾狀態機的VHDL設計摩爾有限狀態機輸出只與當前狀態有關,與輸入信號的當前值無關,是嚴格的現態函數。在時鐘脈沖的有效邊沿作用后的有限個門延后,輸出達到穩定值。即使在時鐘周期輸入信號發生變化,輸出也會保持穩定不變。從時序上看,Moore狀態機屬于同步輸出狀態機。Moore有限狀態機最重要的特點就是將輸入與輸出信號隔離開來。例7.2就是一個典型的Moore型狀態機實例。狀態機的狀態圖如圖7.6所示。000011S10001S41000S20010S30100圖7.6Moore狀態機的狀態圖[例7.2]LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYmooreISPORT<clk,datain,reset:INstd_logic;dataout:OUTstd_logic_vector<3DOWNTO0>>;ENDENTITYmoore;ARCHITECTUREarcOFmooreISTYPEstate_typeIS<s1,s2,s3,s4>;SIGNALstate:state_type;BEGINstate_process:PROCESS<clk,reset>--時序邏輯進程BEGINIFreset='1'THEN--異步復位state<=s1;ELSIFclk'eventandclk='1'THEN--當檢測到時鐘上升沿時執行CASE語句CASEstateISWHENS1=>IFdatain='1'THENstate<=s2;ENDIF;WHENs2=>IFdatain='0'THENstate<=s3;ENDIF;WHENs3=>IFdatain='1'THENstate<=s4;ENDIF;WHENs4=>IFdatain='0'THENstate<=s1;ENDIF;ENDCASE;ENDIF;ENDPROCESS;--由信號state將當前狀態值帶出此進程,進入進程output_poutput_p:PROCESS<state>--組合邏輯進程BEGINCASEstateIS--確定當前狀態值WHENs1=>dataout<="0001";--對應狀態s1的數據輸出為"0001"WHENs2=>dataout<="0010";WHENs3=>dataout<="0100";WHENs4=>dataout<="1000";ENDCASE;ENDPROCESS;ENDARCHITECTURarc;上例的VHDL描述中包含了兩個進程:state_process和output_p,分別為時序邏輯進程和組合邏輯進程。圖7.7是例7.2的工作時序圖,由圖可見,狀態機在異步復位信號后state=s1,在第500ns有效上升時鐘沿到來時,state=s1,datain=1,從而state由s1轉換為s2,輸出dataout=0010,即使在500ns后的一個時鐘周期輸入信號發生變化,輸出也會維持穩定不變。綜合后的結果見圖7.8所示。圖7.7Moore的工作時序圖圖7.8Moore的RTL圖7.4米立狀態機的VHDL設計Mealy狀態機的輸出是現態和所有輸入的函數,隨輸入變化而隨時發生變化。從時序上看,Mealy狀態機屬于異步輸出狀態機,它不依賴于時鐘,但Mealy狀態機和Moore狀態機的設計基本上相同。例7.2就是一個典型的Mealy型狀態機實例。狀態機的狀態圖如圖7.9所示。1/00011/00010/00010/00001/00010/10000/00101/01001/0001S1S4S2S3圖圖7.9Moore狀態機的狀態圖例[7.3]LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.ALL;ENTITYmealyISPORT<clk,datain,reset:INstd_logic;dataout:OUTstd_logic_vector<3DOWNTO0>>;ENDENTITYmealy;ARCHITECTUREarcOFmealyISTYPEstate_typeIS<s1,s2,s3,s4>;SIGNALstate:state_type;BEGINstate_process:PROCESS<clk,reset>--時序邏輯進程BEGINIFreset='1'THEN--異步復位state<=s1;ELSIFclk'eventandclk='1'THEN--當檢測到時鐘上升沿時執行CASE語句CASEstateISWHENS1=>IFdatain='1'THENstate<=s2;ENDIF;WHENs2=>IFdatain='0'THENstate<=s3;ENDIF;WHENs3=>IFdatain='1'THENstate<=s4;ENDIF;WHE

溫馨提示

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

評論

0/150

提交評論