EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Taio 于 2018-10-10 10:35 编辑 ( H: V) d) \+ S* K& B- f
. @( {; y# _* c1 q跨时钟域处理注意事项
0 E. T1 |6 R9 U) d/ }% o$ u, W 4、处理跨时钟域时要注意哪些问题
0 d) e0 d5 G3 D
( |0 g( S. @7 A 4.1)同步器前不能有组合逻辑电路 " \6 P; E1 t; R9 y9 [ S
% I1 K' S/ J$ c9 f& S2 q i
3 q( M. W! C# T! d4 V3 Q9 r* I
如上图,在前一个时钟域的dff输出和后一个时钟域输入之间不能有组合逻辑,原因是组合逻辑会造成毛刺现象,后一级时钟域的dff很可能敲到毛刺,进而引入错误。
8 q' E% |- q0 H- ^4 [/ B& K# q8 a
* O2 P7 C, w9 {* a0 }: p 4.2)避免重收敛(reconvergence)和分叉(divergence)
, t% g& i; P8 n* B) ?3 [/ b
6 l& ^3 y# B/ k2 i. Z5 O
* |2 I% Z- Y. A0 j& Z( J 重收敛的含义是,A时钟域的多根信号分别进行同步,同步到B时钟域,然后在B时钟域从新做逻辑汇聚成一根信号。这种同步的方式有一个很大的问题,你无法预期同步后的多根信号和之前还是一致的,例如,两根信号之前都是1,但是在同步后可能变成很多的情况。所以再重新汇聚肯定会出问题。例如下图中的状态机,在A时钟域可能是S1状态,但是同步后可能就变成了S2状态了。其实重收敛的问题可以避免,就是采用格雷码编码,避免一个时刻多个数据跳变。 ! e8 s, D6 _( H, o, r7 s
% o2 o9 J; Q( w" I2 X
/ |9 [7 h$ N% K! ` 如下图的格雷码编码再解码,就可以解决上述的一些问题。
& [. \ |0 S9 b- X$ C v+ m+ M; I. K; r
( V, j% d1 [3 ?; I5 Q0 p5 G
分叉的含义与之相反,在A时钟域的单根信号被分别同步到B时钟域的多根信号,这同样会面临同步不一致的情况,有的被同步成1,有的被同步成0。
1 [9 z+ l9 a5 A: G6 j# E+ \; P/ [
! \1 ? S6 n0 v N: f0 t! ?, v
2 N" _6 \ b* U; V
4.3)避免将cmd和data分开进行同步,而要绑定到一块采用异步fifo实现
& K: O" y' t5 M* m& a: E! o: C$ Q1 n' c2 n0 h/ ^ x
1 A) [: k8 V4 o2 M5 A: ^ Cmd和data经过异步fifo处理后的延迟可能会发生变化,所以应当避免将他们分开进行同步,而要绑定到一块进行同步{cmd,data}。
; i8 ~4 K) B7 D$ ^) Z/ u9 k9 ~$ G2 d- W
最后提一下异步复位同步释放电路,这种电路在soc中也广泛被使用。
) r. j ~. o5 B4 {# y$ X1 Y" G5 n7 e! Q
( C9 s' q; ^- T0 B
/ ]! V$ T0 o1 Q. h( M2 V5 R3 i/ X
|