【问题标题】:Solving Metastability Using Double-Register Approach使用双寄存器方法解决亚稳态
【发布时间】:2017-04-12 06:55:40
【问题描述】:

为了解决Verilog中不同时钟域引起的亚稳态,采用双寄存器方法。

但据我所知,亚稳态的最终输出是不确定的。输出独立于输入。

那么,我的问题是如何使用双寄存器方法保证输出的正确性?

谢谢。

【问题讨论】:

标签: vhdl verilog fpga clock


【解决方案1】:

你不能完全确定你避免了亚稳态。 正如您所提到的,亚稳态触发器的输出是不可预测的,因此即使使用“双寄存器”方法,当您具有亚稳态时,您也可能会传播错误的值。

然而,此方法从未打算解决亚稳态,而是试图降低亚稳态值进入电路的可能性。所谓的here MTBF(平均故障间隔时间)。要减少 MTBF,您甚至可以链接 2 个以上的寄存器。

即使这不能解决一个值的不可预测性,使用这些双寄存器也很有趣,因为当一个值是亚稳态时,它会一直振荡直到稳定到 0 或 1。

这种振荡会使您的电路发生切换,然后由于每次转换都会消耗能量,因此会消耗大量能量。因此,使用双寄存器进行时钟域交叉很重要。

为了确保您的数据有效,您可以在两个时钟域之间使用请求确认机制。

快速示例:

  1. 将数据设置到总线(双寄存器的输入)
  2. 等待 1 个(或更多)时钟周期,以确保数据在另一侧建立良好
  3. 发送请求信号(双寄存器输入)
  4. 最坏情况:请求信号是亚稳态的,一旦稳定就保持在 0。下一个时钟周期它将为 1,因为它已经设置为 1 至少 1 个时钟周期。最佳情况:下一个周期目的地将接受数据
  5. 数据稳定,请求稳定,在1->可以消费数据。向来源发送确认。
  6. 确认到达(在亚稳态的情况下在双寄存器上)。如果是亚稳态的,它可能需要一个时钟周期才能到达。
  7. 请求失败。
  8. 可以通过总线发送其他数据

此协议称为 4 阶段协议。你可以在网上找到很多关于它的文档,因为它是异步设计的经典协议。

这很容易理解和实现。但请记住,它会产生非常重要的区域开销。

希望对你有帮助。

【讨论】:

  • 感谢 Krouitch,但我仍然有些困惑。那么,在第4步之后,我只能保证请求信号稳定为1,但是如何保证数据也稳定呢?谢谢。
  • 如果您在发送请求之前至少发送了一个时钟周期的数据,那么数据必须是稳定的。如果不是,则意味着路径对于您选择的时钟周期来说太长了。这是一篇说明我的意思的文章:eetimes.com/document.asp?doc_id=1276114
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多