亚稳态和跨时钟域CDC

一、亚稳态

1.亚稳态的概念:当输入数据不满足寄存器的建立时间或保持时间,寄存器很有可能捕捉到的电平是处于0和1之间的状态,这样输出就不是一个确定的值,就会出现亚稳态
2.亚稳态的恢复时间:亚稳态持续了tMET时长后,恢复到稳定的电平状态(稳定,但不一定是正确的),这段持续的时间叫做亚稳态的恢复时间。亚稳态能够恢复稳定,是因为反相器的再生性
一般情况下这段时间不会超过一到两个时钟周期(取决于触发器的性能)。如果亚稳态的持续时间过长,就有可能被下一级的触发器捕获,导致下一级触发器也处于亚稳态,这就是亚稳态的传播现象。
3.故障平均间隔时间 MTBF(mean time between failure):
亚稳态和跨时钟域CDC
其中:C1、C2都是与器件本身有关的参数;fclk1:前级时钟的频率;fclk2:后级时钟的频率
tsclack:时序裕量
C2:器件的建立时间和保持时间越小,C2越小,因此我们可以使用更快的触发器;
降低时钟频率也可以提高MTBF;
使用同步器可以提高时序裕量,进而增大MTBF
4.减少亚稳态的几点建议:

  1. 使用同步器
  2. 满足需求的情况下,降低时钟频率
  3. 采用反应更快的触发器
  4. 减少或者避免使用那种信号翻转时间很长的输入信号

二、跨时钟域 CLOCK DOMAIN CROSSING

1. 单比特信号跨时钟域
如果是持续时间较长的电平信号,可以直接打两拍跨时钟域;
而如果是脉冲信号则需要分情况讨论:
脉冲信号跨时钟域要满足三边沿要求(three edge requirement),即一般要求接收时钟域中采样信号要保持三个时钟上升沿的长度,即时钟周期的1.5倍。否则就有可能出现漏采
为了满足这种要求,有以下几种方法:

  1. 握手反馈
    亚稳态和跨时钟域CDC
    如图,将A时钟域的脉冲信号打一拍传输到B时钟域中打两拍同步,同步后的信号再反馈回A时钟域,在A时钟域打两拍同步,将FF1的输出拉低.
    2.窄脉冲捕捉电路
    亚稳态和跨时钟域CDC
    如图,利用脉冲信号的上升沿输出脉冲信号,通过FF3反馈回来的信号清0.同样,窄脉冲信号的频率不能太快,否则会漏采。如下图,窄脉冲的时间间隔应该大于三个时钟周期
    亚稳态和跨时钟域CDC
    这个电路的缺点也很明显:将窄脉冲信号作为时钟,会消耗额外的始终资源;并且毛刺也会导致不可预知的错误,因此不推荐使用。
    3.脉冲展宽(结绳法)
    适合快时钟域到慢时钟域,且脉冲信号的间隔时间必须要大于慢时钟域的时钟周期的两倍,否则在慢时钟域无法进行边沿检测。
    具体步骤如下:
    先将clka下的脉冲信号转换为电平信号,再用clkb将这个电平信号打三拍得到pulse_s0,pulse_s1,pulse_s2;最终将pulse_s1和pulse_s2异或,即可得到clkb时钟下的脉冲信号。
    亚稳态和跨时钟域CDC
    电路图如图,在快时钟域使用多路选择器“结绳”将脉冲转换为电平;
    在慢时钟域使用异或门“解绳”检测边沿,恢复脉冲信号。
    代码如下:
    亚稳态和跨时钟域CDC
    4.完整的握手机制
    亚稳态和跨时钟域CDC
    先在clk1结绳打一拍后输出到clk2,在clk2打两拍后解绳;再将得到的脉冲信号在clk2结绳,打一拍后输出到clk1,在clk1打两拍同步后解绳,即为clk2的应答信号。
    这种方法快到满、慢到快都可以用,就是效率太低。

2. 多比特信号跨时钟域

  1. 异步FIFO
  2. 异步双口RAM+格雷码
  3. 握手
  4. DMUX同步器

先写这么多,以后再慢慢补充