当信号产生于一个时钟域,并穿过该时钟域边界,作用于另一时钟域时,称该信号为跨时钟信号,由
此引发的一系列问题称之为 CDC(clock domain crossing, 简称 CDC)问题。
跨时钟域风险
1. 亚稳态
因为进入的数据未能满足触发器的建立时间和保持时间,触发器的输出在一段时间内无法保持一个确定的状态。如下图1所示,clkA和clkB为不同时钟,第一个触发器输出在DFF2的建立时间和保持时间内不断变化,导致DFF2的输出有误,上下动弹甚至出错,出现了亚稳态现象。图2所示为出现亚稳态时的时序图。
2. 数据丢失
当数据从快时钟域进入慢时钟域时,会出现慢时钟域没有采样到快时钟域的信号,从而出现数据丢失的情况,进而导致系统出现故障。如下图所示,快时钟域 clockA 输出脉冲信号 Q1 到慢时钟域 clockB,在右侧时序图中可以看到此时 clockB 时钟根本没有采样到该脉冲信号。
跨时钟域处理
1. 两级同步
两级同步就是我们常说的“打两拍”,这可以有效降低亚稳态出现的概率。两级同步处理只适合单比特电路。
下图所示为两级同步原理图,图中 DB1 是第一个触发器的输出,Dout 是第二个触发器的输出。Dout
用来避免亚稳态信号传递到其他后续电路中,一旦同步后的信号有机会稳定下来,就会把信号传递出去。
两个触发器之间不加任何逻辑,可以为信号稳定争取足够的时间。
2. 信号展宽
信号展宽主要是解决单比特信号从快时钟域跨越到慢时钟域时产生信号丢失风险。在快时钟域将跨时
钟域信号至少展宽成慢时钟域时钟周期的两倍,使得跨时钟域信号对于目的时钟域来说是一种电平信号。
如下图所示,左侧红色椭圆圈内是展宽逻辑,这里仅做示意,只展宽成发送时钟域的两个时钟周期。
3. 格雷码
格雷码的独特之处在于相邻两数变换的时候只有1个bit发生改变,通常用于异步fifo的地址传递。所以对于总线的数据,在跨时钟传递前应该进行格雷码转换,然后再传递出去。
4. 握手电路
note:仅适用于快时钟域向慢时钟域的数据传输
握手电路的步骤是:
- 源时钟域向目的时钟域发送req信号和数据信号
- 目的时钟域接收到req和数据信号后,会回发一个ack信号
- 源时钟域接收到ack信号后会拉低req信号,整个数据交换完成
note: req信号和ack信号要在对方时钟域进行两级同步
5. 异步fifo
一般情况下,基本会采用异步fifo传递数据,不受任何限制。但是异步fifo非常消耗资源。