概述--何為有限狀態機FSM
有限狀態機-Finite State Machine,簡寫為 FSM,是表示有限個狀態及在這些狀態之間的轉移和動作等行為的數學模型,在計算機領域有着廣泛的應用。通常 FSM 包含幾個要素:狀態的管理、狀態的監控、狀態的觸發、狀態觸發后引發的動作。
以下為 wiki 上有關 FSM 的介紹,鏈接地址為Finite State Machine-WiKi。
A finite-state machine (FSM) or finite-state automaton (plural: automata), or simply a state machine, is a mathematical model of computation used to design both computer programs and sequential logic circuits. It is conceived as an abstract machine that can be in one of a finite number of states. The machine is in only one state at a time; the state it is in at any given time is called the current state. It can change from one state to another when initiated by a triggering event or condition; this is called a transition. A particular FSM is defined by a list of its states, and the triggering condition for each transition.
FSM 的兩種形式
對於 FPGA 硬件電路,不管狀態機是何種,我們假定 F 是當前狀態和輸入信號的函數。狀態機的輸出是由輸出組合邏輯 G 提供的,G 也是當前狀態和輸入信號的函數。那么對於狀態機的邏輯,可以表達如下:
下一個狀態 = F(當前狀態,輸入信號);
輸出信號 = G(當前狀態,輸入信號);
在狀態機中,我們依據狀態機輸出與輸入的關系將狀態機分為了兩個模型,分別是 Mealy 狀態機和 Moore 狀態機。下面對這兩個部分進行詳解。
Moore 狀態機
Moore 狀態機是時序邏輯輸出只取決於當前狀態的這一類狀態機。此時,其輸出表達式為輸出信號 = G(當前狀態,輸入信號);
這種。
時鍾同步的 Moore 狀態機結構如下圖所示,從圖中可以看出其輸出邏輯 G 的輸出僅由當前狀態決定。
Mealy 狀態機
Mealy 狀態機是時序邏輯輸出不但取決於狀態,還取決於輸入的一類狀態機。此時,其狀態機輸出表達式為輸出信號 = G(當前狀態,輸入信號);
這種。
時鍾同步的 Mealy 狀態機結構如下圖所示,從圖中可以看出其輸出邏輯 G 的輸出由輸入和當前狀態一同決定。
Moore vs Mealy 狀態機
-
Mealy 機比 Moore 機“響應”速度快。
Mealy 機的輸出與當前狀態和輸入有關,而 Moore 機輸出僅與當前狀態有關。Mealy 機的輸入立即反應在當前周期;Moore 機的輸入影響下一狀態,通過下一狀態影響輸出。為此 Mealy 機比 Moore 機輸出序列超前一個周期,即“響應速度”較快。Mealy 機的輸出在當前周期,具有較長的路徑(組合邏輯);Moore 機的輸出具有一個周期的延時,容易利用時鍾同步,Moore 機具有較好的時序。
-
Mealy 機狀態少,Moore 機結構簡單。
由於 Moore 機的輸出只有當前的狀態有關,一個狀態對應一個輸出,Moore 機具有更多的狀態。Mealy 和 Moore 機之間可以相互轉化,對於每個 Mealy 機,都有一個等價的 Moore 機,Moore 機狀態的上限為所對應的 Mealy 機狀態的數量和輸出數量的乘積。
-
狀態機的狀態通過觸發器的數量來反應,Mealy 機具有較少的狀態,為此具有較少的觸發器。
Mealy和Moore狀態機的互換
對於給定的時序邏輯功能,可以用 Mealy 機實現,也可以用 Moore 機實現。根據 Moore 機比 Mealy 機輸出落后一個周期的特性,可以實現兩種狀態機之間的轉換。把 Moore 機轉換為 Mealy 機的辦法為,把次態的輸出修改為對應現態的輸出,同時合並一些具有等價性能的狀態。把 Mealy 機轉換為 Moore 機的辦法是,把當前態的輸出修改為對應次態的輸出,同時添加一些狀態。如下圖所示,為把 Mealy 機狀態圖轉化為 Moore 機狀態圖。
如上圖所示,把 Mealy 型機轉換為 Moore 型機,只要把現時輸出改變為下一時刻輸出。對於狀態 A,有 4 個箭頭指向它,表示在當前狀態下有 4 個狀態可以轉換為下一狀態的 A;同時當前輸出均為 0,可以把 0 移入狀態 A 內部,表示在 Moore 機中狀態 A 的輸出為 0。同理,可以把 0 分別移位 B/C 狀態。但對於狀態 D,有兩個箭頭指向且具有不同的輸出值,需要把狀態 D 分解成兩個狀態 D1 和 D2(每個狀態對應一個輸出,當輸出不同需要利用不同的狀態表示,這即是 Moore 機具有更多狀態的原因),得到完整的 Moore 機狀態模型。
同理,若把上圖的 Moore 機轉換為 Mealy 機,只要把 Moore 機中下一狀態的輸出改變成 Mealy 機中當前狀態的輸出,由於 D1/D2 兩狀態處於 A/C 兩狀態之間,且相當於 A/C 節點之間的一個等效節點,可以把 D1/D2 兩狀態合並為一個狀態。
狀態機設計原則
Mealy 機和 Moore 機實現的電路是同步時序邏輯電路的兩種不同形式,它們之間不存在功能上的差異,並可以相互轉換。Moore 型電路有穩定的輸出序列,而 Mealy 型電路的輸出序列早 Moore 型電路一個時鍾周期產生。在時序設計時,根據實際需要,結合兩種電路的特性選擇。
對於時序電路中常見的計數器,因計數器狀態已經固定不變,無論采用 Mealy 型還是 Moore 型電路,復雜度一樣。
在時序電路設計中 Mealy 型和 Moore 型電路的選擇原則是:當要求輸出對輸入快速響應及希望電路盡量簡單時,選擇 Mealy 型電路。當要求時序輸出穩定,能接受輸出序列晚一個周期,及選擇 Moore 型電路不增加電路復雜性時,適宜選擇 Moore 型電路。
Moore狀態機
3 段式狀態機(推薦)
A - 普通型
// 第一個always塊,描述當前狀態的狀態寄存器,non-blocking
always @ (posedge clk or negedge rst_n) begin
if (!rst_n)
curr_state <= idle;
else
curr_state <= next_state;
end
// 第二個always塊,描述狀態轉移,即下一狀態的狀態寄存器,blocking
always @ (*) begin
next_state = idle; // 初始化
case (curr_state)
idle: begin
if (...)
next_state = sx;
else
next_state = sy;
end
...
default:
next_state = sz;
endcase
end
// 第三個always塊,組合邏輯描述輸出,blocking
always @ (*) begin
if (!rst_n) begin
o1 = 1'b0;
end
else begin
case (curr_state)
s1: begin
o1 = 1'b1;
end
...
default: begin
o1 = 1'b0;
end
endcase
end
end
B - 改良型
// 第三個always塊,時序邏輯描述輸出,non-blocking
// 此時為時序邏輯
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
o1 <= 1'b0;
end
else begin
case (curr_state) // 注意此處為當前狀態
s1: begin
o1 <= 1'b1;
end
...
default: begin
o1 <= 1'b0;
end
endcase
end
end
C - 改良型
// 第三個always塊,時序邏輯描述輸出,non-blocking
// 此時為時序邏輯
always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
o1 <= 1'b0;
end
else begin
case (next_state) // 注意此處為前一狀態
s1: begin
o1 <= 1'b1;
end
...
default: begin
o1 <= 1'b0;
end
endcase
end
end
參考感謝
[1] 兩種類型狀態機