Оптимизация списка соединений Quartus разветвление потерянного регистра в конечном автомате

Привет, ребята, я пытаюсь реализовать конечный автомат, но у меня проблема в том, что во время симуляции времени я получаю сообщение об ошибке

Информация: регистры 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;

Это скриншот временного моделирования, кто знает, как это решить??

1 ответ

Я нашел решение своей проблемы, похоже, мне нужно принудительно выполнить какое-то взаимодействие с потерянным регистром (состояние_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;

кажется, что я должен заставить какой-то тип взаимодействия установить СОСТОЯНИЕ_I, программы работали как есть, но одним из требований было избавиться от этой проблемы в симуляции

Другие вопросы по тегам