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