1. 程式人生 > >有限狀態機(FSM)寫法的個人總結(一段式,二段式,三段式)

有限狀態機(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