一段式与二段式都有缺点
三段式的状态机更加好
三段式状态机:
第一段:时序逻辑,用于描述当前状态 (<=)
第二段:组合逻辑,用于描述下一个状态 (=)
第三段:时序逻辑,用于描述输出 (<=)
①现态:是指当前所处的状态。cstate
②条件:又称为“事件”,当一个条件被满足,
将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。动作执行完毕后,
可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,
当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,
“次态”一旦被激活,就转变成新的“现态”了。nstate
以下为三段式模板:
第一段:
//1st always block, sequential logic, store current state
always @(posedge clk or negedge rst_n)
if(!rst_n)
cstate <= IDLE;
else
cstate <= nstate;
第二段:
//2nd always block, combinational logic, decide next state
always @(cstate or wr_req or rd_req)
begin
nstate = 3'bx;
case(cstate)
IDLE: if(wr_req)
nstate = WR_S1;
else if(rd_req)
nstate = RD_S1;
else
nstate = IDLE;
WR_S1: nstate = WR_S2;
WR_S2: nstate = IDLE;
RD_S1: if(wr_req)
nstate = WR_S2;
else
nstate = RD_S2;
RD_S2: if(wr_req)
nstate = WR_S1;
else
nstate = IDLE;
default: nstate = 3'bx;
endcase
end
第三段:
Mealy型写法:case(表达式)中的表达式为“cstate”,即现态,default项必须设置。
//Mealy机器对输入的反应更快
always @(posedge clk or negedge rst_n)
if(!rst_n)
cmd <= 3'b000;
else
case(cstate)
IDLE: if(wr_req)
cmd <= 3'b001;
else if(rd_req)
cmd <= 3'b011;
else
cmd <= 3'b000;
WR_S1: cmd <= 3'b010;
WR_S2: cmd <= 3'b000;
RD_S1: if(wr_req)
cmd <= 3'b010;
else
cmd <= 3'b100;
RD_S2: if(wr_req)
cmd <= 3'b001;
else
cmd <= 3'b000;
default:;
endcase
Moore型写法: case(表达式)中的表达式为“nstate”,即次态,default项必须设置。
//Moore机器使用更安全
always @(posedge clk or negedge rst_n)
if(!rst_n)
cmd <= 3'b000;
else
case(nstate)
IDLE: cmd <= 3'b000;
WR_S1: cmd <= 3'b001;
WR_S2: cmd <= 3'b010;
RD_S1: cmd <= 3'b011;
RD_S2: cmd <= 3'b100;
default:;
endcase
endmodule