2016-11-28 373 views
1

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

但据我所知,亚稳态的最终输出是不确定的。输出与输入无关。

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

谢谢。

+1

这个问题可能更适合http://electronics.stackexchange.com/ –

+0

好的,谢谢。我可以再次发布这个问题吗? –

回答

1

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

这种方法却从来没有打算解决亚稳态,但试图以减少亚值进入你的电路的概率。所谓的here MTBF(平均无故障时间)。为了减少MTBF,你甚至可以链接更多的2个寄存器。

即使这没有解决的一个值的非预测的烦躁,有趣的是,使用这些双寄存器,因为当一个值是亚稳态,它会振荡,直到它稳定为0或1

该振荡将使您的电路切换,然后使用大量的能量,因为每个转换都消耗能量。由于这个原因,使用双寄存器进行时钟域交叉非常重要。

为了确保您的数据是有效的,虽然,你可以使用两个时钟域之间的请求 - 应答机制。

快速例如:

  1. 数据集到所述总线(双寄存器输入)
  2. 等待1(或更多)个时钟周期,以确保该数据在另一侧
  3. 很好地建立
  4. 发送请求信号(一个双寄存器的输入)
  5. 最坏的情况:该请求信号是亚稳态,并在0一旦稳定保持。下一个时钟周期为1,因为在至少1个时钟周期内它已经设置为1。最佳案例:下一个周期目的地将接受数据
  6. 数据稳定,请求稳定并且在1→数据可以被消耗。向源发送确认。
  7. 确认到达(在亚稳态下双寄存器)。如果亚稳,它可能需要更多的时钟周期才能到达。
  8. 请求下降。
  9. 另一个数据可以经由总线

该协议被称为四相协议来发送。您可以在网上找到大量有关它的文档,因为它是异步设计的经典协议。

这是很容易理解和实施。请记住,它会产生一个非常重要的开销。

希望它有帮助。

+0

谢谢Krouitch,但我仍然有些困惑。所以,在第4步之后,我只能保证请求信号稳定在1,但是如何保证数据也是稳定的?谢谢。 –

+0

如果您在发送请求前至少发送了一个时钟周期的数据,那么数据必须稳定。如果不是这意味着路径对于您选择的时钟周期来说太长。 这里是一篇文章,说明我的意思:http://www.eetimes.com/document.asp?doc_id=1276114 – Krouitch