EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Taio 于 2018-10-10 10:35 编辑 7 z! s8 P+ b4 u' g
" ?' Q' R3 `0 p: C跨时钟域处理注意事项 1 r2 f+ {/ Z) ^( z! X$ H
4、处理跨时钟域时要注意哪些问题
: |# Y6 V4 a8 Q) h
* a& g* r0 L% S2 E3 j1 ^ 4.1)同步器前不能有组合逻辑电路 5 a5 \& \' j }! K
5 z K8 |9 v9 s4 P4 X
: f& r2 e# y* p* O 如上图,在前一个时钟域的dff输出和后一个时钟域输入之间不能有组合逻辑,原因是组合逻辑会造成毛刺现象,后一级时钟域的dff很可能敲到毛刺,进而引入错误。 ' ^0 R% x- `1 O& g0 A, B: J' U4 q
6 S8 g- P, _+ F) S6 [+ G 4.2)避免重收敛(reconvergence)和分叉(divergence) , x) K) x+ C# `# ~3 m! n7 K
1 F$ x1 F; F) C; D
/ ~$ b E; N3 Q' \9 P 重收敛的含义是,A时钟域的多根信号分别进行同步,同步到B时钟域,然后在B时钟域从新做逻辑汇聚成一根信号。这种同步的方式有一个很大的问题,你无法预期同步后的多根信号和之前还是一致的,例如,两根信号之前都是1,但是在同步后可能变成很多的情况。所以再重新汇聚肯定会出问题。例如下图中的状态机,在A时钟域可能是S1状态,但是同步后可能就变成了S2状态了。其实重收敛的问题可以避免,就是采用格雷码编码,避免一个时刻多个数据跳变。 0 y+ J( R& ]7 v( T, f* H
3 O9 m3 `* @) O# D n. Y& e. Z
$ p% `5 ]" B% D/ h9 u! `, Y 如下图的格雷码编码再解码,就可以解决上述的一些问题。5 M4 f" o8 O3 I: Q) _4 M
x, u9 K/ q3 F9 b
% h( t8 Y( |. \$ B
分叉的含义与之相反,在A时钟域的单根信号被分别同步到B时钟域的多根信号,这同样会面临同步不一致的情况,有的被同步成1,有的被同步成0。
$ u% b( w: b+ n$ M0 U5 M- [8 [( M% g" y) ^# H
* H5 z0 T: A8 @; j: j9 E 4.3)避免将cmd和data分开进行同步,而要绑定到一块采用异步fifo实现 * C3 M8 t. O0 p T$ T7 [
7 D( Y6 P2 P; z! r; ?
- x; {0 e% e4 B. K/ W- ]
Cmd和data经过异步fifo处理后的延迟可能会发生变化,所以应当避免将他们分开进行同步,而要绑定到一块进行同步{cmd,data}。
9 N" f4 ^% V( t* u& V7 \8 o3 b2 a" F( R3 J' [1 O$ R, ~# O+ [+ G
最后提一下异步复位同步释放电路,这种电路在soc中也广泛被使用。
3 M# E; W& J; W6 [" f) @ T
' v* j0 q' N x# c( C0 h# o
4 A3 q) I6 V& f3 v
& p- k& ?* ]% M9 C: @' y |