Понимание мешающей защелки в автомате - PullRequest
1 голос
/ 08 июля 2019

Пожалуйста, посмотрите на этот пример кода простого конечного автомата:

entity Top is
    Port ( Clock : in STD_LOGIC;
           Reset : in STD_LOGIC;
           TREADY : out STD_LOGIC
           );
end Top;

architecture Behavioral of Top is

    type STATE_t is (S0, S1, S2);
    signal CurrentState : STATE_t := S0;

    signal TREADY_Int   : STD_LOGIC := '0';

begin

    -- Transit network
    process(Clock, Reset, CurrentState)
        variable NextState : STATE_t;
    begin
        if(rising_edge(Clock)) then
            case CurrentState is
                when S0 =>
                    if(Reset = '1') then
                        NextState := S0;
                    else
                        NextState := S1;
                    end if;
                when S1 =>
                     NextState := S2;
                when S2 =>
                    NextState := S1;
            end case;
        end if;

        CurrentState <= NextState;
    end process;

    -- Output network
    process(CurrentState)
    begin
        if(CurrentState = S0) then
            TREADY_Int <= '0';
        elsif(CurrentState = S1) then
            TREADY_Int <= '1';
        elsif(CurrentState = S2) then
            TREADY_Int <= '0';
        end if;
    end process;

    TREADY <= TREADY_Int;

end Behavioral;

Синтез показывает мне следующее предупреждение:

[Synth 8-327] inferring latch for variable 'TREADY_Int_reg'

Schematic with latch

Предупреждение исчезает, когда я изменяю последнее состояние выходной сети на

    else
        TREADY_Int <= '0';
    end if;

, а также защелка исчезает

Schemativ without latch

Так почему последнее состояние конечного автомата в первой версии приводит к защелке?Почему else отличается от elsif()?По моему мнению, эти два выражения равны, потому что конечный автомат имеет только три состояния, поэтому else и elsif(<ThirdState>) должны быть одинаковыми при обработке всех других состояний.Но, похоже, мое понимание здесь неверно.

1 Ответ

4 голосов
/ 08 июля 2019

Обычно лучше не предполагать, что синтезатор такой же умный, как и вы.Использование else безопаснее, как вы обнаружили.

Вот еще один пример.Это лучше:

process (A, B)
begin
  if (A < B)
    F <= ...
  else
    F <= ...
  end if;
end process;

чем это:

process (A, B)
begin
  if (A < B)
    F <= ...
  end if;
  if (A >= B)
    F <= ...
  end if;
end process;
...