|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本文翻译自Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs
) E) @4 x% ]% X# s/ b. L2 fDCM主要功能4 ?% A& L8 e: w' e" X
1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。
- h9 D- Y' M0 M! o! D2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。0 u' [9 K8 J$ N" p+ d2 K0 {, Z m- m, q
3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。; R1 E( D2 v" v: \% p q) f7 m
4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。
% S- }! k, m |5. 电平转换:通过DCM,可以输出不同电平标准的时钟。
. A' V3 c/ K* W5 d7 bDCM的特点与能力(Spartan-3系列为例)- 数量:4 DCM / FPGA(也有例外)$ |+ z2 {- W; L# h0 B3 P
-- 应该够用了 - 数字频率综合器输入(CLKIN):1-280MHz
- 延迟锁相环输入(CLKIN):18-280MHz
- 时钟输入源(CLKIN):
: Z3 k" l. M+ A/ X/ v2 H& y. ?# x Global buffer input pad/ L: [ d U8 M9 k
Global buffer output. k: {" ?3 l7 l9 O6 s! I; w
General-purpose I/O (no deskew)
9 U v. J/ d0 t" \) m* n$ u Internal logic (no deskew); z$ g- X( Y7 Q1 h9 l
-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。 - 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中3 K8 e; k- l( H/ l: L2 X
M=2..32
/ a7 \& c5 S; j1 Q8 I1 |6 o+ [& u ^ D=1..32, u, G" b, j1 e7 U H+ I& T
-- 这样看来最大能倍频32倍,最小能16分频。 - 时钟dividor输出(CLKDV):是CLKIN的下列分频# K, M$ s" j/ j1 V/ Q9 K( e$ ^
1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 9, 10, 11, 12, 13, 14, 15, or 16
) z" j" m8 w" A1 L-- 发现没有,最大的分频也是16。不过能支持半分频,比用频率综合器方便。 - 倍频输出(CLK2X、CLK2X180):CLKIN的2倍频
- 时钟conditioning、占空比调整:这个对所有时钟输出都施加,占空比为50%。
- 1/4周期相移输出(CLK0/90/180/270):是CLKIN的1/4周期相移输出。
- 半周期相移输出(CLK0/180、CLK2X/180、CLKFX/180):相差为180度的成对时钟输出。
- 相移精度:最高精度为时钟周期的1/256。
- 时钟输出:9个/ K8 o2 K6 `* X
到全局时钟网的时钟输出:最多9个中的4个) t5 i! h' v; _$ Q) K$ w' M# w
到General purpose互联:最多9个1 _* a0 Q4 E) }: ^+ v+ _/ I
到输出脚:最多9个5 v$ `. ]5 l+ o5 j3 q1 i7 V
-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。
0 [: V8 x7 F3 C7 p5 oDCM的位置在哪?
4 c$ u9 s3 x3 ]/ ?+ w我们以Spartan3系列为例。' Y5 ~* T8 P1 |
FPGA看上去就是一个四方形。最边缘是IO pad了。% o7 k, m" Q& {& _; O/ K
除去IO pad,内部还是一个四方形。
" E% g8 C' o( o& l8 Q8 B: o四个角上各趴着一个DCM。" Z8 W% Q* h; n$ \% }
上边缘和下边缘中间则各趴着一个全局Buffer的MUX。
h( L: f8 ~0 @这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。 Y3 q! p: E; {
下面是手绘简图,很丑是吧,呵呵。
6 O# A1 q! T1 U5 K' X' A, N4 N + q! G* N7 t6 Y H
; d: Y+ p8 ^- V# zDCM是全局时钟网络可选的一部分
, f. R& V: T4 T: B! R一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示
! R$ m% `: ?" `6 FGCLK --->( IBUFG ---> BUFG) ---> low skew global clock network
( t$ M0 k' c7 a& C2 n5 t6 B# N! i7 y在需要的时候,DCM也成为全局时钟网络的一环。
5 x6 U2 i; c1 S* Q ' l" Z- B, ]# Y& u
3 \' m: b2 h( m" [3 yDCM 内部构成一览
) [% }5 [/ u7 ?1. DLL 延迟锁定环5 v$ @+ B1 l& |! [
说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。/ r) l. q. d: N8 v9 D
实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。
: X6 _* P' X& T7 a3 H" F$ O 一句话,DLL的核心功能是无延迟。
: N1 _; K! S, v DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。 Y* l# ^$ [$ A) E
5 k- d) s. X' [& W x
2. DFS 数字频率综合
; C+ Q% Y" {/ d6 c# e1 u8 T DFS的主要功能是利用CLKIN合成新的频率。
" R/ T7 n5 t: P3 [. ^ 合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。! K( H; d" G: C
如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。
9 c9 X9 w. F8 V: M2 p! _5 ^* }7 ~8 G
3. PS 相位偏移5 H1 L7 L0 v4 q( ]7 h
注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。) P) k' }2 `0 U+ `7 y8 q
也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。8 z# w5 T' O( J' k( ^) X8 R
这个功能我们平时不常用。- B( b7 ^, c& c. l! Y8 T0 h5 [
" b5 R z$ R3 ^' h- G4. 状态逻辑
4 V5 p7 ?2 F/ v! \ 这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。 ; W" S* b* P3 ?9 f/ g( h
//////////////////////////////////////////////////////////////////////////////////////////////////////////////// V# C" y/ v9 b6 P& J) Q' B
% {" R6 u; r: y/ |6 X5 k/ VDCM_BASE
/ D" E8 v- a8 ~7 a6 j8 \' uDCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
- h- g: w6 R5 z. }+ @模块接口信号的说明如表3-8所列。
; n H2 O2 K; a B
3 r, K; Y3 }( e. w; |- |DCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为:
2 ?7 T3 P( h# ~) i1 u9 G; H
0 R* ~3 R5 u$ o- e8 C# z. s3 u// DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit) : L4 b: _; @( u' ?) R5 T" M& p* q& n
// 适用芯片:Virtex-4/5
' G2 {2 T0 |8 [" _# ?4 R// Xilinx HDL库向导版本,ISE 9.1 & i2 H( i- M0 Q- V8 j
DCM_BASE #(
6 j) ^) @& r, X4 b- S( S.CLKDV_DIVIDE(2.0),
. T3 n7 N' `+ G6 }% U// CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
2 _5 k9 Y: Z, @& ^ e* i4 n// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 * @7 D$ c2 `1 C: M
.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32
5 C4 g5 {, T8 w" N2 g// CLKFX信号的分频比,可为1到32之间的任意整数 + b2 w0 z+ x9 O& W5 K' A) O4 s
.CLKFX_MULTIPLY(4),
1 a0 O* M! g K" F# N2 Y// CLKFX信号的倍频比,可为2到32之间的任意整数
j* ]1 P, V# E! ?3 {3 q.CLKIN_DIVIDE_BY_2("FALSE"), 4 j9 _' c: z0 I% i
// 输入信号2分频的使能信号,可设置为TRUE/FALSE
" Z7 S6 \' b, X8 g2 m! J" ?.CLKIN_PERIOD(10.0),
6 t. i( N3 e7 q* h; ~0 z// 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。 # H8 R$ p# M8 ~; q- a$ `: a: {% y
.CLKOUT_PHASE_SHIFT("NONE"),
4 H3 Y/ n. o9 z/ K5 H4 n" t% S X// 指定移相模式,可设置为NONE或FIXED
/ r1 O6 s3 u3 B; O. z.CLK_FEEDBACK("1X"), 6 j! B: [9 N# n1 K; B
// 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。 ) o+ _ K6 i( p+ {
.DCM_PERFORMANCE_MODE("MAX_SPEED"),
* G1 T- y! R/ X+ u9 Z1 c// DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE
( @# s$ p+ ^% }# N/ k0 B.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), ' C" w" Q7 r, w( V8 Q
// 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数
: }1 S! q5 P* U.DFS_FREQUENCY_MODE("LOW"), 1 Z0 j2 Y/ t+ }; e: W# p d
// 数字频率合成模式,可设置为LOW或HIGH 两种频率模式 - a: G: {2 m. ?" f' o
.DLL_FREQUENCY_MODE("LOW"), k. x* u( q0 J4 h- F+ S
// DLL的频率模式,可设置为LOW、HIGH或HIGH_SER
9 q) r _; g% V' D* ^' u.DUTY_CYCLE_CORRECTION("TRUE"), , r, X" G' a. r; V" I" X; i! c
// 设置是否采用双周期校正,可设为TRUE或FALSE % l$ w( z7 i2 E! r
.FACTORY_JF(16'hf0f0),
6 ~9 E5 i# y. l+ N+ D- p& {% h8 c! I// 16比特的JF因子参数 8 D) N+ o4 U" [! Q( g6 n8 \
.PHASE_SHIFT(0),
" ?6 \4 v; o) n8 e- j! f// 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数
& |' l5 `/ Y- e.STARTUP_WAIT("FALSE")
. w6 Z% Q! a: h7 M// 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE % V$ ?0 V! B3 z/ Y- y% i9 W; Q* U
) DCM_BASE_inst (
* j' I9 O4 b/ |) R/ L+ W.CLK0(CLK0), // 0度移相的DCM时钟输出
8 U( v8 H6 n8 F' D% D: o.CLK180(CLK180), // 180度移相的DCM时钟输出
6 Z8 G$ Q6 B" j) Y% j.CLK270(CLK270), // 270度移相的DCM时钟输出 : x1 }2 H: {% A
.CLK2X(CLK2X), // DCM模块的2倍频输出
# l$ e! A5 k9 K! u# x( H5 }.CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出 " ~5 Z% k/ I, R" j6 o" z
.CLK90(CLK90), // 90度移相的DCM时钟输出
5 s( K0 [7 H8 @2 o8 `; L5 \; y.CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE
. `( e3 |- Z7 o2 h.CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D)
; j6 g( I/ \1 g1 V% W# }1 H+ f& a.CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出
3 c3 r$ | [- e8 Q9 `, f* f# p" W.LOCKED(LOCKED), // DCM锁相状态输出信号
6 u* \2 s. e- W5 q% _' U2 }.CLKFB(CLKFB), // DCM模块的反馈时钟信号 + z+ u' }* d, w( Y' O
.CLKIN(CLKIN), // DCM模块的时钟输入信号
9 s ]8 c0 P$ B3 _.RST(RST) // DCM 模块的异步复位信号 T6 D9 `2 z2 U9 e# u1 w
); 7 f& ^# f8 _ O2 ~7 I8 a
// 结束DCM_BASE模块的例化过程
9 P s" L, ^# D- Z在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。 - o# f, M2 B" [0 \' J4 d
i/ H6 b+ [5 v Z图3-36 DCM模块的RTL级结构示意图
& b9 l; [$ F8 s2 t6 b' s4 A/////////////////////////////////////////////////////////////////////////////////////////////////////////////
% E6 k- H- O6 R# k* |, }Spartan-3 DCM的兼容性
1 y6 s7 Q5 T. h9 X S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)
- O& v- T: t. v9 | 但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。
' k2 }1 M) W7 {% l3 m' y! T" o, K
DCM 输入时钟的限制
2 i w5 H3 a- {: v0 Z6 b 和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。8 }. p6 K! H4 c8 z% a
- p) \- A) ^$ h$ C8 x5 x. ? I0 b9 \ 呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。
7 D+ n; U/ y8 G* ]7 z; b" F$ V 除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:
_7 {0 f x; E- {7 j1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;
' |5 E' t5 |9 U) d4 J3 P5 _8 q" v2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;/ a a" R4 B6 s8 T. L7 A6 P& A( H
3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。- d/ L; v! Z0 d F3 y
具体数值请查手册,知道有这么回事就可以了。$ v& d, g/ K$ x! u% t
LOCKED信号的行为方式/ w# G3 |1 j, q, s( ^9 o' t$ R
LOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。" c0 j2 T- ]9 \/ e8 S( i) d6 r
FPGA配置:0 L* s- V% V# V8 A9 s5 ]
if (CLKIN已经稳定) next_state = 判断同步;
) Z* r/ \5 o4 w) P3 I e else next_state = RST_DCM;1 U9 X T( o: I" i! Q6 `' D0 N1 S( {
判断同步:
' K" s. ~$ c, m l if (已经同步) next_state = 判断同步;9 w8 s: |/ Y; A4 J& `, l6 {
else next_state = 同步失败;
( Q0 T' m: ~& f6 E. {) r同步失败: next_state = RST_DCM;) S4 F( R3 Z* V; b" s# a+ Y
RST_DCM: next_state = FPGA配置;
5 a5 B: H5 ?6 H7 o- V3 m/ j. g" z. `; i; M7 \
现在来看看各个状态下的输出。- W& P' g% y- n+ _
9 ]$ Y! w% F5 w- B% |& ncase (state)+ b/ a9 u5 {2 o o) a- l7 ^$ b
FPGA配置: LOCKED = 0;2 o5 v3 d4 v- A* n# g
判断同步: LOCKED = 1;- N' a; _ ~- Q; a
同步失败: LOCKED = 0;0 G( w: R# i# I$ k- V. y( n
RST_DCM:LOCKED = 0;
9 U1 s& q5 F" _# p. ]endcase# g) X6 J5 G" Y5 k) V4 l( M
RST 信号——重启锁定
% H$ V4 E. y8 f6 i2 W, I1 [! e RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。
5 K6 k0 z! O9 D, H( P7 A; F 作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。
& e8 F+ C. _' q+ w! U7 V U: h 置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。2 |; x' w6 J* h! V0 r
DCM 生成向导
7 g, Z" X+ K! B' J安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:
" P7 d, |- \+ v* E1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog)7 b9 N/ `: U, [. S' C
2. 一个UCF文件控制特定实现4 r! U5 J! @' C* M; @; n; @6 a) a
3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。
$ v% E) s6 B; v7 E4 F' {7 t! ?! m) g9 _# z" W: z; f
接下来描述一下向导使用步骤。
- i8 P- o8 K* _2 C1. 从ISE或者Arch wizard中启动界面;
8 l) U5 t8 N8 O2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;
7 I9 o9 a D" `1 p3. 进行General setup,一看就明白,不细说,注意一下几点:, m M6 d6 L( T# p8 E" D$ J3 e
- CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。4 y& R( }$ N0 r% e& \: e# B
- Feedback如果选 internal 则反馈来自 BUFG。
7 p# w0 P. W- v7 o; ` d4. 高级设置5 T% i8 j8 U5 x X' T1 a; [. m2 d
- 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。
" f- f/ z j" ]0 F1 K - 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。7 c: Y d1 c% G% W
- Deskew调整,这个选项建议在咨询xilinx工程师后再使用。
/ d- b7 G- E' J Y7 ^: f0 y4 v( z5. 时钟输出口 Buffer 设置
9 L0 Z9 {+ S* k% w6 |; h0 w8 k - 默认情况下所有输出口都链接 BUFG 全局时钟网络入口' L' x5 N# \, q$ D0 I8 h
- 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer! X* Q6 H# j. ?+ T& G
- Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG
! W6 K$ \3 x& w: N - Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE
' b7 z4 X3 T1 ?1 y% P - Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX
4 A/ k' {8 A' {& E; V O( F - Low skew line:没有buffer了,只能使用 skew 比较小的连线/ t4 b" _: l! k9 e9 }
- Local Routing:连到本地,skew的要求不是很严格
* ^6 B) A. ^/ Q; u( `, w - None:禁止输出. c4 F6 y( i: j
- 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字
8 F" G0 r6 c) v/ E, Q - 需要为输出时钟信号指定名字或者使用默认" ~. [- u# J# ?9 L* X: q w# V, q
6. 设置DFS$ d' Q0 N, m; ?5 W# g
- 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值/ W* B4 R7 s3 q4 U
- 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值' E4 m. J( m+ Y7 F3 E5 }
7. 最后输出所需的3种文件。 |
|