|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本文翻译自Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs
) _! q) p) P; H- h" q3 F: Q* p/ EDCM主要功能+ C* X, C' }3 {2 N
1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。
, v4 P. t+ T, \8 \2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。
8 `" {, E; ?+ a4 ^/ `7 T" V" f7 c2 I3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。
; R& v) \$ U; X( x0 H7 R9 {4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。
# S8 {7 d- A3 s( f& m+ h9 J5. 电平转换:通过DCM,可以输出不同电平标准的时钟。 # Z# k1 E6 g3 P
DCM的特点与能力(Spartan-3系列为例)- 数量:4 DCM / FPGA(也有例外)
~/ r: o% }% S A& i; Q-- 应该够用了 - 数字频率综合器输入(CLKIN):1-280MHz
- 延迟锁相环输入(CLKIN):18-280MHz
- 时钟输入源(CLKIN):
2 U+ _* h5 m4 v& A, A# U; Z Global buffer input pad0 w3 R* T- O0 W
Global buffer output
" N. b* w8 G( S* K$ }1 z+ t3 o% H General-purpose I/O (no deskew)9 g9 r! k$ N( s+ A$ j
Internal logic (no deskew)
4 n( u5 M/ t# Q9 s: [9 H! n1 v! X+ S-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。 - 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中
! `# g' g9 ~6 v, F M=2..32
- K. b& h9 a9 ]: U# ~/ ` D=1..326 _3 _. r8 q9 k! l& g
-- 这样看来最大能倍频32倍,最小能16分频。 - 时钟dividor输出(CLKDV):是CLKIN的下列分频 e- F, n9 o: d0 @8 z, k
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& s( M3 F- s6 E8 J$ ^8 d
-- 发现没有,最大的分频也是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个
4 @8 C0 f/ v7 _0 n 到全局时钟网的时钟输出:最多9个中的4个
( }# R/ g& _& j. } 到General purpose互联:最多9个
, m* _% S* L+ r9 u4 p 到输出脚:最多9个8 k: ~; Y3 ]5 X4 @* Z9 {
-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。
' `3 z/ e5 u6 n2 K2 q! g% KDCM的位置在哪?
: v+ v) Q. s/ t1 {& p8 N2 Z我们以Spartan3系列为例。' G, J- q& j* l! O/ h( {) ]; X" V
FPGA看上去就是一个四方形。最边缘是IO pad了。
- S0 n7 j" `9 K3 W除去IO pad,内部还是一个四方形。
`4 B5 U$ W4 Q' ]3 J! X( Q6 O4 F( w四个角上各趴着一个DCM。& ?+ S: C8 i2 S
上边缘和下边缘中间则各趴着一个全局Buffer的MUX。
/ R& i4 a3 P: x* k1 ~这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。4 B, r4 d, d4 d x+ B7 c
下面是手绘简图,很丑是吧,呵呵。& P0 g' Y: G& r3 N; r/ ]
2 P+ b+ l% P! N7 x9 M$ B
* c# }$ h8 V; A# ~! V4 Z# U; KDCM是全局时钟网络可选的一部分$ b" K+ P& u/ R, ^2 L% p: z
一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示8 n7 \# l- l( c/ j/ X) |4 x, n3 I `) U/ q
GCLK --->( IBUFG ---> BUFG) ---> low skew global clock network
3 s2 A5 f9 p$ |6 U在需要的时候,DCM也成为全局时钟网络的一环。$ }6 n5 n( v" [" E6 r. W) b
) m0 r) F. h B& o7 n' _
" ~. y3 W" ^. y7 ?" h# s6 c! V
DCM 内部构成一览
; D3 m, X- w5 x+ e1. DLL 延迟锁定环
, y# `9 g7 Q! w1 `. p4 c5 V, Q1 \ 说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。
; H0 W; X: b5 o% Q4 b4 c4 x 实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。# ?8 H+ P/ e1 X: i9 n5 S5 a/ I/ Q
一句话,DLL的核心功能是无延迟。, L; G2 a, S( X" U! A" o( x4 n9 F
DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。2 w3 ], b+ U1 _3 L- E% L5 E/ {
9 E. P' b2 G/ S3 R
2. DFS 数字频率综合% R! F t3 [5 I3 q( u: q& ?
DFS的主要功能是利用CLKIN合成新的频率。
! d$ ?# a7 P$ \ 合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。
0 ~3 Z4 ?) O- X: A% D 如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。& Y1 u. x7 {* \
4 K) m8 v1 J1 j7 j# H, U7 D
3. PS 相位偏移5 O( I: ^* n) J5 E0 A
注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。2 a( K5 i5 C3 p* M7 O5 S+ W- P
也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。
1 B9 j1 b" D% X' G; }1 s& X1 Y6 l5 j这个功能我们平时不常用。
3 D/ d! @# `6 c( q+ Q" l% _
5 ^; Q' k. k+ _+ Y: v4. 状态逻辑& f" R% H% L' k. H1 z
这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。 8 G* D- |5 R4 M O/ e
///////////////////////////////////////////////////////////////////////////////////////////////////////////////3 z. [" M9 }0 C3 [* e, R' x6 A
) o9 s' g0 c) m0 x0 p4 k. K1 f; RDCM_BASE
G9 r: K% r8 }$ A% p0 C5 gDCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
2 _1 n. G: M( W1 T/ X' e# M/ G模块接口信号的说明如表3-8所列。
5 S1 }- R7 D5 Q+ @4 ~+ @, N
# ?/ I: e$ T/ EDCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为: ' o' C) U$ u/ R% T, t4 v: T% w1 n
/ n) a# [5 C3 n! R0 n6 H/ p// DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit) ! F/ t$ i9 R2 a/ r3 j
// 适用芯片:Virtex-4/5
$ G1 O9 ~4 n! R. [& `$ r; M// Xilinx HDL库向导版本,ISE 9.1
' O6 o4 `3 {0 QDCM_BASE #( # J5 }7 z. w6 M1 Y% K0 V1 S6 g2 A6 C
.CLKDV_DIVIDE(2.0), 5 u% ^ g$ D& O* A
// CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
. _1 g0 p' b6 q// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0 5 s8 [! J; x1 ?8 \) y
.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32 6 M& g5 r* [! d7 _
// CLKFX信号的分频比,可为1到32之间的任意整数
- K4 h( ?3 R8 J" A.CLKFX_MULTIPLY(4), # H+ `( M" s! l' ^: f1 V
// CLKFX信号的倍频比,可为2到32之间的任意整数
; i t! X. |, B5 W3 N.CLKIN_DIVIDE_BY_2("FALSE"), ! I+ W/ u+ b2 r, U, ^+ q" _
// 输入信号2分频的使能信号,可设置为TRUE/FALSE / }+ u' Q0 B, Z7 ^8 p$ C- G/ [
.CLKIN_PERIOD(10.0),
/ c9 G# j8 r5 S) L# H3 x// 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。 & M9 O$ b2 c: I" E
.CLKOUT_PHASE_SHIFT("NONE"), + |6 R* h, Q) D1 Q' {% ]. d! I7 p
// 指定移相模式,可设置为NONE或FIXED Q; T; K. e$ R0 d
.CLK_FEEDBACK("1X"), * o/ q* E$ s; x3 Y' k$ ^
// 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。
) Y5 I6 j! }7 ]2 s7 J5 h.DCM_PERFORMANCE_MODE("MAX_SPEED"),
: D- ^2 N; t9 q; u& |, |// DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE
" K+ r$ W8 V( C) j, C9 p; s G.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),
7 [2 _+ a4 }; _* ?' |" |. z// 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数 % M2 ?1 i' I) x
.DFS_FREQUENCY_MODE("LOW"),
. E$ B1 U* \5 Y' y- P) Z// 数字频率合成模式,可设置为LOW或HIGH 两种频率模式
0 Q2 s% {# M+ n1 f3 W0 U.DLL_FREQUENCY_MODE("LOW"), ! }5 w. P$ \, ~
// DLL的频率模式,可设置为LOW、HIGH或HIGH_SER
' _4 t! a1 t. v. D.DUTY_CYCLE_CORRECTION("TRUE"), & M7 |" K! D g4 ~/ H! ]3 U
// 设置是否采用双周期校正,可设为TRUE或FALSE 8 ~. t' j2 B( Z3 Z9 M8 [
.FACTORY_JF(16'hf0f0), 5 M0 x4 Z- R0 V6 k( C) b' k* A
// 16比特的JF因子参数 ! C, Z4 A& B8 d7 b
.PHASE_SHIFT(0), 4 i4 W; ^5 U3 H% ?- M: c/ N
// 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数
! U4 p. A& R; r b.STARTUP_WAIT("FALSE") $ g% ?% Z `6 n$ X9 A7 {7 V
// 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE
* W- R% N; v5 Y, p2 @) DCM_BASE_inst (
/ n# x" t7 P8 @.CLK0(CLK0), // 0度移相的DCM时钟输出 6 {( y9 Y; Q* f
.CLK180(CLK180), // 180度移相的DCM时钟输出 % Y% h. G# I( c, j9 w
.CLK270(CLK270), // 270度移相的DCM时钟输出 " i& n, M5 t. E8 c7 F) s
.CLK2X(CLK2X), // DCM模块的2倍频输出 , T8 R+ t5 K Z$ U) Q4 i/ m
.CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出
- }9 c1 s1 ]( W8 z.CLK90(CLK90), // 90度移相的DCM时钟输出
9 e1 K. b# u$ F, @.CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE e, K0 f5 }& p% w) _( @
.CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D) * e( s( a7 g1 w) `) |- w
.CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出
1 m+ X9 p9 [' u7 m- N" `.LOCKED(LOCKED), // DCM锁相状态输出信号 1 u6 {, Q: ^+ c+ P9 |1 g
.CLKFB(CLKFB), // DCM模块的反馈时钟信号 . I0 ~' m- q- w9 ^4 w
.CLKIN(CLKIN), // DCM模块的时钟输入信号 & [ S. x9 H4 K. u8 j, U: B
.RST(RST) // DCM 模块的异步复位信号 * H% ^+ H, O+ @. M7 m+ z8 H
); Y/ H$ j' C# K& Z; O
// 结束DCM_BASE模块的例化过程 7 v6 N: u$ n h+ q6 s( j
在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。
, Z' V e$ ` E+ H1 o
w Y$ ], n) x图3-36 DCM模块的RTL级结构示意图 2 z* \ i( j5 e: l$ Q+ i
///////////////////////////////////////////////////////////////////////////////////////////////////////////// w6 x) z) W; y: h) p$ K7 U* T
Spartan-3 DCM的兼容性
# S8 J9 c/ I! I6 i5 C S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)
" K) H) R* K, R$ V' E' Y2 F: V 但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。
- J* p L" B0 F2 Z
* a! f& p# |- l8 C; f+ K6 P' n3 y. p" L; @DCM 输入时钟的限制
! K l7 q0 F; H0 H; ` 和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。
7 W0 j- G, a9 x! B- P0 A! o
+ B! E# {, a, m' M! M) A 呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。' T5 h8 b+ F( V# _2 }
除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:! ^. |( b5 R0 S+ a) v
1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;* [4 A+ g2 I. \' r8 _+ a
2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;
. o# `5 A6 c7 b4 X3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。# O1 P1 N9 q! i0 `
具体数值请查手册,知道有这么回事就可以了。
" m6 e. @, }' A8 T& N8 P: A3 ALOCKED信号的行为方式7 F5 G8 N6 |: Z/ x# d) v
LOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。8 n3 J& v. B9 [! V) y
FPGA配置:
8 y/ J6 _: [7 b0 u' Z3 C if (CLKIN已经稳定) next_state = 判断同步;
3 {* Z6 u5 r4 a& O! A) v5 O else next_state = RST_DCM;
& j' H1 n6 b8 A" C' R) }4 h判断同步:
! c) {* ^4 j- ]- \ if (已经同步) next_state = 判断同步;% I1 i, y, O7 @- F. A
else next_state = 同步失败;2 A; T9 \+ B0 p9 ^- M
同步失败: next_state = RST_DCM;
& [0 X, P% b0 E1 ]/ RRST_DCM: next_state = FPGA配置;/ p! `- L5 w+ i' w1 `2 y( S% s
! v% V! ~3 f0 T: j) L4 m; K, H
现在来看看各个状态下的输出。
( r6 V+ f% [% g% X& o" K) z
& b# S9 N! h; x- Ccase (state)8 F$ _) k( ^6 m' ]$ h" w6 w- K
FPGA配置: LOCKED = 0;* }* r! f. x8 a3 m8 j7 S+ J7 c
判断同步: LOCKED = 1;
8 N2 w4 F0 L1 X1 h6 Q 同步失败: LOCKED = 0;4 I* K/ P, P) a3 s( v# h' z
RST_DCM:LOCKED = 0;
. \5 S0 X* w; H9 u* rendcase9 y9 X/ }9 a* ~
RST 信号——重启锁定
% P# v# k; ~- [9 X* U9 n6 z RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。- }' Q! P* R9 V( J" z
作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。
b4 B) W& g% d1 ?7 w 置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。
* _5 m! x, s( h# p: r& T( f2 D0 e. }DCM 生成向导& |- |/ _0 s4 _8 P$ h
安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:
. f$ {1 e8 h7 F [5 ?# ~1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog); v/ E! `% g/ x- k
2. 一个UCF文件控制特定实现
" V2 C( G# k) j& R3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。4 C( O+ e' O1 a2 c5 N/ L
% K2 D3 a$ B$ u8 }; h- ^/ c1 F接下来描述一下向导使用步骤。 c* P/ t6 M# ~/ J3 H2 q
1. 从ISE或者Arch wizard中启动界面;
$ _- P* N/ }& A! P* ~9 D8 s. |) ~2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;6 _! v z0 M0 F4 X
3. 进行General setup,一看就明白,不细说,注意一下几点:% |0 o* }- d" K3 I i6 o
- CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。9 x2 n, ~5 A' e5 s
- Feedback如果选 internal 则反馈来自 BUFG。& {0 ~1 x \0 b. ?, c
4. 高级设置 D: x2 e; q' M) c: B6 j
- 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。
1 b8 R3 a6 b: [. \: _ - 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。4 M) Q. h0 ~* G
- Deskew调整,这个选项建议在咨询xilinx工程师后再使用。 _% b6 m0 r7 r( d8 o! O* K0 K
5. 时钟输出口 Buffer 设置% k) T3 b% a. i
- 默认情况下所有输出口都链接 BUFG 全局时钟网络入口& h. s6 B% e5 I; u5 j
- 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer" \2 G8 d4 ~! [7 V# Y! e
- Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG' M6 \/ W" I! u* W. W N" ]8 K
- Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE
9 L' J7 l& \* S# K2 [ - Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX: O4 v: R, I( c! C' G
- Low skew line:没有buffer了,只能使用 skew 比较小的连线& a5 C- C3 f) s5 R) \7 K
- Local Routing:连到本地,skew的要求不是很严格
# Z! a2 I Q I - None:禁止输出4 q; L( \4 w! `& r
- 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字
: [, k- i! }2 |. Q8 a* a - 需要为输出时钟信号指定名字或者使用默认
1 C/ K6 y2 q& n: M Y6. 设置DFS6 \. a. e! B B2 f
- 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值
! T9 N2 {. G% b - 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值+ h# c, Q# p% O9 L; b5 D
7. 最后输出所需的3种文件。 |
|