有限狀態機
有限狀態機是由寄存器組和組合邏輯構成的硬件時序電路,其狀態(即由寄存器組的1和0的組合狀態所構成的有限個狀態)只可能在同一時鐘跳變沿的情況下才能從一個狀態轉向另一個狀態,究竟轉向哪一狀態還是留在原狀態不但取決於各個輸入值,還取決於當前所在狀態。(這裏指的是米里Mealy型有限狀態機,而莫爾Moore型有限狀態機究竟轉向哪一狀態只決於當前狀態。)
- Mealy狀態機:時序邏輯的輸出不僅取決於當前狀態,還取決與輸入。
- Moore狀態機:時序邏輯的輸出只取決於當前狀態。
在Verilog HDL中可以用許多種方法來描述有限狀態機,最常用的方法是用always語句和case語句。下面的狀態轉移圖表示了一個有限狀態機,下例的程序就是該有限狀態機的多種Verilog HDL模型之一:
上面的狀態轉移圖表示了一個四狀態的有限狀態機,它的同步時鐘是Clock,輸入信號是 A 和 Reset,輸出信號是 F 和 G。狀態的轉移只能在同步時鐘(Clock)的上升沿時發生,往哪個狀態的轉移則取決於目前所在的狀態和輸入的信號(Reset 和 A)。下面的例子是該有限狀態機的Verilog HDL模型之一:
例1
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [1:0] state ;
parameter Idle = 2’b00, Start = 2’b01,
Stop = 2’b10, Clear = 2’b11;
always @(posedge Clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
idle: begin
if (A) begin
state <= Start;
G<=0;
End
else state <= idle;
end
start: if (!A) state <= Stop;
else state <= start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
End
else state <= Clear;
end
endcase
endmodule
我們還可以用另一個Verilog HDL模型來表示同一個有限狀態,見下例:
例2
module fsm (Clock, Reset, A, F, G);
input Clock, Reset, A;
output F,G;
reg F,G;
reg [3:0] state ;
parameter Idle = 4’b1000,//這裏與上述不同
Start = 4’b0100,
Stop = 4’b0010,
Clear = 4’b0001;
always @(posedge clock)
if (!Reset)
begin
state <= Idle; F<=0; G<=0;
end
else
case (state)
Idle: begin
if (A) begin
state <= Start;
G<=0;
end
else state <= Idle;
end
Start: if (!A) state <= Stop;
else state <= Start;
Stop: begin
if (A) begin
state <= Clear;
F <= 1;
end
else state <= Stop;
end
Clear: begin
if (!A) begin
state <=Idle;
F<=0; G<=1;
end
else state <= Clear;
end
default: state <=Idle;
endcase
endmodule
[例2]與[例1]的主要不同點是狀態編碼,[例2]採用了獨熱編碼,而[例1]則採用Gray碼,究竟採用哪一種編碼好要看具體情況而定。對於用FPGA實現的有限狀態機建議採用獨熱碼,因爲雖然採用獨熱編碼多用了兩個觸發器,但所用組合電路可省下許多,因而使電路的速度和可靠性有顯著提高,而總的單元數並無顯著增加。採用了獨熱編碼後有了多餘的狀態,就有一些不可到達的狀態,爲此在CASE語句的最後需要增加default分支項,以確保多餘狀態能回到Idle狀態。
有限狀態機設計的一般步驟:
- 邏輯抽象,得出狀態轉換圖就是把給出的一個實際邏輯關係表示爲時序邏輯函數,可以用狀態轉換表來描述,也可以用狀態轉換圖來描述。這就需要:
• 分析給定的邏輯問題,確定輸入變量、輸出變量以及電路的狀態數。通常是取原因(或條
件)作爲輸入變量,取結果作爲輸出變量。
• 定義輸入、輸出邏輯狀態的含意,並將電路狀態順序編號。
• 按照要求列出電路的狀態轉換表或畫出狀態轉換圖。這樣,就把給定的邏輯問題抽象到一個時序邏輯函數了。 - 狀態化簡
如果在狀態轉換圖中出現這樣兩個狀態,它們在相同的輸入下轉換到同一狀態去,並得到一樣
的輸出,則稱它們爲等價狀態。顯然等價狀態是重複的,可以合併爲一個。電路的狀態數越少,存儲電路也就越簡單。狀態化簡的目的就在於將等價狀態儘可能地合併,以得到最簡的狀態轉換圖。 - 狀態分配
狀態分配又稱狀態編碼。通常有很多編碼方法,編碼方案選擇得當,設計的電路可以簡單,反
之,選得不好,則設計的電路就會複雜許多。實際設計時,需綜合考慮電路複雜度與電路性能
之間的折衷,在觸發器資源豐富的FPGA或ASIC設計中採用獨熱編碼(one-hot-coding)既可以使電路性能得到保證又可充分利用其觸發器數量多的優勢。 - 選定觸發器的類型並求出狀態方程、驅動方程和輸出方程。
- 按照方程得出邏輯圖。