前言
虽然以前也看过一些关于跨时钟域传输(下称CDC)的文章,但那时由于认识所限,对于不同类型的CDC更像是照本宣科,没有进行深入的思考。现在看的资料多了,再回过头来看这些关于CDC的文章,又有新的收获。因此决定写一篇博客总结一下我目前对于CDC的理解。
强烈推荐大家先看IC_Learner的这篇关于CDC的文章:https://www.cnblogs.com/IClearner/p/6485389.html
讲得非常全面,我的总结会以这篇文章为基础,做一些引申和补充。
同步时序电路中的亚稳态
首先明确一点:组合逻辑中的竞争与冒险会导致电路中出现毛刺,因此我们采用时序逻辑来过滤掉这些毛刺,避免其直接对电路的输出产生影响。只要我们使用了满足时序约束的时序电路,因组合逻辑的竞争与冒险而产生的毛刺是一定不会被传输到下一级的。
然而时序逻辑的使用也带来了这样一个约束:时钟采样时必须满足建立时间和保持时间的要求,否则就会使得采样到的数据进入亚稳态。
参见下图,传统的同步时钟域中的各个时钟要么是同频的,要么是不同频但有固定的相位关系的。对于这种情况,只要保证数据满足建立时间和保持时间的要求,那么就一定不会产生亚稳态。
然而对于异步时钟域,写时钟和读时钟之间没有固定的相位关系,那么如果不采取任何措施,随着工作时间的推移,电路中就一定会出现亚稳态。在读时钟的每个时钟有效沿,产生亚稳态的概率为:(建立时间 &#