本人在学习verilog 与状态机时发现有如下疑惑,希望有人能为我解答。
如下,是一部分三段式状态机的代码:
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) cstate<=WR_S1;
else cstate<=nstate;
end
always@(cstate)
begin
case(cstate)
WR_S1: nstate=WR_S2;
WR_S2: nstate=WR_S3;
...
default:nstate=WR_S1
endcase
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) cmd<=3'b111;
else begin
case(nstate)
WR_S1:cmd<=3'b101;
WR_S2:cmd<=3'b110;
...
default: ;
endcase
end
end
endmodule
如上一段代码,本人困惑之处在于:
按照个人对代码的理解,
当cstate状态为WR_S1时,照第二个always语句里描述,下一个状态应为WR_S2;
而当下一个状态为WR_S2时,照第三个always语句描述,输出的cmd应为3'b110,而不是3'b101;
然而根据资料显示,
当cstate状态为WR_S1时,下一个状态为WR_S2,输出的cmd为3'b101,既WR_S1所对应的输出结果。
我认为应该是我对代码理解有误,希望有人能来指出问题所在。谢谢 |