概述
最近产生一个问题:
在 modelsim中, 逻辑仿真完全ok。
把某些信号加上 mark_debug, 运行ok。
但是正常情况下,工作就不正常。
在状态机的某个状态有个警告。
后来查了下:
在 moore状态机中, 会用到组合逻辑,很容易产生 产生 latches.
在 vivado 中会产生一个警告:
[Synth 8-327] inferring latch for variable 'state_pll_next_reg'
我们不要忽略这个警号。
在组合逻辑中, 当if 或者 case语句不完整的时候, 会出现这样的问题。这样会导致我们的信号进入一个高阻态,这样状态机或者其他的,就可能处于一个不可控的状态。这样很容易出问题。
所以: 尽量不要用组合逻辑。要把组合逻辑变成 时序 逻辑。 用了 组合逻辑的时候,一定要小心 inferring latch.
所以我推荐两段式 状态的写法,不用到任何组合逻辑,而且可以把 状态控制 和 逻辑控制分离。
/*
(C) OOMusou 2011 http://oomusou.cnblogs.com
Filename : simple_fsm_moore_2_always_0_cs_ns_good.v
Synthesizer : Quartus II 8.1
Description : 2 always block for moore fsm (GOOD)
Release : Jun.05,2011 1.0
*/
module simple_fsm (
clk,
rst_n,
w_i,
z_o
);
input clk;
input rst_n;
input w_i;
output z_o;
parameter IDLE = 2'b00;
parameter S0 = 2'b01;
parameter S1 = 2'b10;
reg [1:0] curr_state;
reg z_o;
// state reg + next state logic
always@(posedge clk or negedge rst_n)
if (~rst_n) curr_state <= IDLE;
else
case (curr_state)
IDLE : if (w_i) curr_state <= S0;
else curr_state <= IDLE;
S0 : if (w_i) curr_state <= S1;
else curr_state <= IDLE;
S1 : if (w_i) curr_state <= S1;
else curr_state <= IDLE;
default : curr_state <= IDLE;
endcase
// output logic
always@(posedge clk)
case (curr_state)
IDLE : z_o = 1'b0;
S0 : z_o = 1'b0;
S1 : z_o = 1'b1;
default : z_o = 1'b0;
endcase
endmodule
最后
以上就是坚强小甜瓜为你收集整理的关于 状态机中的组合逻辑的全部内容,希望文章能够帮你解决关于 状态机中的组合逻辑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复