请看一下简单状态机的示例代码:
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>)
应该相同。但是看来我的理解是错误的。
答案 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;