对于多bit数据跨时钟,各个bit之间路径延迟不一样,源时钟域给的数据是2‘b11,目的时钟域采样到的数据可能2’b10。因此两级触发器对于单bit数据跨时钟是可以用的,但是对于多bit数据跨时钟就会出错。 握手处理的关键是利用源的时钟req和目的时钟ack,在一段时间让需要跨时钟的多bit信号保持不变,至少在目的时钟采样时保持不变。当然req和ack在跨时钟时也要两级寄存器处理,并且不能是窄脉冲信号,需要是有一定宽度的电平信号,否则慢时钟就有可能采样不到快时钟的req。
下面的2-phase更高效,因为它只有src_req翻转一次(ack翻转一次)就开始握手并传输数据一次。 4-phase的例程代码。发送端需要检测ack的下降沿(打两拍+一拍),才会更新发送端的数据(cnt加1),并且确定了ack下降到0才会把req置1,开始下一次握手。 接收端是把req打两派就可以接收数据了,只要req为1就接收数据。 模块cdc_sync就是打两拍处理。