EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Taio 于 2018-10-10 10:35 编辑 ' j4 ]6 z& @! c$ A* d' U
$ ^ A' e8 U" z/ B% G7 R
跨时钟域处理注意事项 ) ~0 |5 B/ C7 m" M9 L9 n
4、处理跨时钟域时要注意哪些问题 & X% T, z9 F% O" h) Q. M& S/ |5 v# O
$ n$ f2 S$ O! y1 U1 X 4.1)同步器前不能有组合逻辑电路 $ Y: P* a' U1 W. i V
- e9 A9 \" {" A
* ]' B" _% l D) D) M* d
如上图,在前一个时钟域的dff输出和后一个时钟域输入之间不能有组合逻辑,原因是组合逻辑会造成毛刺现象,后一级时钟域的dff很可能敲到毛刺,进而引入错误。
1 M, ?/ y7 Q) G% n* V0 c. o: |7 t5 U
0 l. K/ o% @4 A' R 4.2)避免重收敛(reconvergence)和分叉(divergence) 4 h8 d6 p6 O4 F
8 I+ P% ^+ E( t* I( K B( x0 q4 t
6 E `8 W5 D! Z7 R% C% r 重收敛的含义是,A时钟域的多根信号分别进行同步,同步到B时钟域,然后在B时钟域从新做逻辑汇聚成一根信号。这种同步的方式有一个很大的问题,你无法预期同步后的多根信号和之前还是一致的,例如,两根信号之前都是1,但是在同步后可能变成很多的情况。所以再重新汇聚肯定会出问题。例如下图中的状态机,在A时钟域可能是S1状态,但是同步后可能就变成了S2状态了。其实重收敛的问题可以避免,就是采用格雷码编码,避免一个时刻多个数据跳变。 % ^/ }2 N$ B# D5 I
0 W$ {+ u0 m+ s1 c# N |) I% \
; w' \$ K u. e6 X& @ 如下图的格雷码编码再解码,就可以解决上述的一些问题。
, a# Z# _5 \' a# ^5 l# U t8 O7 j! n. Q
2 g# U7 U8 v1 g5 Z- U j* R4 d
$ t" m. R: t, {! o% z
分叉的含义与之相反,在A时钟域的单根信号被分别同步到B时钟域的多根信号,这同样会面临同步不一致的情况,有的被同步成1,有的被同步成0。
$ c4 }2 g V+ a# G/ {4 @1 O4 Q9 N$ t. r
! l9 M# d3 e1 V" P
4.3)避免将cmd和data分开进行同步,而要绑定到一块采用异步fifo实现
9 }2 t; [2 s n8 O1 t) k
- I" S& p6 D* q) v2 _
8 G* J: P h. [5 Z# K# ~
Cmd和data经过异步fifo处理后的延迟可能会发生变化,所以应当避免将他们分开进行同步,而要绑定到一块进行同步{cmd,data}。
6 I1 @) Y- C& t- g' s( ]& ^/ N. m8 h' t0 l3 o
最后提一下异步复位同步释放电路,这种电路在soc中也广泛被使用。 + E. ^9 {8 O6 _; H4 p( w( r
: l/ C/ J" U( |' B. H+ b ^
3 |" `5 y3 q% b* k5 ^- q# T m
7 c) T; P0 d2 E/ K1 I
|