赞
踩
跨时钟域(Clock Domain Conversion,CDC),无论是招聘笔试还是实际应用,都是数字IC前端的常见问题;还可变向地称为“脉冲同步问题”,“脉冲检测问题”等。
跨时钟域场景可分为以下几种:
单bit信号
1)从慢时钟域到快时钟域(快采慢)。
2)从快时钟域到慢时钟域(慢采快)。
1)异步FIFO(地址:格雷码)
2)握手机制?
1.整倍数的快信号,无论相位如何,都可以采样到慢信号
2.不是整倍数的快信号,有可能出现采集不到???
做三级D触发器,判断???原因是防毛刺吗??
最简单的单比特信号处理通常采用两级DFF串联进行同步,如下图所示:
从时钟域A(CLKA)传过来的信号a_in, 直接用时钟域B CLKB采用很容易产生亚稳态,用两级DFF 敲过后再使用就可以把亚稳态概率降到一个合理的值。
很多人可能会问,为什么是两级DFF呢?一级或者三级DFF行不行呢?这里有一个平均失效间隔时间MTBF(Mean Time Between Failure)的考虑。MTBF时间越长,出现亚稳态的概率就越小,但是也不能完全避免亚稳态。注意采样时钟频率越高,MTBF可能会迅速减小。
有文献给出的数据:对于一个采样频率为200Mhz的系统,如果不做同步MTBF是2.5us,一级DFF同步的MTBF大概是23年,两级DFF同步的大约MTBF大概是640年,MTBF越长出错的概率越小。所以一级看上去不太稳,二级差不多够用了,至于三级可能会影响到系统的性能,而且增加面积,所以看上去没什么必要。
两级DFF同步器听起来够简单的吧?这个方法虽然很简单,但是很多人用起来还是常常会犯错。
错误1 :时钟域A的组合逻辑信号直接敲两级DFF同步到时钟域B
如下图(1)所示虽然时钟域A的逻辑信号c0 传输到时钟域B的时候,也用了两级DFF 同步器,但我们知道组合逻辑电路各个输入信号的不一致性以及组合逻辑内部路径的延时时间不一样,运算后的信号存在毛刺如图(2),而我们又无法预先知道CLKB 的上升沿何时会到来,CLKB 采样到的信号就无法预知,这显然不是我们想要的结果。
因此,要想CLKB 能采到稳定的信号,时钟域A的信号必须是经过CLKA 敲过,在一个时钟周期内是稳定的信号,如图(3)所示:
错误2 : Clock-gating enable 信号没有经过异步处理
作者:IC君
链接:https://www.jianshu.com/p/81eec134a8c2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- module cdc_1bit_slow2fast(
- input i_clk,
- input i_rst,
- input i_cdc_signal,
- output reg o_cdc_signal
- );
-
- reg s_cdc_signal_d1;
- reg s_cdc_signal_d2;
- reg s_cdc_signal_d3;
-
- always@(posedge i_clk)
- begin
- s_cdc_signal_d1 <= i_cdc_signal ;
- s_cdc_signal_d2 <= s_cdc_signal_d1;
- s_cdc_signal_d3 <= s_cdc_signal_d2;
- end
-
- always@(posedge i_clk or posedge i_rst)
- begin
- if(i_rst)
- o_cdc_signal <= 1'b0;
- else if(s_cdc_signal_d3 == s_cdc_signal_d2)
- o_cdc_signal <= 1'b1;
-
- end
-
- endmodule
将快信号先展宽,再采样
Verilog HDL代码如下:
将多bit数据用时钟域A存储于异步FIFO中,再在时钟域B读出来,这其中读写时钟域不同,造成读写速度差异需要处理。
处理方法就是比较读写地址,让写地址快于读地址,那么我们肯定只能在一个时钟域下进行比较动作(读时钟域B),这就涉及到了写地址跨时钟域处理。工程上推荐采样:bin -> gray -> bin 方式。因为格雷码每次进位只改变期中一bit,跨时钟域后采样后信号不容易出错。而二进制每次进位可能有多个bit同时改变,跨时钟域后的采样信号出错概率很高。
下面是格雷码与二进制的互转方法:
参考文章
[1]《IC面试中常被问到——跨时钟域信号如何处理?》IC君 2018.09 https://www.jianshu.com/p/81eec134a8c2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。