Verilog 三段式状态机中第三个always块的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog 三段式状态机中第三个always块的问题相关的知识,希望对你有一定的参考价值。

always @ (posedge clk or negedge nrst)
if (!nrst)
CS <= IDLE;
else
CS <=NS;

always @ (CS)
begin
case (CS)
……
endcase
end

//3rd always block, the sequential FSM output
always @ (posedge clk or negedge nrst)
if (!nrst)
……
else
begin
o1,o2,err <= 3'b000;
case (NS)
……
endcase
end
问题是:第三个always块中为什么case判断条件是下一个状态NS,而不是现在的状态CS。感觉不爽,状态机是描述各个状态的转移的,什么输出要用下一状态NS,而不是使用现在状态CS。输出和现在状态联系起来不是更好吗?不知道我对状态机的理解是否有误,请各个高手赐教。

参考技术A 由于 CS 《= NS
从这里我们可以知道CS的下一个时钟才会使用NS的值

请仔细思考下一个周期的CS值 和你FSM输出值的关系

在下一个周期 CS =NS ,CS发生了改变; 同时,FSM输出值也要发生改变
所以这2个改变都是基于NS的

如果你case()里面写的是CS 的话,
那么由于CS的值在下一个时钟跳变,而你的case的值是在这个时钟跳变,发生了逻辑错误

你对时序掌握地不够牢固本回答被提问者采纳

是关于verilog状态机的问题 在always 时钟块的一个状态中,系统如何运行阻塞赋值? 代码如下:

s1 :begin
out=food;
out=A;
long=4'b0001;
if(counter>=6'b111000)
next=s11;
else if(long==Length)
next=s1;
else
next=s2;
end
s1状态中,阻塞赋值给out,out的值持续为food跟A的时间各是多少?
系统执行时是从上往下依次判定?或者说,是先执行了三个阻塞赋值语句后再执行条件语句中的阻塞赋值?求大神解答!

首先,这是状态机三段式定义中的第二段,是个组合逻辑妥妥的,用阻塞赋值没问题,但是严格上说在这里对out和long的赋值是不对的,当然也不会报错误,food对out的赋值是没有效果的,时间也没有办法估计。 参考技术A begin end 语句是串行处理,抓住这个就行。追问

可这不是C语言啊!在时序逻辑中给不同的变量采用阻塞赋值我知道他们会顺序执行,但是就是不知道给同一个变量阻塞赋值时是否也是顺序执行了!

追答

是串行,没错。同一个变量在begin end 中也是顺行,out先赋值food,再赋值A

追问

试了下,这样是不行的!out直接被赋值A,

以上是关于Verilog 三段式状态机中第三个always块的问题的主要内容,如果未能解决你的问题,请参考以下文章

verilog状态机中的一个状态执行时间问题

是关于verilog状态机的问题 在always 时钟块的一个状态中,系统如何运行阻塞赋值? 代码如下:

在用verilog编写三段式状态机的时候,我看网上很多地方都是提到格式如下:always @ (posedge clk or negedg

Verilog三段式状态机描述

verilog 三段式状态机 求助

三段式状态机设计