新聞中心

EEPW首頁 > EDA/PCB > 設計應用 > Verilog HDL設計進階:有限狀態(tài)機的設計原理及其代

Verilog HDL設計進階:有限狀態(tài)機的設計原理及其代

作者: 時間:2013-08-27 來源:網(wǎng)絡 收藏

對于用FPGA實現(xiàn)的有限狀態(tài)機建議采用獨熱碼。因為雖然采用獨熱編碼多用了兩個觸發(fā)器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數(shù)并無顯著增加。

本文引用地址:http://butianyuan.cn/article/189516.htm


采用了獨熱碼后有了多余的狀態(tài),就有一些不可到達的狀態(tài),為此在CASE語句的最后需要增加default分支項,以確保多余狀態(tài)能回到Idle狀態(tài)。


另外還可以用另一種風格的 模型來表示同一個有限狀態(tài)。在這個模型中,我們用always語句和連續(xù)賦值語句把狀態(tài)機的觸發(fā)器部分和組合邏輯部分分成兩部分來描述,如下所示。


例4.3:有限狀態(tài)機模型3

module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;

parameter //狀態(tài)聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //復位狀態(tài)
end
else
state = Nextstate; //狀態(tài)轉換

assign Nextstate = //狀態(tài)變換條件
(state == Idle ) ? (A ? Start : Idle):
(state==Start ) ? (!A ? Stop : Start ):
(state== Stop ) ? (A ? Clear : Stop ):
(state== Clear) ? (!A ? Idle : Clear) : Idle;

assign F = (( state == Stop) A ); //狀態(tài)輸出
assign G = (( state == Clear) (!A || !Reset)) //狀態(tài)輸出
endmodule

下面是第4種風格的 模型來表示同一個有限狀態(tài)。在這個模型中,我們分別用沿觸發(fā)的always語句和電平敏感的always語句把狀態(tài)機的觸發(fā)器部分和組合邏輯部分分成兩部分來描述。


例4.4:有限狀態(tài)機模型4。

module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;

parameter //狀態(tài)聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;

always @(posedge Clock)
if (!Reset) begin
state = Idle; //默認狀態(tài)
end
else
state = Nextstate; //狀態(tài)轉換

always @( state or A ) begin
F=0;
G=0;
if (state == Idle) begin //處于Idel狀態(tài)時,對A判斷
if (A)
Nextstate = Start; //Start狀態(tài)
else
Nextstate = Idle; //保持Idel狀態(tài)
G=1;
end
else if (state == Start) //處于Start狀態(tài)時,對!A判斷
if (!A)
Nextstate = Stop; //Stop狀態(tài)
else
Nextstate = Start; //保持Start狀態(tài)
else if (state == Stop) //處于Stop狀態(tài)時,對A判斷
if (A)
Nextstate = Clear; //Clear狀態(tài)
else
Nextstate = Stop; //保持Stop狀態(tài)
else if (state == Clear) begin //處于Clear狀態(tài)時,對!A判斷
if (!A)
Nextstate = Idle; //Idel狀態(tài)
else
Nextstate = Clear; //保持Clear狀態(tài)
F=1;
end
else
Nextstate= Idle; //默認狀態(tài)
End
endmodule

上面4個例子是同一個狀態(tài)機的4種不同的 模型,它們都是可綜合的,在設計復雜程度不同的狀態(tài)機時有它們各自的優(yōu)勢。如用不同的綜合器對這4個例子進行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。


下面講解有限狀態(tài)機設計的一般步驟。


(1)邏輯抽象,得出狀態(tài)轉換圖。
就是把給出的一個實際邏輯關系表示為時序邏輯函數(shù),可以用狀態(tài)轉換表來描述,也可以用狀態(tài)轉換圖來描述,這就需要完成以下任務。


① 分析給定的邏輯問題,確定輸入變量、輸出變量以及電路的狀態(tài)數(shù)。通常是取原因(或條件)作為輸入變量,取結果作為輸出變量。
② 定義輸入、輸出邏輯狀態(tài)的含意,并將電路狀態(tài)順序編號。
③ 按照要求列出電路的狀態(tài)轉換表或畫出狀態(tài)轉換圖。
這樣,就把給定的邏輯問題抽象到一個時序邏輯函數(shù)了。


(2)狀態(tài)化簡。
如果在狀態(tài)轉換圖中出現(xiàn)這樣兩個狀態(tài),它們在相同的輸入下轉換到同一狀態(tài)去,并得到一樣的輸出,則稱它們?yōu)榈葍r狀態(tài)。顯然等價狀態(tài)是重復的,可以合并為一個。電路的狀態(tài)數(shù)越少,存儲電路也就越簡單。狀態(tài)化簡的目的就在于將等價狀態(tài)盡可能地合并,以得到最簡的狀態(tài)轉換圖。


(3)狀態(tài)分配。
狀態(tài)分配又稱狀態(tài)編碼。通常有很多編碼方法,編碼方案選擇得當,設計的電路可以很簡單。反之,若編碼方案選得不好,則設計的電路就會復雜許多。


實際設計時,需綜合考慮電路復雜度與電路性能之間的折衷。在觸發(fā)器資源豐富的FPGA或ASIC設計中,采用獨熱編碼(one-hot-coding)既可以使電路性能得到保證,又可充分利用其觸發(fā)器數(shù)量多的優(yōu)勢。


(4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅動方程和輸出方程。


(5)按照方程得出邏輯圖。

用Verilog HDL來描述有限狀態(tài)機,可以充分發(fā)揮硬件描述語言的抽象建模能力,使用always塊語句和case(if)等條件語句及賦值語句即可方便實現(xiàn)。具體的邏輯化簡及邏輯電路到觸發(fā)器映射均可由計算機自動完成。上述設計步驟中的第(2)、(4)、(5)步不再需要很多的人為干預,使電路設計工作得到簡化,效率也有很大的提高。



關鍵詞: Verilog HDL 進階 代碼

評論


相關推薦

技術專區(qū)

關閉