FPGA时钟问题集合 $ S( V: E" V. U8 n2 v; ~' W% f
& ^; T- B1 h3 x. k3 k3 E' o
) H( D! ^0 s* ~2 a( _/ t+ ~/ `
无沦是用离散逻辑、可编程逻辑,还是用全定制硅器件实现的任何数字设计,为了成功地操作,可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下将导致错误的行为,并且调试困难、花销很大。在设计PLD/FPGA时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。* z' r ?' O1 W, G! m% L @% m6 c0 q
) ~+ L. K" Z3 O9 K f5 i. i; g! c$ [& _) e* z1 X3 @/ r
1.全局时钟: l2 s. Z$ [9 p5 }# a/ l
* H* u8 _1 }0 n0 e* P4 N
对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。
6 P. T9 [( h: X" b6 ^9 K- ^
% Y2 C3 Y/ P! [5 w2 h" E% x$ X: m
图1 示出全局时钟的实例。图1 定时波形示出触发器的数据输入D[1..3]应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号(参看下一章“异步输入”)。
( H1 {; U: j$ x/ n6 F- ]5 Lhttp://image16.360doc.com/DownloadImg/2010/10/2417/6240652_1.jpg http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_2.jpg * I5 W t- m" ^( J) D+ ~3 z1 H
图1 全局时钟
) }2 m( a% ?" y4 j1 A(最好的方法是用全局时钟引脚去钟控PLD内的每一个寄存器,于是数据只要遵守相对时钟的建立时间tsu和保持时间th)$ r/ v5 s! n+ Z5 y3 e2 T
# _- t" U3 N6 {: |2.门控时钟
1 h$ U) Z1 _9 M! Z b8 z* p8 l4 {
在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的。PLD具有乘积项逻辑阵列时钟(即时钟是由逻辑产生的),允许任意函数单独地钟控各个触发器。然而,当你用阵列时钟时,应仔细地分析时钟函数,以避免毛刺。
4 L9 g& V7 ?# f通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关,用地址线去控制写脉冲。然而,每当用组合函数钟控触发器时,通常都存在着门控时钟。如果符合下述条件,门控时钟可以象全局时钟一样可靠地工作:6 X/ L o) u* w, e$ s
2 z) z+ p6 U" ~8 a" B a1.驱动时钟的逻辑必须只包含一个“与”门或一个“或”门。如果采用任何附加逻在某些工作状态下,会出现竞争产生的毛刺。! ]" ], }8 e' o7 J+ Z' u* ~. \2 _
2.逻辑门的一个输入作为实际的时钟,而该逻辑门的所有其它输入必须当成地址或控制线,它们遵守相对于时钟的建立和保持时间的约束。
" p2 t8 I; }0 v. L2 s# I5 m2 k7 D8 R0 F9 ?5 f% s& ^% E
/ K5 j! X0 h4 K, {) D9 ~
图 2和图3 是可靠的门控时钟的实例。在 图2 中,用一个“与”门产生门控时钟,在 图3 中,用一个“或”门产生门控时钟。在这两个实例中,引脚nWR和nWE考虑为时钟引脚,引脚ADD[o..3]是地址引脚,两个触发器的数据是信号 D[1..n]经随机逻辑产生的。8 H+ Q U+ P6 u
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_3.jpg http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_4.jpg 图2 “与”门门控时钟
. M+ [/ y2 R1 k7 }, [! [4 ` http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_5.jpg
6 k* o7 ]$ ?0 b http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_6.jpg 图3 “或”门门控时钟
! E* u* p" B1 {' u
* H8 C0 D; Q' C5 c图2和图3 的波形图显示出有关的建立时间和保持时间的要求。这两个设计项目的地址线必须在时钟保持有效的整个期间内保持稳定(nWR和nWE是低电平有效)。如果地址线在规定的时间内未保持稳定,则在时钟上会出现毛刺,造成触发器发生错误的状态变化。另一方面,数据引脚D[1..n]只要求在nWR和nWE的有效边沿处满足标准的建立和保持时间的规定。
' ~( Y6 c8 H$ x- m& N: ^$ D: |4 q
# I" H) }6 B1 \- F; c我们往往可以将门控时钟转换成全局时钟以改善设计项目的可靠性。图4 示出如何用全局时钟重新设计 图2 的电路。地址线在控制D触发器的使能输入,许多PLD设计软件,如MAX+PLUSII软件都提供这种带使能端的D触发器。当ENA为高电平时,D输入端的值被钟控到触发器中:当ENA为低电平时,维持现在的状态。http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_7.jpg
" w* b6 X0 s6 A3 x- Phttp://image16.360doc.com/DownloadImg/2010/10/2417/6240652_8.jpg
图4 “与”门门控时钟转化成全局时钟. F5 _. \& ]" G
8 |2 y7 w: U& ?
4 D: q8 m2 U! J2 K( D; h) [
6 k; l; E+ \- b0 C3 ?& w% Q& i1 ^; H! s
图4 中重新设计的电路的定时波形表明地址线不需要在nWR有效的整个期间内保持稳定;而只要求它们和数据引脚一样符合同样的建立和保持时间,这样对地址线的要求就少很多。; `6 K2 F1 ?8 O! }' H% S
% l) X( h& Y9 D. D图给出一个不可靠的门控时钟的例子。3位同步加法计数器的RCO输出用来钟控触发器。然而,计数器给出的多个输入起到时钟的作用,这违反了可靠门控时钟所需的条件之一。在产生RCO信号的触发器中,没有一个能考虑为实际的时钟线,这是因为所有触发器在几乎相同的时刻发生翻转。而我们并不能保证在 PLD/FPGA内部QA,QB,QC到D触发器的布线长短一致,因此,如 图5 的时间波形所示,在器从3计到4时,RCO线上会出现毛刺(假设QC到D触发器的路径较短,即QC的输出先翻转)。( c( @5 Z2 d; g8 V/ H$ Z
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_9.jpg http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_10.jpg
8 T9 I- h; o0 C% v& P8 W( N" I7 f 0 g. l! U( p7 b1 B3 Y1 v
图5 不可靠的门控时钟
3 `: M- F7 ?& d+ i' |* ^/ t: y& S3 j$ q& F
(定时波形示出在计数器从3到4改变时,RCO信号如何出现毛刺的) 6 E: L( k' B2 E& ^
* p6 u+ m( Q6 S/ t. `) G( V' L: c" D
图6 给出一种可靠的全局钟控的电路,它是图5不可靠计数器电路的改进,RCO控制D触发器的使能输入。这个改进不需要增加PLD的逻辑单元。 http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_11.jpg
! Y% S4 g9 ~/ x* Q- W5 {
6 P! U8 Q! ]0 ~& W图6 不可靠的门控时钟转换为全局时钟
2 E1 S1 ~+ N, Q. o" {
/ C$ x$ M/ t! h- A& S4 \7 B(这个电路等效于图5电路,但却可靠的多)
$ r. W+ n5 Y; e( ~0 e0 U: A1 l) t' K
8 i' U1 ]; B: q$ j5 F0 M+ x3.多级逻辑时钟
7 J; X. @- I8 z( @& D! w* D: W
" j) Y6 i0 ?- O3 [& [; B" Y当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时,证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在着危险。通常,我们不应该用多级组合逻辑去钟控PLD设计中的触发器。
9 R( H5 z4 T/ x% m1 x$ r, Z9 p! |2 D D; O8 Y+ f! W! f/ W" x0 D
图 7 给出一个含有险象的多级时钟的例子。时钟是由SEL引脚控制的多路选择器输出的。多路选择器的输入是时钟(CLK)和该时钟的2分频(DIV2)。由图7 的定时波形图看出,在两个时钟均为逻辑1的情况下,当SEL线的状态改变时,存在静态险象。险象的程度取决于工作的条件。多级逻辑的险象是可以去除的。例如,你可以插入“冗余逻辑”到设计项目中。然而,PLD/FPGA编译器在逻辑综合时会去掉这些冗余逻辑,使得验证险象是否真正被去除变得困难了。为此,必须应寻求其它方法来实现电路的功能。& ` t2 A& o9 b- X: O( B
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_12.jpg
) V& O( |) G" H% d- j图7 有静态险象的多级时钟 ' [% `3 n* |: b! X7 \/ |
p& K' X# L; @1 P e6 C: T图8 给出 图7 电路的一种单级时钟的替代方案。图中SEL引脚和DIV2信号用于使能D触发器的使能输入端,而不是用于该触发器的时钟引脚。采用这个电路并不需要附加 PLD的逻辑单元,工作却可靠多了。 不同的系统需要采用不同的方法去除多级时钟,并没有固定的模式。. A3 m* ^8 a! l( X# c& |
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_13.jpg 图7 无静态险象的多级时钟 (这个电路逻辑上等效于图7,但却可靠的多) $ G. R# `1 l% ^
4 t3 l9 C& Z& Q: @" {% E7 `7 i6 T
4.行波时钟
4 U8 D% M7 r, ` b
9 c( ]9 }/ p S" O, Y, n8 C3 w6 Q另一种流行的时钟电路是采用行波时钟,即一个触发器的输出用作另一个触发器的时钟输入。如果仔细地设计,行波时钟可以象全局时钟一样地可靠工作。然而,行波时钟使得与电路有关的定时计算变得很复杂。行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移,并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时,使系统的实际速度下降。
2 Q3 N) I' D& _- H4 s用计数翻转型触发器构成异步计数器时常采用行波时钟,一个触发器的输出钟控下一个触发器的输入,参看图9 同步计数器通常是代替异步计数器的更好方案,这是因为两者需要同样多的宏单元而同步计数器有较快的时钟到输出的时间。图10 给出具有全局时钟的同步计数器,它和 图9 功能相同,用了同样多的逻辑单元实现,却有较快的时钟到输出的时间。几乎所有PLD开发软件都提供多种多样的同步计数器。
# K' n! W6 N: {2 l8 B http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_14.jpg 图9 行波时钟
R$ e1 b* ?" r0 J$ G& o7 n# d http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_15.jpg 图10 行波时钟转换成全局时钟
- B$ s2 N/ O4 l6 A+ |& f) Q(这个3位计数器是图9异步计数器的替代电路,它用了同样的3个宏单元,但有更短的时钟到输出的延时)
; c9 f+ f- j; }+ m5. 多时钟系统
. z7 K3 g w( s x% e* x# k# j; n5 p2 c1 R
( M: X: y, A9 @ ^+ M$ k, } X+ q7 L! n: I0 _" n3 x3 `9 p( `
$ q1 D$ y5 I. M3 [# O9 |
: ~# t" l/ Q% O, i: i* T4 G( I( k# ]. Q0 \ d' p m
8 n k$ O+ m2 n6 }0 ^# v; @6 N3 Y) z: E4 W' q; o) h) L
许多系统要求在同一个PLD内采用多时钟。最常见的例子是两个异步微处理器器之间的接口,或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间,所以,上述应用引进了附加的定时约束条件。它们也会要求将某些异步信号同步化。
9 m& _3 K, p1 F2 G+ \
" x1 b# B$ B/ u, H3 e图11 给出一个多时钟系统的实例。CLK_A用以钟控REG_A,CLK_B用于钟控REG_B,由于REG_A驱动着进入REG_B的组合逻辑,故CLK_A 的上升沿相对于CLK_B的上升沿有建立时间和保持时间的要求。由于REG_B不驱动馈到REG_A的逻辑,CLK_B的上升沿相对于CLK_A没有建立时间的要求。此外,由于时钟的下降沿不影响触发器的状态,所以CLK_A和CLK_B的下降沿之间没有时间上的要求。,如图4,2.II所示,电路中有两个独立的时钟,可是,在它们之间的建立时间和保持时间的要求是不能保证的。在这种情况下,必须将电路同步化。图12 给出REG_A的值(如何在使用前)同CLK_B同步化。新的触发器REG_C由GLK_B触控,保证REG_G的输出符合REG_B的建立时间。然而,这个方法使输出延时了一个时钟周期。
) ~$ J o' M9 N8 S* [, \$ |4 w9 Y+ Z9 _9 D. l& h
. P; R4 Y' I$ N2 \; F3 t
, d3 ]/ _' L- ]& a
. T/ |$ U3 N# U% Z4 W# a9 D' v1 {2 C6 N& T
- Y. g% u! W7 e7 w5 ?* i, _8 K2 Jhttp://image16.360doc.com/DownloadImg/2010/10/2417/6240652_16.jpg 图ll 多时钟系统
0 I. D7 a- p& P& h n) F( k7 {+ z(定时波形示出CLK_A的上升沿相对于CLK_B的上升沿有建立时间和保持时间的约束条件) ( O. P% I1 o4 n/ W% X' G& }" _% Z
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_17.jpg 图12 具有同步寄存器输出的多时钟系统
& ?' E8 P1 k1 G7 ]( Z$ e(如果CLK_A和CLK_B是相互独立的,则REG—A的输出必须在它馈送到1REG_B之前,用REG_C同步化) 0 h& r: f+ H: P' A$ x+ T
: J' M& R- v- H+ G: F/ M
在许多应用中只将异步信号同步化还是不够的,当系统中有两个或两个以上非同源时钟的时候,数据的建立和保持时间很难得到保证,我们将面临复杂的时间问题。最好的方法是将所有非同源时钟同步化。使用PLD内部的锁项环(PLL或DLL)是一个效果很好的方法,但不是所有PLD都带有PLL、DLL,而且带有 PLL功能的芯片大多价格昂贵,所以除非有特殊要求,一般场合可以不使用带PLL的PLD。 这时我们需要使用带使能端的D触发器,并引入一个高频时钟。 http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_18.jpg 图13 不同源时钟 & M K2 ?# n& `, h' _" ~
如图13所示,系统有两个不同源时钟,一个为3MHz,一个为 5MHz,不同的触发器使用不同的时钟。为了系统稳定,我们引入一个20MHz时钟,将3M和5M时钟同步化,如图15所示。 20M的高频时钟将作为系统时钟,输入到所有触发器的的时钟端。3M_EN 和5M_EN将控制所有触发器的使能端。即原来接3M时钟的触发器,接20M时钟,同时3M_EN 将控制该触发器使能,原接5M时钟的触发器,也接20M时钟,同时5M_EN 将控制该触发器使能。 这样我们就可以将任何非同源时钟同步化。9 w$ s& s( a# {: w/ A
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_19.jpg 图13 同步化任意非同源时钟 (一个DFF和后面非门,与门构成时钟上升沿检测电路) - j' ?* v3 i" E: f. N$ l4 J. s$ x
另外,异步信号输入总是无法满足数据的建立保持时间,容易使系统进入亚稳态,所以也建议设计者把所有异步输入都先经过双触发器进行同步化,详情可参阅这篇文章:Are Your PLD Metastable?。
+ ?" A# J3 l3 F. |4 h+ k+ O1 P4 A9 _/ m
$ G( j( f; q' F3 R0 w3 \小结:稳定可靠的时钟是系统稳定可靠的重要条件,我们不能够将任何可能含有毛刺的输出作为时钟信号,并且尽可能只使用一个全局时钟,对多时钟系统要注意同步异步信号和非同源时钟。 |