EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Taio 于 2018-10-10 10:35 编辑
5 r& k# O u6 X6 O" q* t
/ x4 i1 |& j! y% o% e跨时钟域处理注意事项
. L2 }, \/ [: @: P 4、处理跨时钟域时要注意哪些问题 " P8 W8 y1 s7 R5 n3 d4 |
- Y1 a& c9 j* w( I& A
4.1)同步器前不能有组合逻辑电路
# x* K5 \. S' R# o
, ?2 Y! @" ~+ [9 h% R M
5 n; a. Y+ \2 a6 H, R7 t. N 如上图,在前一个时钟域的dff输出和后一个时钟域输入之间不能有组合逻辑,原因是组合逻辑会造成毛刺现象,后一级时钟域的dff很可能敲到毛刺,进而引入错误。 0 q9 T6 L1 p+ v- J8 _
! U: U: S/ a! J+ K( a# J% H! V 4.2)避免重收敛(reconvergence)和分叉(divergence) / V, S& l7 F$ X$ E
5 W8 j1 i: E; S
- L2 R1 e0 e. c1 ~9 { _ 重收敛的含义是,A时钟域的多根信号分别进行同步,同步到B时钟域,然后在B时钟域从新做逻辑汇聚成一根信号。这种同步的方式有一个很大的问题,你无法预期同步后的多根信号和之前还是一致的,例如,两根信号之前都是1,但是在同步后可能变成很多的情况。所以再重新汇聚肯定会出问题。例如下图中的状态机,在A时钟域可能是S1状态,但是同步后可能就变成了S2状态了。其实重收敛的问题可以避免,就是采用格雷码编码,避免一个时刻多个数据跳变。
: U5 J' d7 c& F/ q$ m
0 s2 T5 |5 d d6 P
+ ?7 M4 y) j' @, b% j
如下图的格雷码编码再解码,就可以解决上述的一些问题。
- d# z. S3 n# |8 i) S. S$ B v/ r' u& Q8 [
7 n) ?5 [! f) I* g 分叉的含义与之相反,在A时钟域的单根信号被分别同步到B时钟域的多根信号,这同样会面临同步不一致的情况,有的被同步成1,有的被同步成0。 3 K" Y n" n8 t( s( w
5 W* {+ d' R- F( i! {5 r
$ D1 {3 u+ K8 T# J 4.3)避免将cmd和data分开进行同步,而要绑定到一块采用异步fifo实现 ) r+ z& v& ^+ k' _; G
* n: R2 W' V6 V2 H
$ F7 s4 Q2 t d! V) i, B& ?/ ~& z
Cmd和data经过异步fifo处理后的延迟可能会发生变化,所以应当避免将他们分开进行同步,而要绑定到一块进行同步{cmd,data}。 0 \- s. k- U% b: \7 _( h7 b
) A0 _1 Q% ]1 C" r8 c 最后提一下异步复位同步释放电路,这种电路在soc中也广泛被使用。 ; _4 e$ Y* L5 R( y
; t! t3 a; K- l7 ]
7 ?( u" X* |6 G
# f( D' ]% F2 M8 O
|