EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Taio 于 2018-10-10 10:35 编辑
- k# h/ A# t- Z+ c8 n
8 ~' x- G9 F0 I5 A/ q* R; A跨时钟域处理注意事项
0 M4 u0 }- D2 k5 s/ T; X; q 4、处理跨时钟域时要注意哪些问题 8 u8 b8 V3 y0 v( _
+ ?. D* o+ }1 h 4.1)同步器前不能有组合逻辑电路
( K7 o! O3 R4 g4 z' Y4 F6 s/ H$ Y5 e9 g+ Y- q" n: {) g& x
' D4 J; `6 ^& f' O2 I- y
如上图,在前一个时钟域的dff输出和后一个时钟域输入之间不能有组合逻辑,原因是组合逻辑会造成毛刺现象,后一级时钟域的dff很可能敲到毛刺,进而引入错误。 & j6 j) }& B1 K9 }5 O
! y" v0 p% ^; N/ H2 z
4.2)避免重收敛(reconvergence)和分叉(divergence)
; |# ^- a! c+ {$ k- W/ c, H
# @( x0 k- f3 \/ L
" ?7 u% C0 k" R" u. G' c# z
重收敛的含义是,A时钟域的多根信号分别进行同步,同步到B时钟域,然后在B时钟域从新做逻辑汇聚成一根信号。这种同步的方式有一个很大的问题,你无法预期同步后的多根信号和之前还是一致的,例如,两根信号之前都是1,但是在同步后可能变成很多的情况。所以再重新汇聚肯定会出问题。例如下图中的状态机,在A时钟域可能是S1状态,但是同步后可能就变成了S2状态了。其实重收敛的问题可以避免,就是采用格雷码编码,避免一个时刻多个数据跳变。 ! _& q, b7 I: P# d+ f5 l/ V& e" M0 O
2 k- `' \! d" a6 s
5 ? i$ D) i/ U3 E; J6 N
如下图的格雷码编码再解码,就可以解决上述的一些问题。
- o$ Q% S2 ]! c
$ P/ J% c$ D# z) E: i
: @6 t3 N% P, D 分叉的含义与之相反,在A时钟域的单根信号被分别同步到B时钟域的多根信号,这同样会面临同步不一致的情况,有的被同步成1,有的被同步成0。
) P, p2 l1 {5 \3 o; Z* t' J+ I. j! h8 f
7 z; f) l- [% S' x4 n# S
4.3)避免将cmd和data分开进行同步,而要绑定到一块采用异步fifo实现 U9 m% L8 a8 S' `+ a, b
5 `! B7 V5 ]; x
& T) n4 m5 O. P1 H
Cmd和data经过异步fifo处理后的延迟可能会发生变化,所以应当避免将他们分开进行同步,而要绑定到一块进行同步{cmd,data}。
, N5 x1 H2 i1 b$ Y- ~1 s7 D3 j3 c. B; C# O- K: |
最后提一下异步复位同步释放电路,这种电路在soc中也广泛被使用。 ' k2 ]. g L' ~- \6 ?& S8 u; g
/ N" B2 r. p, j! V
: ]. ?4 @2 d: P5 A9 ]8 G8 H! \5 Q: f. _
|