说我有以下状态机:
....
if state_a then
output_a <= '0';
next_state <= state_b;
elsif state_b then
output_a < '0';
if cond then
output_b <= '1';
next_state <= state_a;
else
next_state <= state_b;
end if;
end if;
......
除非在state_b中再次分配,否则我不希望输出更改。但是,当我尝试合成这段代码时,大多数综合工具会在这一行上说些什么:
警告:找到信号的1位锁存器&#34; output_b&#34;。闩锁不是 建议用于FPGA设计,因为它可能会导致时序问题 问题。
我应该担心这件事吗?如果是这样,为什么以及有哪些替代方案?
答案 0 :(得分:1)
关注Xilinx:
如果打算使用锁定推断,您可以放心地忽略此消息。但是,一些低效的编码风格可能会导致意外的锁定推断。您应该分析您的代码以查看是否有此结果。
一些避免锁存推理的技巧:
WHEN OTHERS
子句始终有效,但可以创建无关的逻辑。)答案 1 :(得分:1)
如果您在时钟进程中有if / elsif或case语句不完整,那么它绝对无害。
if rising_edge(clk)
if a then
out <= b;
end if;
end if;
这意味着你有一些带有某种反馈的触发器,或者就像在这种情况下,你有一个使用时钟使能引脚的触发器,这甚至更好。
如果你在非时钟进程中有if / elsif或case语句不完整 - 它是一个锁存器,它在大多数情况下都是:
如果你完成了你的小例子,有人可以帮助你重新设计它。现在信息不够。
答案 2 :(得分:0)
您遇到的问题源于您(可能)使用的FSM编码风格。正如其他人指出的那样,不可能猜出你想要代码做什么,因为你没有提供足够的代码来解决这个问题,所以我提出了一种可能的解释,假设你真的想以某种方式改变output_a一次(之后) reset)lock_b的锁存应该在FSM状态转换的同时发生。
每个FSM样式使用2个进程,我们的代码没有给出锁存警告:
----
signal CLK, RESET, cond : std_logic;
type state_t is (a,b);
signal state, state_next : state_t;
signal ouput_a, output_b, output_b_next : std_logic;
----
FSM_clock: process(all)
begin
if rising_edge(CLK) then
if RESET then
state <= a;
output_b <= '0';
else
state <= state_next;
output_b <= output_b_next;
end if;
end if;
end process;
FSM_next: process(all)
begin
state_next <= state;
output_b_next <= output_b;
output_a <= '0';
case state is
when a =>
state_next <= b;
when b =>
output_a <= '1';
if cond then
output_b_next <= '1';
state_next <= a;
else
state_next <= b;
end if;
end case;
end process;