verilog三段式状态机中的问题,第三个always

Posted

tags:

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

网上看到许多讲三段式状态机写法的,大多数的格式都一样,如下
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

always @ (posedge clk or negedge rst_n) //异步复位

if(!rst_n)

current_state <= IDLE;

else

current_state <= next_state;//注意,使用的是非阻塞赋值

//第二个进程,组合逻辑always模块,描述状态转移条件判断

always @ (current_state) //电平触发

begin

next_state = x; //要初始化,使得系统复位后能进入正确的状态

case(current_state)

S1: if(...)

next_state = S2; //阻塞赋值

...

endcase

end

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

always @ (posedge clk or negedge rst_n)

...//初始化

case(next_state)

S1:

out1 <= 1'b1; //注意是非阻塞逻辑

S2:

out2 <= 1'b1;

default:... //default的作用是免除综合工具综合出锁存器。

endcase

end

问题来了:第三个always @ (posedge clk or negedge rst_n),但是里面的case用的是next_state条件,ISE11.2中综合总是会报错无法通过,如果将第三个always中敏感变量改为next_state就可以通过综合。但是问题是第三个always中用next_state驱动就不是每个时钟周期下都有效,有些场合下又需要每个时钟都进入状态赋值,那应该怎么办呢?为什么大家都说第三个always中的敏感变量用clk和rst是可以的呢?

第三个always这样写没错,但是case的敏感变量是current_state,不是next_state.不知道你看的什么书,但我还是推荐你看下《Verilog HDL程序设计与实践》,里面关于状态机讲的十分清楚! 参考技术A 建议你好好看看状态机的格式和模板。分为时序逻辑部分和组合逻辑部分
//时序逻辑部分
always@(posedge clk)
if(reset)
pr_state<=initial;
else
pr_state<=nx_state;
//组合逻辑部分
always@(input_signel,pr_state)
begin
case(pr_state)
initial: begin……
nx_state=state1;
end
state1:……………………
state2:……………………
default:……………………
endcase
end

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的主要内容,如果未能解决你的问题,请参考以下文章

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

一个关于verilog 状态机的问题程序,综合的时候出了点错误,希望各位可以帮忙解决下问题

verilog中的隐式状态机和显示状态机?

Verilog三段式状态机描述

三段式有限状态机Verilog代码

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