什么时候在支持两者的 FPGA 中使用锁存器比使用触发器更好?

电器工程 FPGA 拖鞋
2022-01-13 02:32:43

问题:

什么时候在支持两者的 FPGA 中使用锁存器比使用触发器更好?

背景:

FPGA中应避免电平敏感透明锁存器,而应专门使用边沿敏感触发器,这是一个众所周知的原则。大多数 FPGA 架构本身就支持锁存器和触发器。

一般的建议——即使来自 FPGA 供应商——是要注意锁存器,或者永远不要使用锁存器等。这个建议有很好的理由,其中的细节都是众所周知的。然而,大多数建议的措辞是“除非你知道你需要它们,否则不要使用闩锁”。

我是一位经验丰富的 FPGA 设计师,多年来,每当我认为自己需要一个锁存器时,我很快就意识到使用触发器有更好的方法。我很想听听什么时候使用闩锁更好的例子。

重要的提示:

闩锁与人字拖经常让人们生气。我只对问题的答案感兴趣。解释锁存器和触发器之间区别的响应,解释使用不使用锁存器的原因,详细说明为什么触发器比锁存器更好,谈论锁存器在非 FPGA 目标中如何更好等,将完全是题外话。

4个回答

你的问题基本上是,“你什么时候知道你需要闩锁?” 正如您所暗示的,这是一个主观问题。期望更多的意见而不是事实作为答案。话虽如此,这是我的看法:

我和你一样,经常找到更好的方法来使用触发器,从而避免闩锁。生成的逻辑通常更加优雅和健壮。但是有时我对逻辑没有足够的控制来避免闩锁。例如,我可能正在连接需要锁存器以满足所需规格的处理器总线。由于我无法重新设计 CPU 或总线,所以我被锁住了。

在过去 13 年多的时间里,这是我唯一一次需要闩锁。

触发器通常比闩锁更可取,因为它们只有四个竞争条件/约束:

  1. 数据输入变化和随后的有效时钟沿之间的建立时间,以及
  2. 时钟边沿和数据输入的下一次变化之间的保持时间;
  3. 最小有效时钟脉冲持续时间;
  4. 最小非活动时钟脉冲持续时间。

如果满足这些约束,触发器的输出将完全“干净”并且没有不稳定。此外,触发器的时序在某种意义上是“数字的”:只要满足时序约束,输出只会在有效时钟沿之后的可预测窗口内改变,而与输入时序无关。因此,无论深度如何,级联触发器的效果都是可以预测的。相比之下,锁存器输出的时序更加“模拟”。信号进入锁存器的延迟会导致信号输出延迟。即使满足锁存器自身的约束,这种延迟也可能导致下游问题。

我建议在芯片输出的所需行为可能最合理地由一个建模的情况下使用锁存器。例如,一个硬件应该充当串并转换器,在帧同步之后的第一个时钟的上升沿和下降沿之间,第一个输出跟踪输入;在第二个时钟的上升沿和下降沿之间,第二个输出跟踪输入等。可以使用触发器和纯组合逻辑设计一种电路,只要满足时序约束,就会产生这种行为,但这样的电路会更多比使用锁存器更复杂,并且如果不满足时序约束,则更容易出现奇怪的行为。

在我的工作中,有时我必须在 FPGA 中实现锁存器,但这始终是“最后的手段”解决方案。典型应用包括与异步接口或总线的连接,如果我不能保证时钟的速度足以确保总线和控制信号的正确采样和同步。

主要问题是锁存器是一个异步块。因此,您必须确保为锁存器生成输入信号的组合函数是无竞争的。否则它们可能会产生故障,这些故障可能会被锁定,从而对您的系统造成危害

为了避免竞争,你必须以一种特殊的冗余方式来实现这些组合功能。不幸的是(在这种特殊情况下 ;-),否则它是一个非常好的属性)FPGA 综合工具优化了您的设计,消除了所有冗余。因此,如果您想在 FPGA 中实现锁存器,您必须“手动”实现它,并防止优化(例如,在 VHDL 中,您可能需要为锁存器内部使用的信号将属性“keep”设置为“true”) .

从时间上看:

如果我们在设计中使用触发器,那么性能取决于最长的组合路径延迟。

如果我们使用锁存器代替触发器,我们可以通过从下一阶段的较短路径延迟中借用时间来补偿最长的组合路径延迟。有了这个,我们可以减少延迟并提高设计的性能。