rising_edge 函数避免“锁存警告”?

Wei*_*ong 0 fpga vhdl

有时我在 Xilinx ISE 中收到警告:

锁存器可能是由不完整的 case 或 if 语句生成的。我们不建议在 FPGA/CPLD 设计中使用锁存器,因为它们可能会导致时序问题。

但是如果我使用rising_edge()函数,那么即使我有不完整的情况,也不会发出警告,例如:

process (clk, rst)
begin   
    if (rst = '1') then
        test <= '0';
    elsif (rising_edge(clk)) then
        test <= '1';
    end if;
end process;
Run Code Online (Sandbox Code Playgroud)

那么为什么 FPGA 中的锁存器被认为是一种丑陋的设计呢?为什么使用rising_edge()函数可以避免这些警告?(事实上​​,我认为使用rising_edge()函数也会引入锁存器)

小智 5

在任何一种情况下,(锁存器或寄存器;没有或有上升沿(clk))不完整的 IF 或 CASE 表示需要存储来保存信号的当前值。

因此,rising_edge(clk) 函数并没有真正改变电路的逻辑,它只是清理其时序。具体来说,它允许综合工具在任何需要锁存器的地方放置时钟寄存器。

这通常被认为是一件好事,因为时钟寄存器(触发器)在 FPGA 和大多数其他技术中得到了很好的支持。它们是具有可预测时序的构建块,对于快速可靠的设计至关重要。

锁存器(“透明锁存器”)的时序可靠性较差,使得时序分析变得更加困难,因此 FPGA 通常不会很好地支持它们,并且不鼓励使用它们(尽管 ASIC 设计人员可以在非常小心的情况下成功使用它们)

因此,rising_edge() 并不完全“避免警告”——它放置了一个安全寄存器,而不是可能不可靠的锁存器,从而避免了潜在的时序问题。