为了解决Verilog中不同时钟域引起的亚稳态,采用双寄存器方法。
但据我所知,亚稳态的最终输出尚未确定。输出独立于输入。
那么,我的问题是如何保证使用双寄存器方法输出的正确性?
Thanks.
您不能完全确定您避免了亚稳态。
正如您所提到的,亚稳态触发器的输出是不可预测的,因此当您具有亚稳态时,即使使用“双寄存器”方法,您也可能会传播错误的值。
然而,这种方法并不是为了解决亚稳态问题,而是试图降低亚稳态值进入电路的可能性。什么叫做here http://www.asic-world.com/tidbits/metastablity.htmlMTBF(平均故障间隔时间)。为了减少 MTBF,您甚至可以链接 2 个以上的寄存器。
即使这不能解决值的不可预测性,使用这些双寄存器也是很有趣的,因为当一个值处于亚稳态时,它会振荡直到稳定到 0 或 1。
这种振荡将使您的电路切换,然后徒劳地使用大量能量,因为每次转换都会消耗能量。因此,使用双寄存器进行时钟域交叉非常重要。
为了确保数据有效,您可以在两个时钟域之间使用请求确认机制。
快速示例:
- 将数据设置到总线(双寄存器的输入)
- 等待 1 个(或更多)时钟周期以确保数据在另一侧建立良好
- 发送请求信号(双寄存器的输入)
- 最坏的情况:请求信号是亚稳态的,一旦稳定就保持在 0。下一个时钟周期它将为 1,因为它已经在至少 1 个时钟周期内设置为 1。最好的情况:下一个周期目的地将接受数据
- 数据稳定,请求稳定,1->可以消费数据。向来源发送确认。
- 确认到达(在亚稳态的情况下在双寄存器上)。如果是亚稳态,可能需要更多的时钟周期才能到达。
- 请求下降。
- 可以通过总线发送另一个数据
该协议称为四阶段协议。您可以在网上找到很多有关它的文档,因为它是异步设计的经典协议。
它非常容易理解和实施。但请记住,它会在非常重要的区域产生开销。
希望能帮助到你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)