关于三段式状态机的疑惑,希望有人来为我解答。(新手求罩)
时间:10-02
整理:3721RD
点击:
本人在学习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所对应的输出结果。
我认为应该是我对代码理解有误,希望有人能来指出问题所在。谢谢
如下,是一部分三段式状态机的代码:
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所对应的输出结果。
我认为应该是我对代码理解有误,希望有人能来指出问题所在。谢谢
什么产品上的 是充电器上面的吗
clk 上升沿 或者 rst_n 下降沿,执行 begin end 之间的语句。 if 判断 rst_n 是不是 低电平
你这个有一个Clk的延时,而、所以在nstate =WR_S2 时,cmd是等于3‘b101,而下一个clk的上升沿来临时,cmd才变成3'b110,而同时nstate的状态也变了,所以书上才这么说吧,我是这么理解的。
