了解状态机中的干扰闩锁

时间:2019-07-08 16:22:23

标签: vhdl state-machine

请看一下简单状态机的示例代码:

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

那么为什么第一个版本中输出状态机的最后条件会导致闩锁?为什么elseelsif()以外的东西?在我看来,这两个表达式是相等的,因为状态机只有三个状态,所以在处理所有其他状态时,elseelsif(<ThirdState>)应该相同。但是看来我的理解是错误的。

1 个答案:

答案 0 :(得分:4)

通常最好不要假设合成器像您一样聪明。正如您所发现的,使用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;