Warm tip: This article is reproduced from serverfault.com, please click

vhdl-Quartus网表优化在状态机中丢失寄存器扇出

(vhdl - Quartus netlist optimization lost register fanout in a state machine)

发布于 2020-11-25 17:17:41

嗨,大家好,我正在尝试实现状态机,但是我遇到的问题是,在时序仿真过程中,我收到一条错误消息,说

信息:1个寄存器在网表优化期间丢失了所有扇出。前1个显示如下。

信息:在优化网表期间,寄存器“ state.STATE_I”失去了所有扇出状态。

并且在波形时序仿真中,输出工作正常,但是如果我尝试检查实际状态,则在其余应显示实际状态的地方,我只会得到一个初始状态(状态I)和一个“未定义”,代码为:

library ieee;
use ieee.std_logic_1164.all;
--define entity
entity pregunta1a is
  port(
    resetn  : in  std_logic;
    clock   : in  std_logic;
    w       : in  std_logic;
    z       : out std_logic
  );
end pregunta1a;
--define architecture
architecture behavior of pregunta1a is
  type STATE_TYPE is (STATE_A,STATE_B,STATE_C,STATE_D,STATE_E,STATE_F,STATE_I); -- todos los estados
  signal state, next_state : STATE_TYPE;
begin
  process(clock)
  begin
    if(rising_edge(clock)) then
      if (resetn='0') then
        state <= STATE_I;                
      else
        state <= next_state;
      end if;
    end if;
  end process;
  
  process(state,w) -- complete sensitivity list
  begin
    z<='0';
    case state is
      when  STATE_A =>
        if (w = '1') then
          next_state <= STATE_B;
        else
          next_state <= STATE_C;
        end if;
      when STATE_B =>
        if (w = '1') then
          next_state <= STATE_D;
        else
          next_state <= STATE_A;
        end if;
      when STATE_C =>
        if (w = '1') then
          next_state <= STATE_B;
        else
          next_state <= STATE_E;
        end if;
      when STATE_D =>
        if (w = '1') then
          next_state <= STATE_F;
        else
          next_state <= STATE_A;
        end if;
      when STATE_E =>
        if (w = '1') then
          next_state <= STATE_B;
        else
          next_state <= STATE_E;
          z<='1';  
        end if;
      when STATE_F =>
        if (w = '1') then
          next_state <= STATE_F;
          z<='1';        
        else
          next_state <= STATE_A;
        end if;
      when STATE_I =>
        if (w = '1') then
          next_state <= STATE_B;
        else
          next_state <= STATE_A;
        end if;
    end case;
  end process; 
end behavior;

这是时序仿真的屏幕截图, 任何人都知道该如何解决?

Questioner
JohanB
Viewed
11
JohanB 2020-12-06 14:12:13

我已经找到了解决我问题的方法,似乎我不得不强制与丢失的寄存器(state_I)进行某种类型的交互。我更改了代码的某些部分,并下令使其更清晰:

library ieee;
use ieee.std_logic_1164.all;
--define entity
entity pregunta1a is
  port(
    resetn  : in  std_logic;
    clock   : in  std_logic;
    w       : in  std_logic;
    z       : out std_logic
  );
end pregunta1a;
--define architecture
architecture behavior of pregunta1a is
  type STATE_TYPE is (STATE_A,STATE_B,STATE_C,STATE_E,STATE_F,STATE_G,STATE_R); -- todos los estados
  signal state, next_state : STATE_TYPE:=state_R;
begin
  process(clock)
  begin
    if(rising_edge(clock)) then
      if (resetn='0') then
        state <= STATE_R;                
      else
        state <= next_state;
      end if;
    end if;
  end process;
  
  process(state,w,resetn) -- complete sensitivity list
  begin
    z<='0';
    next_state<=state_R;
    case state is
      when  STATE_A =>
        if (w = '0') then
          next_state <= STATE_B;
        else
          next_state <= STATE_E;
        end if;
      when STATE_B =>
        if (w = '0') then
          next_state <= STATE_C;
        else
          next_state <= STATE_E;
        end if;
      when STATE_C =>
        if (w = '0') then
          next_state <= STATE_C;
          z<='1';
        else
          next_state <= STATE_E;
        end if;
      when STATE_E =>
        if (w = '0') then
          next_state <= STATE_A;
        else
          next_state <= STATE_F;
        end if;
      when STATE_F =>
        
        if (w = '0') then
          next_state <= STATE_A;
        else
          next_state <= STATE_G;
        end if;
      when STATE_G =>
        if (w = '0') then
          next_state <= STATE_A;
        else
          next_state <= STATE_G;
          z<='1';        
        end if;
      when STATE_R =>
        if(resetn='1') then
        if (w = '0') then
          next_state <= STATE_A;
        else
          next_state <= STATE_E;
        end if;
        else
          next_state<=state_R;
        end if;
    end case;
    
  end process; 
end behavior;

似乎我必须强制某种类型的交互来建立STATE_I,程序仍按原样运行,但其中一项要求是在仿真中摆脱此问题