用VHDL实现有限状态机
背景
在數字系統中,有兩種基本類型的電路。第一類是組合邏輯電路。在組合邏輯電路中,輸出僅依賴于輸入。組合邏輯電路的例子包括加法器,編碼器和多路復用器。例如,在加法器中,輸出只是輸入的總和;?無論以前的輸入或輸出是什么都沒有關系。第二種類型的數字邏輯電路是時序邏輯電路。在順序邏輯電路中,輸出不僅取決于輸入,還取決于系統的當前狀態(即輸出值和任何內部信號或變量)。順序邏輯電路的復雜程度不同于簡單的計數器,這些計數器以基本序列(例如,0,1,2,3 ... 0,1,2,3 ...)從一種狀態移動到另一種狀態,到超大規模電路(例如微處理器)本文的重點將放在順序邏輯電路表示為有限狀態機以及如何將這些有限狀態機轉換為硬件描述語言VHDL。
順序邏輯系統是有限狀態機(FSM)。作為FSM,它們由一組狀態,一些輸入,一些輸出以及一組從狀態到狀態的規則組成。在進行數字系統設計時,從定義系統如何??與有限狀態機模型一起工作開始非常常見。這一設計步驟允許設計人員從高級角度考慮設計,而不必考慮系統將實施什么樣的硬件或實施設計需要哪些設計工具。一旦完全設計FSM,如果設計良好,則很容易用硬件描述語言(例如Verilog或VHDL)寫出設計,以便在數字IC(集成電路)上實現。
本文將通過首先定義設計問題來完成創建數字系統的設計過程,其次,將系統的計算模型創建為有限狀態機,然后將FSM轉換為硬件描述語言VHDL。(VHDL實際上是雙重縮寫詞,VHDL代表VHSIC硬件描述語言,VHSIC代表甚高速集成電路)。
讀者應該有一些數字電路和IC的經驗。他們還應該對VHDL有基本的了解,或者至少有一些閱讀結構化計算機代碼的經驗。使用計算機代碼的經驗將幫助你認識到VHDL的一些結構和結構,但應該指出的是,VHDL不是一種編程語言;?它是一種硬件描述語言(HDL)。換句話說,您所編寫的語句將在您正在設計的系統中創建硬件(門,觸發器等)。
?
有限狀態機
要設計的系統是一個非常簡單的系統,其目的是引入將FSM轉換為VHDL的想法。此FSM具有四個狀態:A,B,C,和d。該系統具有被稱為一個輸入信號P,和的值P確定什么狀態系統移動到下一個。只要輸入P為高電平(1),系統就會將狀態從A更改為B至C至D.?如果P低,并且系統處于狀態A,B或C,則狀態不會改變。如果系統處于狀態d,則切換到乙如果P高和一,如果P低。系統還有一個稱為R的輸出,如果處于狀態D,則該輸出為1?,否則它是0.圖1是FSM的示意圖,但首先這里是關于此圖的一些注釋:
- 圓圈代表狀態
- 圓圈之間的箭頭代表從狀態變為狀態的規則。例如,在這個系統中,如果輸入P等于1(否則它保持在狀態A),狀態機從狀態A移到狀態B,
- 圓圈下方的信息代表每種狀態下的輸出值。
- 從“無處”到A的箭頭表示A是初始狀態。
圖1.簡單的有限狀態機
?
這個完全定義的狀態機可以很容易地轉換為VHDL。請記住,在編寫VHDL代碼時,您正在做的是描述如何實現硬件(即數字門)。因此,例如,當您在此系統中定義一組狀態(如A,B,C和D)時,這些狀態將由位來表示,更具體地由觸發器的輸出表示。在一個有四個狀態的系統中,就像這個狀態一樣,可以用2個位來表示這四個狀態(2個觸發器)。還有其他方式可以代表國家。其中一種方法是使用四位,其中每一位表示一個狀態,但一次只能打開一位。所以A將由0001表示,B乘以0010,C乘以0100,D乘以1000.使用高級硬件描述語言的好處之一是,您通常可以忽略這一級別的細節。
圖2顯示了在將VHDL代碼合成為創建硬件時將創建的硬件電路的總體思路。
圖2.為狀態機創建的邏輯的框圖表示
此圖表明,有一組?觸發器表示的狀態。還有一些邏輯使用觸發器的輸出和系統的輸入來確定下一個狀態。最后,有一些邏輯解碼觸發器的輸出值來創建m個輸出信號。
同樣,在使用HDL時,您通常可以忽略設計中的這一級別細節。了解HDL創建什么樣的電路仍然很重要,因為可能會有一段時間您必須計算并最小化設計中的邏輯門數。了解您的HDL聲明創建的內容后,您可以設計最大限度地減少大門的創建。
?
VHDL設計實現
編寫此FSM的VHDL的第一步是定義VHDL實體。VHDL實體描述了您正在設計的系統的外部接口,其中包括輸入,輸出和實體名稱。實體名稱將為SimpleFSM,輸入為時鐘信號,復位信號和P信號,輸出為R信號。應該提到的是,時鐘信號是周期性的高低電平信號,它控制著這個同步系統的定時。任何同步系統都有一個控制時鐘信號,用于同步系統中的所有模塊,使它們同時發生變化。
把所有的信息放在一起給出一個看起來像這樣的SimpleFSM實體:
ENTITY SimpleFSM is -- SimpleFSM實體定義 PORT (clock: ?? IN STD_LOGIC;P: ?????? IN STD_LOGIC;reset: ?? IN STD_LOGIC;R : ????? OUT STD_LOGIC); END SimpleFSM;?
關于實體的最后一點是所有的輸入和輸出都是單個位,所以可以使用數據類型std_logic,它是VHDL中的標準類型,用于單位信號。
?
下一步是定義實體的功能;?這塊VHDL被稱為體系結構。我們正在實現的功能是圖1中定義的狀態機的功能。下面的示例顯示了實現SimpleFSM所需的代碼。雖然這段代碼是特定于SimpleFSM的,但我會描述代碼中的每一部分,以便將代碼替換為您自己的狀態機的代碼是一個簡單的過程。
?
Architecture RTL of SimpleFSM is TYPE State_type IS (A, B, C, D); -- 定義狀態SIGNAL State : State_Type; -- 創建信號 -- 不同狀態 BEGIN PROCESS (clock, reset) BEGIN If (reset = ‘1’) THEN -- 復位reset,復位狀態為AState <= A;ELSIF rising_edge(clock) THEN -- clock上升沿觸發狀態轉變CASE State IS-- If the current state is A and P is set to 1, then the-- next state is BWHEN A => IF P='1' THEN State <= B; END IF; -- If the current state is B and P is set to 1, then the-- next state is CWHEN B => IF P='1' THEN State <= C; END IF; -- If the current state is C and P is set to 1, then the-- next state is DWHEN C => IF P='1' THEN State <= D; END IF; -- If the current state is D and P is set to 1, then the-- next state is B.-- If the current state is D and P is set to 0, then the-- next state is A.WHEN D=> IF P='1' THEN State <= B; ELSE State <= A; END IF; WHEN others =>State <= A;END CASE; END IF; END PROCESS;R <= ‘1’ WHEN State=D ELSE ‘0’; END rtl;?
這是狀態機所需的全部代碼。現在我們來看看架構代碼的一些細節。
架構定義指出:
Architecture RTL of SimpleFSM is該語句是VHDL體系結構的標準語句,它基本上說明了體系結構中將要描述的抽象級別。代表寄存器傳輸級別的RTL是抽象的中間級別。
行為??是最高級別的抽象,在編寫行為代碼時,您只需要定義輸入和輸出之間的關系,而不指定如何實現這些關系。有時行為描述太高而不能實際合成硬件。如果你正在做一個模擬,只需要一個塊以某種方式行事,那么行為模型就足夠了。
結構??代碼是最低級別的抽象。在編寫結構代碼時,您將描述低層結構(如邏輯門)如何連接在一起以提供所需的系統。如果您需要對將要創建的邏輯門進行精確控制,那么您需要一個結構模型。
RTL適合在中間。它具體描述輸入和輸出之間的關系,描述數據如何在硬件寄存器之間移動。RTL描述可用硬件實現。對于這個特定的例子,了解體系結構類型(行為,RTL或結構)的細微差別并不是很重要,你只需要將它定義為某種東西。
下一個塊定義狀態并創建一個將定義狀態作為其值的信號。在這里列出的狀態應該與FSM圖中由圓圈表示的狀態一一對應。
TYPE State_type IS (A, B, C, D); -- the 4 different statesSIGNAL State : State_Type; -- Create a signal that uses -- the 4 different states?
下一條語句是在其靈敏度列表中使用信號時鐘和復位的VHDL過程的開始
PROCESS (clock, reset) BEGIN If (reset = ‘1’) THEN -- Upon reset, set the state to AState <= A;ELSIF rising_edge(clock) THEN同樣,關于流程聲明的許多細節可以在本文中被忽略。所有你需要了解的是,在RTL級設計中,這個過程將創建一個寄存器,用于在過程中為它們分配的所有信號。在這種情況下,只有狀態信號具有分配,因此將創建由足夠的觸發器組成的用于表示狀態值的寄存器。該寄存器將被同步到時鐘的上升沿,并可通過復位信號進行異步復位。在圖2中可以看到由該過程創建的電路的一般視覺表示。
rising_edge(clock)語句后面的代碼體是一個VHDL?case語句,它將被合成為邏輯,用于控制在時鐘的每個上升沿上State變化的值。例如,聲明
WHEN A => IF P='1' THEN State <= B; END IF;意味著如果狀態的值為A,則如果信號P為1,則在時鐘上升沿將狀態更改為B.
案例中的最后一個陳述是
WHEN others =>State <= A;這個陳述是一個全面的聲明,以確保如果狀態不知為何具有不等于A,B,C或D的值,那么它將重置為A的值。
代碼的最后一部分在流程之外完成并創建一個組合邏輯塊。?
R <= ‘1’ WHEN State=D ELSE ‘0’;這個陳述正在做的是確定輸出R的值。如果國家是D,R將是1在所有其他州將為0。這里需要注意的一點是,這個狀態機的輸出僅依賴于狀態。目前狀態是確定輸出的唯一狀態的狀態機稱為Moore狀態機。另一大類的狀態機是輸出不僅取決于當前狀態,還取決于輸入。這種狀態機稱為Mealy狀態機。在實踐中,使用什么樣的狀態機通常沒有關系,如果您知道您使用的是哪種狀態機,則無關緊要。所有重要的是你按照你的定義來實現狀態機。
設計這個系統的最后幾個步驟將包括模擬系統以確保它完成預期的工作,然后在物理系統(CPLD,FPGA,ASIC等)上最終綜合硬件實現。
?
概要
這些圖表顯示了有限狀態機圖和實現狀態機所需的VHDL代碼之間的關系。
圖3. FSM圖和VHDL中的狀態定義
?
圖4. FSM圖和VHDL中的狀態轉換規則
圖5. FSM圖和VHDL中的輸出
總結
本文對硬件描述語言的本質以及HDL語句與所實現硬件之間的關系進行了一些討論。但是,主要目的是向您展示如何編寫VHDL來實現有限狀態機。該過程涉及創建一個定義狀態機的輸入和輸出的VHDL實體,然后在VHDL體系結構塊中寫入狀態轉換的規則。使用此處提供的模板,您應該擁有實現自己的FSM所需的所有信息。
總結
以上是生活随笔為你收集整理的用VHDL实现有限状态机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全国计算机一本通app,驾考宝典一本通
- 下一篇: Xcp调试