在FPGA逻辑电路中,如果状态机比较大,需要的状态转移、信号等处理比较复杂,建议使用三段式状态机来完成设计。当采用三段式建模描述FSM的状态机输出时,只需要指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不需要考虑状态转移条件。
虽然三段式描述方法的代码结构复杂了一下,但是换来了很多好处:使FSM做到了同步寄存器的输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更有利于时序路径分组,并且便于维护。
三段式结构:
1:
reg [2:0] current_state,next_state;
always@(posedge clk or negedge rstn)
begin
if(!rstn)
current_state<=scan_idle;
else
current_state<=next_state;
2:
always@(*)
begin
next_state=IDLE;
case(current_state)
S1:if(...)
next_state=S2:
else.....
S2:........
endcase
end
3:
always@(posedge clk or negedge rstn)
begin
if(!rstn)
....
else
case(next_state)
S1:
S2:
......
dafalut
endcase
end
|