FSM通常情况下使用异步信号进行复位,如FSM1中的rst_n信号。当rst_n信号为低时,FSM进入空闲状态IDLE。
在某些特殊情况下有可能需要跟随某个外部信号强制切换到空闲状态,也即同步复位。下面给出了两种同步复位的写法,请各位指教。
如果有什么更好的实现方法,还望不吝赐教。
//FSM1 localparam IDLE = 0, S1 = 1, S2 = 2; always@(posedge clk, negedge rst_n) begin if(!rst_n) cs <= IDLE; else if(reset) cs <= IDLE; else cs <= ns; end always@* begin ns = IDLE; case(cs) IDLE: if(a) ns = S1 else ns = IDLE; S1: if(b) ns = S2 else ns = S1; S2: ns = IDLE; default: ns = IDLE; endcase end //FSM2 localparam IDLE = 0, S1 = 1, S2 = 2; always@(posedge clk, negedge rst_n) begin if(!rst_n) cs <= IDLE; else cs <= ns; end always@* begin ns = IDLE; case(cs) IDLE: if(reset) ns = IDLE; else if(a) ns = S1 else ns = IDLE; S1: if(reset) ns = IDLE; if(b) ns = S2 else ns = S1; S2:if(reset) ns = IDLE; ns = IDLE; default: ns = IDLE; endcase end