Verilog HDL設計進階:有限狀態機的設計原理及其代
對于用FPGA實現的有限狀態機建議采用獨熱碼。因為雖然采用獨熱編碼多用了兩個觸發器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數并無顯著增加。本文引用地址:http://www.104case.com/article/189516.htm
采用了獨熱碼后有了多余的狀態,就有一些不可到達的狀態,為此在CASE語句的最后需要增加default分支項,以確保多余狀態能回到Idle狀態。
另外還可以用另一種風格的Verilog HDL模型來表示同一個有限狀態。在這個模型中,我們用always語句和連續賦值語句把狀態機的觸發器部分和組合邏輯部分分成兩部分來描述,如下所示。
例4.3:有限狀態機模型3
module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state ;
wire [1:0] Nextstate;
parameter //狀態聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset) begin
state = Idle; //復位狀態
end
else
state = Nextstate; //狀態轉換
assign Nextstate = //狀態變換條件
(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 ); //狀態輸出
assign G = (( state == Clear) (!A || !Reset)) //狀態輸出
endmodule
下面是第4種風格的Verilog HDL模型來表示同一個有限狀態。在這個模型中,我們分別用沿觸發的always語句和電平敏感的always語句把狀態機的觸發器部分和組合邏輯部分分成兩部分來描述。
例4.4:有限狀態機模型4。
module fsm (Clock, Reset, A, F, G); //模塊聲明
input Clock, Reset, A;
output F,G;
reg [1:0] state, Nextstate;
parameter //狀態聲明
Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset) begin
state = Idle; //默認狀態
end
else
state = Nextstate; //狀態轉換
always @( state or A ) begin
F=0;
G=0;
if (state == Idle) begin //處于Idel狀態時,對A判斷
if (A)
Nextstate = Start; //Start狀態
else
Nextstate = Idle; //保持Idel狀態
G=1;
end
else if (state == Start) //處于Start狀態時,對!A判斷
if (!A)
Nextstate = Stop; //Stop狀態
else
Nextstate = Start; //保持Start狀態
else if (state == Stop) //處于Stop狀態時,對A判斷
if (A)
Nextstate = Clear; //Clear狀態
else
Nextstate = Stop; //保持Stop狀態
else if (state == Clear) begin //處于Clear狀態時,對!A判斷
if (!A)
Nextstate = Idle; //Idel狀態
else
Nextstate = Clear; //保持Clear狀態
F=1;
end
else
Nextstate= Idle; //默認狀態
End
endmodule
上面4個例子是同一個狀態機的4種不同的Verilog HDL模型,它們都是可綜合的,在設計復雜程度不同的狀態機時有它們各自的優勢。如用不同的綜合器對這4個例子進行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。
下面講解有限狀態機設計的一般步驟。
(1)邏輯抽象,得出狀態轉換圖。
就是把給出的一個實際邏輯關系表示為時序邏輯函數,可以用狀態轉換表來描述,也可以用狀態轉換圖來描述,這就需要完成以下任務。
① 分析給定的邏輯問題,確定輸入變量、輸出變量以及電路的狀態數。通常是取原因(或條件)作為輸入變量,取結果作為輸出變量。
② 定義輸入、輸出邏輯狀態的含意,并將電路狀態順序編號。
③ 按照要求列出電路的狀態轉換表或畫出狀態轉換圖。
這樣,就把給定的邏輯問題抽象到一個時序邏輯函數了。
(2)狀態化簡。
如果在狀態轉換圖中出現這樣兩個狀態,它們在相同的輸入下轉換到同一狀態去,并得到一樣的輸出,則稱它們為等價狀態。顯然等價狀態是重復的,可以合并為一個。電路的狀態數越少,存儲電路也就越簡單。狀態化簡的目的就在于將等價狀態盡可能地合并,以得到最簡的狀態轉換圖。
(3)狀態分配。
狀態分配又稱狀態編碼。通常有很多編碼方法,編碼方案選擇得當,設計的電路可以很簡單。反之,若編碼方案選得不好,則設計的電路就會復雜許多。
實際設計時,需綜合考慮電路復雜度與電路性能之間的折衷。在觸發器資源豐富的FPGA或ASIC設計中,采用獨熱編碼(one-hot-coding)既可以使電路性能得到保證,又可充分利用其觸發器數量多的優勢。
(4)選定觸發器的類型并求出狀態方程、驅動方程和輸出方程。
(5)按照方程得出邏輯圖。
用Verilog HDL來描述有限狀態機,可以充分發揮硬件描述語言的抽象建模能力,使用always塊語句和case(if)等條件語句及賦值語句即可方便實現。具體的邏輯化簡及邏輯電路到觸發器映射均可由計算機自動完成。上述設計步驟中的第(2)、(4)、(5)步不再需要很多的人為干預,使電路設計工作得到簡化,效率也有很大的提高。
評論