時序電路的狀态是一個狀态變量集合,這些狀态變量在任意時刻的值都包含了為确定電路的未來行為而必需考慮的所有曆史資訊。
狀态機采用VerilogHDL語言編碼,建議分為三個always段完成。
三段式模組化描述FSM的狀态機輸出時,隻需指定case敏感表為次态寄存器, 然後直接在每個次态的case分支中描述該狀态的輸出即可,不用考慮狀态轉移條件。
三段式描述方法雖然代碼結構複雜了一些,但是換來的優勢是:使FSM做到了同步寄存器輸出,消除了組合邏輯輸出的不穩定與毛刺的隐患,而且更利于時序路徑分組,一般來說在FPGA/CPLD等可程式設計邏輯器件上的綜合與布局布線效果更佳。
示列如下:
//第一個程序,同步時序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; //阻塞指派
...
endcase
end
//第三個程序,同步時序always子產品,格式化描述次态寄存器輸出
always @ (posedge clk or negedge rst_n)
...//初始化
case(next_state) //次态寄存器作為CASE後的表達式
S1:
out1 <= 1'b1; //對輸出進行指派,注意是非阻塞邏輯
S2:
out2 <= 1'b1;
default:... //default的作用是免除綜合工具綜合出鎖存器。
endcase
end