Пожалуйста, посмотрите на этот пример кода простого конечного автомата:
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'
Предупреждение исчезает, когда я изменяю последнее состояние выходной сети на
else
TREADY_Int <= '0';
end if;
, а также защелка исчезает
Так почему последнее состояние конечного автомата в первой версии приводит к защелке?Почему else
отличается от elsif()
?По моему мнению, эти два выражения равны, потому что конечный автомат имеет только три состояния, поэтому else
и elsif(<ThirdState>)
должны быть одинаковыми при обработке всех других состояний.Но, похоже, мое понимание здесь неверно.