我是靠谱客的博主 坚强小甜瓜,最近开发中收集的这篇文章主要介绍关于 状态机中的组合逻辑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近产生一个问题:

在 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


最后

以上就是坚强小甜瓜为你收集整理的关于 状态机中的组合逻辑的全部内容,希望文章能够帮你解决关于 状态机中的组合逻辑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部