亚稳态和跨时钟域CDC
一、亚稳态
1.亚稳态的概念:当输入数据不满足寄存器的建立时间或保持时间,寄存器很有可能捕捉到的电平是处于0和1之间的状态,这样输出就不是一个确定的值,就会出现亚稳态
2.亚稳态的恢复时间:亚稳态持续了tMET时长后,恢复到稳定的电平状态(稳定,但不一定是正确的),这段持续的时间叫做亚稳态的恢复时间。亚稳态能够恢复稳定,是因为反相器的再生性。
一般情况下这段时间不会超过一到两个时钟周期(取决于触发器的性能)。如果亚稳态的持续时间过长,就有可能被下一级的触发器捕获,导致下一级触发器也处于亚稳态,这就是亚稳态的传播现象。
3.故障平均间隔时间 MTBF(mean time between failure):
其中:C1、C2都是与器件本身有关的参数;fclk1:前级时钟的频率;fclk2:后级时钟的频率
tsclack:时序裕量
C2:器件的建立时间和保持时间越小,C2越小,因此我们可以使用更快的触发器;
降低时钟频率也可以提高MTBF;
使用同步器可以提高时序裕量,进而增大MTBF
4.减少亚稳态的几点建议:
- 使用同步器
- 满足需求的情况下,降低时钟频率
- 采用反应更快的触发器
- 减少或者避免使用那种信号翻转时间很长的输入信号
二、跨时钟域 CLOCK DOMAIN CROSSING
1. 单比特信号跨时钟域
如果是持续时间较长的电平信号,可以直接打两拍跨时钟域;
而如果是脉冲信号则需要分情况讨论:
脉冲信号跨时钟域要满足三边沿要求(three edge requirement),即一般要求接收时钟域中采样信号要保持三个时钟上升沿的长度,即时钟周期的1.5倍。否则就有可能出现漏采
为了满足这种要求,有以下几种方法:
- 握手反馈
如图,将A时钟域的脉冲信号打一拍传输到B时钟域中打两拍同步,同步后的信号再反馈回A时钟域,在A时钟域打两拍同步,将FF1的输出拉低.
2.窄脉冲捕捉电路
如图,利用脉冲信号的上升沿输出脉冲信号,通过FF3反馈回来的信号清0.同样,窄脉冲信号的频率不能太快,否则会漏采。如下图,窄脉冲的时间间隔应该大于三个时钟周期
这个电路的缺点也很明显:将窄脉冲信号作为时钟,会消耗额外的始终资源;并且毛刺也会导致不可预知的错误,因此不推荐使用。
3.脉冲展宽(结绳法)
适合快时钟域到慢时钟域,且脉冲信号的间隔时间必须要大于慢时钟域的时钟周期的两倍,否则在慢时钟域无法进行边沿检测。
具体步骤如下:
先将clka下的脉冲信号转换为电平信号,再用clkb将这个电平信号打三拍得到pulse_s0,pulse_s1,pulse_s2;最终将pulse_s1和pulse_s2异或,即可得到clkb时钟下的脉冲信号。
电路图如图,在快时钟域使用多路选择器“结绳”将脉冲转换为电平;
在慢时钟域使用异或门“解绳”检测边沿,恢复脉冲信号。
代码如下:
4.完整的握手机制
先在clk1结绳打一拍后输出到clk2,在clk2打两拍后解绳;再将得到的脉冲信号在clk2结绳,打一拍后输出到clk1,在clk1打两拍同步后解绳,即为clk2的应答信号。
这种方法快到满、慢到快都可以用,就是效率太低。
2. 多比特信号跨时钟域
- 异步FIFO
- 异步双口RAM+格雷码
- 握手
- DMUX同步器
先写这么多,以后再慢慢补充