跨时钟域电路设计1--单比特信号传输
亚稳态
跨时钟域同步器
同步器是跨时钟域中设计的一种常用电路,其目的是把同步失败的可能性降到最低。我们希望亚稳态在一个同步周期(目标时钟域的时钟周期)内解决,以便我们可以在目标时钟域中使得触发器的输出是安全采样值。在此我们把同步器的两次采样出现问题之间的时间间隔,称为平均故障间隔时间(MTBF)。
在跨时钟域(CDC)中出现亚稳态的概率与以下因素成正比:
-
目标时钟域的时钟频率
- 跨时钟边界的数据传输速率
最基本的同步器是两个串联的触发器,均由目的时钟域提供时钟。这个电路称为两个触发器同步器。如果输入数据的变化非常接近接收时钟边沿(在建立/保持时间内),则同步器中的第一个触发器可能会变为亚稳态,但是在信号被采样之前,仍然有一个完整的时钟使信号变得稳定--第二触发器。然后,目标时钟域的逻辑使用的是第二个触发器的输出。
两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立/保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间 + 第二级触发器的建立时间 <= 时钟周期。如果不满足上述表达式,那么到第二个触发器开始,信号仍然可能是亚稳态的。在这种情况下,将发生同步错误,并且设计可能会发生故障,但是这种情况是很罕见的。
两个触发器同步器足以满足很大部分应用的需求了。为了进一步提高MTBF,有时会使用具有更好的建立/保持时间特性的库单元(其具有低阈值电压)构建两个触发器同步器。因为在组合逻辑电路中常常因为各个输入信号的不一致性以及各路径延迟的不一样,可能导致输出结果存在毛刺。
而在跨时钟域时,又不确定目的时钟域时钟上升沿什么时候到来,因此目的时钟域时钟的采样就更加无法保证。
因此必须保证两个时域的触发器之间没有组合逻辑。
慢时钟域到快时钟域
最简单的情况是将信号从慢速时钟域传递到快速时钟域。只要快时钟的频率大于慢时钟频率的1.5-2倍,通常就不会有问题。快速目标时钟将简单地对慢速信号进行多次采样。在这些情况下,一个简单的两级串联触发器同步就足够了。目的时钟域如果不采取任何操作,那么就会多次采样同一个值,这会导致一个问题--电路误以为这是多个操作。因此为了避免这种错误的发生,通常添加一些简单的逻辑使得同步后的采样值出现周期和原时钟域的一样。具体操作,在soc设计方法与实现书上有讲。如果快时钟的频率小于慢时钟频率的1.5倍,也就是稍微快点,这个欢迎各位讨论,我觉得使用。
快时钟域到慢时钟域
困难的情况是将快速信号传递到慢速时钟域。明显的问题是,如果快速信号上的脉冲短于慢速时钟的周期,则该脉冲可能会在被慢速时钟采样之前消失。下面的波形显示了这种情况。还是使用两级触发器
一个简单的两个触发器同步器是跨时钟域交叉传输信号的最快方法。只要在快速时钟域中生成的信号比慢速时钟的周期时间宽,在许多应用中就足够了。例如,如果只需要同步缓慢变化的状态信号,则可能会起作用。一个安全的经验法则是信号必须大于目标时钟周期宽度的1.5倍。这保证了信号将被目标时钟的至少一个(但可能更多)时钟沿采样。可以使用SystemVerilog断言(SVA)轻松检查需求。当源和目标的相对时钟频率固定时,很容易实现1.5x的周期宽度。但是在现实世界中,情况并非如此。目标时钟可以采用多种不同的频率,它们可以与源时钟更快/更低/相同。在那种情况下,设计时钟域交叉信号来满足最慢目标时钟的1.5倍周期宽度并不容易。采用具有反馈信号的同步器