有限狀態機(FSM)寫法的個人總結(一段式,二段式,三段式)
狀態機描述時關鍵是要描述清楚幾個狀態機的要素,即如何進行狀態轉移,每個狀態的輸出是什麼,狀態轉移的條件等。具體描述時方法各種各樣,最常見的有三種描述方式:
(1)一段式:整個狀態機寫到一個always模組裡面,在該模組中既描述狀態轉移,又描述狀態的輸入和輸出;
(2)二段式:用兩個always模組來描述狀態機,其中一個always模組採用同步時序描述狀態轉移;另一個模組採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律以及輸出;
(3)三段式:在兩個always模組描述方法基礎上,使用三個always模組,一個always模組採用同步時序描述狀態轉移,一個always採用組合邏輯判斷狀態轉移條件,描述狀態轉移規律,另一個always模組描述狀態輸出(可以用組合
三段式狀態機示例模板:
//第一個程序,同步時序always模組,格式化描述次態暫存器遷移到現態暫存器
always @ (posedge clk or negedge rst_n) //非同步復位
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state; //注意,使用的是非阻塞賦值
//第二個程序,組合邏輯always模組,描述狀態轉移條件判斷
always @ (current_state) //電平觸發,現存狀態為敏感訊號
begin
next_state = x; //要初始化,使得系統復位後能進入正確的狀態
case(current_state)
S1: if(...)
next_state = S2; //阻塞賦值
S2: if(...)
next_state = S3; //阻塞賦值
...
endcase
end
//第三個程序,同步時序always模組,格式化描述次態暫存器輸出
always @ (posedge clk or negedge rst_n)
begin
...//初始化
case(next_state)
S1:
out1 <= 1'b1; //注意是非阻塞邏輯
S2:
out2 <= 1'b1;
default:... //default的作用是免除綜合工具綜合出鎖存器
endcase
end