关于 状态机中的组合逻辑

最近产生一个问题:

在 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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_807315755

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值