verilog 状态机转换问题

2025-03-31 01:22:00
推荐回答(1个)
回答1:

组合逻辑最好使用阻塞赋值 “=”,另外状态机的话,还要有一个时序模块:
always @ (posedge clk or negedge rst)
if (!rst)
state <= IDLE; // 初始状态,通常使用parameter 定义状态
else
state <= next_state;

next_state的赋值,如果把右端写为next_state + 1'b1,这种类似于C语言的写法,在verilog中是不推荐的,因为会综合出加法器,增加多余的电路。

next_state <= next_state + 1'b1、next_state <= next_state 这种电路放在组合逻辑中,会形成逻辑反馈,出现问题的。组合逻辑中输出直接给了输入,当然会出现错误啊。
如果放在always @ ( posedge clk) 时序块中,是可以产生寄存器,输出反馈给输入没关系,反正要等时钟沿来到,输出才会变化的。