TA的每日心情 | 开心 2024-12-19 15:41 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本文翻译自Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs
. Z7 \) J c1 R: QDCM主要功能
4 v2 S* X* G% l+ f7 o1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。' f& C; s% F+ ]4 h; z
2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。
: n0 Y2 p2 C/ w L% ?9 r% k, s3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。
% o4 H8 V3 x7 z' m1 Q) i4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。
, u0 d* c, O7 ]- s' [3 D5 n: P1 o+ Q5. 电平转换:通过DCM,可以输出不同电平标准的时钟。
2 W& W" |0 q; Z& eDCM的特点与能力(Spartan-3系列为例)- 数量:4 DCM / FPGA(也有例外)/ k, G1 N+ q( \
-- 应该够用了 - 数字频率综合器输入(CLKIN):1-280MHz
- 延迟锁相环输入(CLKIN):18-280MHz
- 时钟输入源(CLKIN):+ F5 G/ C1 e" F2 C( f7 s
Global buffer input pad
; g% F7 A, c ^ Global buffer output7 E: x/ a) }4 n. A- Y! p. n
General-purpose I/O (no deskew)
3 H2 @& y; e; w6 w0 h Internal logic (no deskew)* _* Q: w7 Z; C* t* |
-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。 - 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中) i+ V8 f! ^ l0 `4 M: N2 T- m( }
M=2..32! |' S# I6 t" K. T
D=1..327 N) o, _/ V. C2 M" I8 y) R D
-- 这样看来最大能倍频32倍,最小能16分频。 - 时钟dividor输出(CLKDV):是CLKIN的下列分频
9 V0 e8 z+ e7 Q- \4 U& o% c( t/ D. B 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
( F4 e. i2 H& S1 G2 K/ W-- 发现没有,最大的分频也是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个
! Q. L" u; Z; d o 到全局时钟网的时钟输出:最多9个中的4个
$ r, g, j2 Y& K7 p# g 到General purpose互联:最多9个
; i4 f7 V2 Z% M4 Z8 M c5 [. t 到输出脚:最多9个
C5 o7 [$ E1 q# j$ U- }! W3 ]-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。
7 ]1 ?( V/ p. }+ U/ @/ p* {5 _DCM的位置在哪?+ T V* R3 b/ v# a' m5 Q
我们以Spartan3系列为例。0 v: V. u/ m4 C
FPGA看上去就是一个四方形。最边缘是IO pad了。0 G; T+ I h( I: e& o, [+ `# o' ~
除去IO pad,内部还是一个四方形。1 U$ g; R6 _5 X' _% W4 x4 Y' p
四个角上各趴着一个DCM。) b# p" W' I2 ^3 h
上边缘和下边缘中间则各趴着一个全局Buffer的MUX。
! P- j. c& f; o [1 Y+ ?这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。
4 n: p* `- G, @' [$ F, ^5 r下面是手绘简图,很丑是吧,呵呵。' J3 C3 L" ^" I" s/ i
# D: C" \1 S5 I g* e! }; D
3 k L9 @0 e" }0 e( {; S* B
DCM是全局时钟网络可选的一部分" B5 i4 L* t9 {" m6 l8 ]/ I
一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示) F& S8 j' P0 j5 D! k- X+ _4 U
GCLK --->( IBUFG ---> BUFG) ---> low skew global clock network
% L* t. s% b! D3 D9 Z在需要的时候,DCM也成为全局时钟网络的一环。+ E3 ]7 \; k, V1 n1 g& S
% f& m8 ~4 o8 R n7 I8 `' v0 I$ R6 X# n
; ~- n# m- a& |0 k/ V6 E- y1 G8 J* lDCM 内部构成一览" A4 c7 {' b8 L6 J" j/ z0 ?3 }
1. DLL 延迟锁定环
3 G. X2 h% W) y' q8 y8 H 说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。: S% P+ s4 L# [+ I; T
实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。# f: @( b* a {+ R4 ?- Q6 B
一句话,DLL的核心功能是无延迟。- z X, {! u4 l9 Z+ m
DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。% k- g* J+ n: D1 O
& l9 m% i2 F. I2. DFS 数字频率综合/ t" _0 O6 e9 w
DFS的主要功能是利用CLKIN合成新的频率。' |% w* a* ?6 Z0 N# @
合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。
* k4 M) |$ l9 I) b4 P1 @) T 如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。
# _) m$ T" b! U# G6 j( k9 `6 d) [% T; ]7 [: H
3. PS 相位偏移7 V2 V& g7 ~2 _. _% V8 g
注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。9 L y; D$ f: }: v
也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。! W& W0 p: T) r; r- j& z" K6 I
这个功能我们平时不常用。
7 Y# @ `2 f2 y
% O& n2 X0 K/ |/ W( A( D4. 状态逻辑" m& L, y4 d4 N8 g7 {1 P
这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。
) m: t4 |0 X# B- g///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/ m- N/ D7 n& }) {! c1 B
5 M# U/ |/ L8 Q8 g. J7 Y; iDCM_BASE
* C5 z( h- Q* YDCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
% U! i7 z3 a- m5 ^8 D模块接口信号的说明如表3-8所列。
1 \. B9 @8 W0 X/ o * {/ A' t1 e* X, V
DCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为:
9 G! s- x" F) f7 [
6 n* k5 s) g3 H6 J3 y% k. D9 T8 V// DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit) p$ w% Z& t6 {6 }
// 适用芯片:Virtex-4/5 ) \- a5 V# t, n/ R- q, P) s
// Xilinx HDL库向导版本,ISE 9.1
2 Q7 z0 o; R4 x8 v6 g+ B6 L% Z$ [6 ?DCM_BASE #( + A* Z2 T6 N! _. w3 W* t! u8 S
.CLKDV_DIVIDE(2.0),
3 [. a6 Z6 S2 F: `! v// CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 ( W8 q! ~1 \4 w; E0 c9 i
// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
- L7 p2 u/ Y t) K% a, v- s.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32
8 t1 Z# }% u" \// CLKFX信号的分频比,可为1到32之间的任意整数 # a$ F# v9 q- ?& c1 [& d2 k
.CLKFX_MULTIPLY(4), , ]" c3 D7 ^- y) E/ z4 i: Q
// CLKFX信号的倍频比,可为2到32之间的任意整数 # _5 U3 ^$ z, y0 ]
.CLKIN_DIVIDE_BY_2("FALSE"),
8 |1 a( c2 H1 O// 输入信号2分频的使能信号,可设置为TRUE/FALSE
B1 x9 Z. f) L8 O* Z.CLKIN_PERIOD(10.0), & ]! W" M' }4 D! q& ~
// 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。
) T" V, u& Y8 l0 I- t; k/ H$ Z3 l.CLKOUT_PHASE_SHIFT("NONE"),
% X" u3 q" G/ \$ }" b) C; h// 指定移相模式,可设置为NONE或FIXED . D8 k$ E: h" Z
.CLK_FEEDBACK("1X"), # M# _% p, G" l3 d3 \
// 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。 4 }; z* F) z/ ?. D* k
.DCM_PERFORMANCE_MODE("MAX_SPEED"),
+ q& h1 l5 r7 M% o! s/ T* i& G// DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE 3 G; h, s/ J5 y7 z: `. u7 t
.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),
( O8 o0 a2 s, ^( \// 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数
; {% a7 t- B7 N4 u, B6 ?.DFS_FREQUENCY_MODE("LOW"),
6 e+ N5 \1 d# m0 q! D- A// 数字频率合成模式,可设置为LOW或HIGH 两种频率模式 8 Q5 {6 J n! D+ C& D
.DLL_FREQUENCY_MODE("LOW"), ( O' O: I" |7 M$ B0 k
// DLL的频率模式,可设置为LOW、HIGH或HIGH_SER ( Y, @' [1 S P0 f& N. o. j6 b8 I- K7 c
.DUTY_CYCLE_CORRECTION("TRUE"),
' B0 T0 k+ O' x! }. _// 设置是否采用双周期校正,可设为TRUE或FALSE
: l+ X2 F9 G! U- t.FACTORY_JF(16'hf0f0), ' ]: V& a) J x0 G) r5 b- X
// 16比特的JF因子参数 & Z/ k& d+ e# J- _. Z* ]5 {6 L' x
.PHASE_SHIFT(0), ) ?# N8 [/ N5 v$ D: ]
// 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数
) h" M& `& r1 \: S4 i4 C.STARTUP_WAIT("FALSE") . S4 f6 F ^4 z% Z9 |0 P
// 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE
' i9 H4 S/ l3 Q4 K2 N. }4 A' ]) DCM_BASE_inst (
( I4 c9 K* N! r6 T.CLK0(CLK0), // 0度移相的DCM时钟输出 - X9 c. W& q7 R" H
.CLK180(CLK180), // 180度移相的DCM时钟输出
8 L5 O: I7 Q7 J$ Y. j0 x. [* W.CLK270(CLK270), // 270度移相的DCM时钟输出
1 R7 g$ J3 u& }/ ~( _7 N, j8 _; n.CLK2X(CLK2X), // DCM模块的2倍频输出
* U+ q# G0 v9 A$ q1 q.CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出
, i. Y- j5 ]( ~9 n7 i$ S7 Y" G# Q.CLK90(CLK90), // 90度移相的DCM时钟输出 2 p. W7 E8 }! w* Z# s& r+ |
.CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE
1 l8 z" P6 V. G.CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D) ( ^# |% k* w8 n* O+ m: e
.CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出 & Q( ^5 ^9 n" K. {1 {
.LOCKED(LOCKED), // DCM锁相状态输出信号 % h, g5 o) Z2 ]) W3 x0 w$ E% R
.CLKFB(CLKFB), // DCM模块的反馈时钟信号
6 j% _& e; c& c o+ {.CLKIN(CLKIN), // DCM模块的时钟输入信号
* I" D/ z6 `) m+ W.RST(RST) // DCM 模块的异步复位信号 ) y6 t, _- J3 [( n7 I
); ! F9 N3 o0 ^2 a7 }
// 结束DCM_BASE模块的例化过程
! j+ \, o. d2 i. d/ l8 R0 C在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。 6 g2 b* t' D( W, O6 j
7 u; T3 ~- e. D$ k. E0 X1 u" R图3-36 DCM模块的RTL级结构示意图
, [5 U3 q Z8 c/////////////////////////////////////////////////////////////////////////////////////////////////////////////
Z. M3 r! O- S& K- `Spartan-3 DCM的兼容性
w: E$ y; N0 R) E S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)
, d3 I# f+ S2 [ | 但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。 5 E( [9 L6 U' N q; t* O* S" `' c2 t
0 E. _. k) {1 F `2 [' N. Q/ ADCM 输入时钟的限制
0 M" ^$ X5 m6 ]) R- h 和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。1 N8 H0 N: d p9 ` u6 A
0 d* h8 Q- q. A- ?% O 呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。7 A% I" P j- z8 V6 o
除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:) \, k! l5 w7 u9 G$ W
1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;& @2 W- E' s- T
2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;
. O! k, ^' t9 W9 y+ O3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。
1 _4 e) p7 ^$ y具体数值请查手册,知道有这么回事就可以了。8 C5 O" _% z" d- S7 p+ m
LOCKED信号的行为方式
2 F9 _0 b+ y9 d" j" k. M7 TLOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。7 i- h+ G$ D8 y$ d2 N4 B
FPGA配置:
* l2 k/ L2 p9 x5 d- t X if (CLKIN已经稳定) next_state = 判断同步;) Z" }( C k; m% g9 s
else next_state = RST_DCM;
# c# Y: W% ~- F! l: f7 G判断同步:
7 C$ U2 _% ^9 G+ a if (已经同步) next_state = 判断同步;7 `$ {: j/ g+ X* P u
else next_state = 同步失败;. f% v. v3 i0 ` ^% j* L
同步失败: next_state = RST_DCM;, b1 _' v7 x( D% y5 h
RST_DCM: next_state = FPGA配置;# |; Q8 n5 P8 ^4 a: \
. U8 N4 P2 R- Y6 F' j; J+ g$ U
现在来看看各个状态下的输出。
/ S, S% s" T! {/ M0 B
: v* s6 N5 T, O9 G0 f2 X* q( z, `case (state)) o' n+ l' l( s5 R& C
FPGA配置: LOCKED = 0;. o8 s y: C b2 }& P
判断同步: LOCKED = 1;
7 b. v7 l1 }, H& y* L- Y 同步失败: LOCKED = 0;# S- i! H) C, W7 `$ T
RST_DCM:LOCKED = 0;: _& P3 @4 s: D d" ]
endcase
! u% t- f( E* N* Z+ Z" PRST 信号——重启锁定
! x& q5 j7 ^3 }! ~' y2 z0 I RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。. _. U S) W K1 t$ j* B
作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。0 K5 K5 ^" Z! j
置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。
, q8 u8 @$ k* k8 K* NDCM 生成向导
i _% C1 {1 m1 Y安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:
0 n) L% M: v2 T3 U- E1 [' l1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog)
1 s8 o5 i& f7 K6 E( O2. 一个UCF文件控制特定实现
. U/ _/ g; H5 s' Z% `! q1 _3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。
6 h: ]( C+ u% `; {! t% _7 _: Q2 j5 P, t4 J
接下来描述一下向导使用步骤。
4 t6 C' N3 S3 D1 E1. 从ISE或者Arch wizard中启动界面;
. _; f* G T/ c/ N% U( i; V2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;# [, P9 ?8 A& y* s- X
3. 进行General setup,一看就明白,不细说,注意一下几点:
! J/ }4 Q/ W1 c1 S: ^- m - CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。! Z( h7 L1 g0 S* Z
- Feedback如果选 internal 则反馈来自 BUFG。7 ~9 T, B' l8 c. a3 p% \% c
4. 高级设置
5 T2 O& [( i( O9 b4 n" e$ T) N - 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。6 `4 b! Y+ g T, K9 O6 y7 r
- 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。
/ c6 e; a/ z9 `# }9 d, p; [- A - Deskew调整,这个选项建议在咨询xilinx工程师后再使用。4 D8 ]5 Z: g7 W$ l& M! R% H
5. 时钟输出口 Buffer 设置' ^' g& g" y( c! q( x. n
- 默认情况下所有输出口都链接 BUFG 全局时钟网络入口
$ v6 r& g& I; d( {7 z4 J) L - 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer! c1 r3 v' ?# O# {4 I) Y) k
- Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG( j" j5 [7 K% J% f$ L
- Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE5 ~$ t) c" U O2 a
- Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX8 U6 i* g. }- _. [8 x7 r
- Low skew line:没有buffer了,只能使用 skew 比较小的连线( {) `! p5 U5 t# [2 l
- Local Routing:连到本地,skew的要求不是很严格
5 K4 P7 l8 K/ K p4 I - None:禁止输出
9 E0 W0 l* w$ p1 E6 A& h - 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字# f- W( b; [/ S/ b" W+ h
- 需要为输出时钟信号指定名字或者使用默认
/ t: P. W0 g4 z$ k' S8 T9 u7 R6. 设置DFS4 L: C8 q0 j8 N. }0 a8 @# z! [# X7 H( ?
- 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值
3 p! r) b" _" E8 ?2 }' L$ m - 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值
* k i% i) K6 V* o7 a7. 最后输出所需的3种文件。 |
|