前言
最近认识一位行业前辈,经过他的一番指点,我对于 CDC 又有了更深入的认识,在这里记录一下。
本文主要讲多 bit CDC的问题,是这篇文章和这篇文章的拓展。
格雷码的具体用途
在上篇文章中,我曾经写到格雷码也可以用作 CDC 中数据的传输,具体操作就是本时钟域的数据转换成格雷码后在目标时钟域打两拍,但这种说法是片面的。
我们暂且不提为什么这种说法是片面的,首先提出一个假设:多 bit 数据在 CDC 中如果有多位数据同时发生翻转,那么 CDC 必定失败。有的同学可能就会问了:格雷码不是可靠性编码吗,每次都只有一位会发生变化,不会出现多位同时翻转吧?
这么想你就错了。
格雷码每次只有一位发生变化的前提是,数据是递增或递减的。对于一个4位的数据,当它从2变到3的时候,格雷码的变化为:0011 -> 0010
,只有一位发生了变化;但当它从2变到7的时候,格雷码的变化为:0011 -> 0100
,低3位都变了!
我们在 CDC 中传输数据时,数据之间的关系是不