|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本文翻译自Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs 4 d4 W: N2 t/ Q. U5 s2 G$ R" o) ~" P
DCM主要功能
* N, {5 F1 j [7 b1. 分频倍频:DCM可以将输入时钟进行multiply或者divide,从而得到新的输出时钟。
( ]4 K Y) h: u# K: M2. 去skew:DCM还可以消除clock的skew,所谓skew就是由于传输引起的同一时钟到达不同地点的延迟差。3 i- h* O! t& z; t7 K3 Q
3. 相移:DCM还可以实现对输入时钟的相移输出,这个相移一般是时钟周期的一个分数。
/ ` D, q6 D5 ?6 i, g- u4. 全局时钟:DCM和FPGA内部的全局时钟分配网络紧密结合,因此性能优异。
! l4 u) ~6 T. J" E8 N5. 电平转换:通过DCM,可以输出不同电平标准的时钟。 , J5 E4 K+ |+ m, e
DCM的特点与能力(Spartan-3系列为例)- 数量:4 DCM / FPGA(也有例外)- W" N( y% Q8 R% S& p7 {
-- 应该够用了 - 数字频率综合器输入(CLKIN):1-280MHz
- 延迟锁相环输入(CLKIN):18-280MHz
- 时钟输入源(CLKIN): E! c# A4 a, H* r: K' L! }
Global buffer input pad
: G. x2 z# g3 D8 u P( a Global buffer output. v0 {& m: C2 Q8 m- `
General-purpose I/O (no deskew)
) u% P' t. o& t) w Internal logic (no deskew)! g$ E. S3 F: T+ N* x: u1 d5 \
-- 上面最后两个分别是外部的普通IO口和内部的逻辑,没有deskew,所以时钟质量不会很好。 - 频率综合器输出(CLKFX、CLKFX180):是CLKIN的M/D倍,其中; B6 e- h$ S Q) s; V
M=2..32
+ U$ ^$ B$ Q; p- l4 C D=1..32/ B& n, Z. z/ ~4 N
-- 这样看来最大能倍频32倍,最小能16分频。 - 时钟dividor输出(CLKDV):是CLKIN的下列分频2 }2 D7 g' E) j% T5 u& @+ H
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 165 b! k, w& N, k5 t# b
-- 发现没有,最大的分频也是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个
6 _9 b3 H- L) t1 \ 到全局时钟网的时钟输出:最多9个中的4个
; H8 {" D# ]; J 到General purpose互联:最多9个! m6 c7 T# Y, M
到输出脚:最多9个2 O6 `' j! h2 s8 b' `; |
-- 可见9个时钟输出可以随意链接内部信号或者外部输出,但是进入全局时钟网的路径最多只有4个。
( C `0 L) `. U* d/ H3 k PDCM的位置在哪?
8 A1 z$ p* u/ T2 o: ~' A2 A我们以Spartan3系列为例。, F; B5 _( g% w& ~9 t
FPGA看上去就是一个四方形。最边缘是IO pad了。
: o6 J$ f1 R0 V+ j! I' T除去IO pad,内部还是一个四方形。
3 _; ^+ F2 _; x! F8 ^$ a$ a四个角上各趴着一个DCM。
! q2 _# j9 V- \- b5 O9 G上边缘和下边缘中间则各趴着一个全局Buffer的MUX。
8 p( ?- m& U* D( Q. O! o* A* w# a这样的好处是四个DCM的输出可以直接连接到全局Buffer的入口。
' _. u* z& F5 A5 P: B下面是手绘简图,很丑是吧,呵呵。4 y# \1 e, R) m; j; ~
- y: S3 c) ?& l# n. R; N, ^
8 t+ U% i1 c* C1 K8 K2 B) {" p
DCM是全局时钟网络可选的一部分0 p7 Z8 E4 d/ B# a, p+ Y! P6 H
一般,时钟通过一个“全局输入buffer”和“全局时钟buffer” 进入全局时钟网络。如下所示8 i9 y1 Y( J: \+ g
GCLK --->( IBUFG ---> BUFG) ---> low skew global clock network
3 v- p) o- I! H* y0 I) U: l在需要的时候,DCM也成为全局时钟网络的一环。9 V( O$ i$ [7 C& {, d7 L
7 D, ?! e1 R% N- ], }# V! g$ r/ ?
. P! o( K" b2 g# A) M: tDCM 内部构成一览" o/ o9 h- i4 s2 G2 X
1. DLL 延迟锁定环, `% h& f8 V8 { d8 P
说是延迟锁定环,但是我觉得叫做延迟补偿环更加贴切。因为DLL的主要功能是消除输入时钟和输出时钟之间的延迟,使得输入输出在外部看来是透明连接。0 K1 y. T: p: C% `+ p
实现这种功能的原理是:DLL通过输出时钟CLK0或者CLK2X观察实际的线路延迟,然后在内部进行补偿。( H8 h7 {9 V( {( W' q9 Q2 X" ^
一句话,DLL的核心功能是无延迟。
* F3 v6 Q1 R1 g; v, g* n DLL的输出是CLK0, CLK90, CLK180, CLK270, CLK2X, CLK2X180, 和 CLKDV。$ M. [3 c4 a1 k8 {% b! b* f
, m, O3 O4 X5 l2 F+ B! |! n9 K5 H2. DFS 数字频率综合4 w9 ]9 o& @% `% N* f4 Y; i! W
DFS的主要功能是利用CLKIN合成新的频率。
2 Y4 L$ y, D# B 合成的参数是:M(multiplier)和 D(divisor)。通过MD的组合实现各种倍频和分频。
# ?: ^, E& |, E! L6 T2 v 如果不使用DLL,则DFS的合成频率和CLKIN就不具有相位关系,因为没有延迟补偿,相位就不再同步。
' X* C5 U6 w g( G4 w: o# m4 }5 Y, H" T
3. PS 相位偏移% g' ~$ ^3 \; q$ Z7 R$ d- Y
注意这个相位偏移不是DLL中输出CLK90/180/270用的。这个PS可以令DCM的所有9个输出信号都进行相位的偏移。偏移的单位是CLKIN的一个分数。
4 t4 C5 Q# p5 j2 a/ [0 Y 也可以在运行中进行动态偏移调整,调整的单位是时钟的1/256。
6 A- m! s8 l" a. {3 p' ?这个功能我们平时不常用。
3 u2 E. @6 B) x. c# i$ E
! B& a: _7 ?# r4. 状态逻辑+ q7 ?( ?! ]3 C5 a$ Q
这个部分由 LOCKED 信号和 STATUS[2:0] 构成。LOCKED信号指示输出是否和CLKIN同步(同相)。STATUS则指示DLL和PS的状态。
* x: I: @$ u4 i) {* D0 f( q///////////////////////////////////////////////////////////////////////////////////////////////////////////////
: X. B V& b2 g" [* g$ J `
8 C' g! F3 U c8 }9 @3 s. v- VDCM_BASE
9 x* [. n: ~$ E8 Y+ b! VDCM_BASE是基本数字时钟管理模块的缩写,是相位和频率可配置的数字锁相环电路,常用于FPGA系统中复杂的时钟管理。如果需要频率和相位动态重配置,则可以选用DCM_ADV原语;如果需要相位动态偏移,可使用DCM_PS原语。DCM系列原语的RTL结构如图3-8所示。
+ z2 G" X( }7 j. h2 V4 _模块接口信号的说明如表3-8所列。
6 t5 W' n) ]* m8 Y3 C$ H 5 r+ j- L9 C+ u" L
DCM_BASE组件可以通过Xilinx的IP Wizard向导产生,也可以直接通过下面的例化代码直接使用。其Verilog的例化代码模板为:
) U9 @' w* [% m) r( Z. z' U9 Q
- b( ~# X1 K9 U- {& Q// DCM_BASE: 基本数字时钟管理电路(Base Digital Clock Manager Circuit)
- E5 Y- V$ F9 _: S& w// 适用芯片:Virtex-4/5
; o. o1 F/ R8 f// Xilinx HDL库向导版本,ISE 9.1
- z) v" \9 d3 s* ~ f9 PDCM_BASE #( & x- @6 @2 ^! u# G* c! I7 U* j* J
.CLKDV_DIVIDE(2.0), 6 X; e$ @9 S( p
// CLKDV分频比可以设置为: 1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5 1 l4 d) l1 r$ p1 v& ]: \- G% t- ?
// 7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
' ]: `8 e8 M% _2 z/ V.CLKFX_DIVIDE(1), // Can be any integer from 1 to 32
$ @' \5 T G# A// CLKFX信号的分频比,可为1到32之间的任意整数
- l' q S- a0 c, [. I9 D.CLKFX_MULTIPLY(4),
! N' y7 P" j4 [) J( H. l// CLKFX信号的倍频比,可为2到32之间的任意整数
; h$ A9 ]" c3 q4 j% }4 J.CLKIN_DIVIDE_BY_2("FALSE"), 9 f w1 |; m! t
// 输入信号2分频的使能信号,可设置为TRUE/FALSE 8 \1 O/ B3 n( F& v( P( k* ]
.CLKIN_PERIOD(10.0), 2 u- a. Q( e2 \
// 指定输入时钟的周期,单位为ns,数值范围为1.25~1000.00。
) S" `# x' }/ q$ }! S6 o7 O.CLKOUT_PHASE_SHIFT("NONE"),
' `5 c: r. y* A" F& d8 C* b8 e4 j6 K// 指定移相模式,可设置为NONE或FIXED 8 T+ p+ c, O( L
.CLK_FEEDBACK("1X"),
/ d3 x; p& @& P1 b// 指定反馈时钟的频率,可设置为NONE、1X或2X。相应的频率关系都是针对CLK0而言的。 , w4 @' K; J% m( L" d. Q" l8 Y0 O
.DCM_PERFORMANCE_MODE("MAX_SPEED"),
0 I5 h, y& r: R2 X% m2 i3 t( H* _// DCM模块性能模式,可设置为 MAX_SPEED 或 MAX_RANGE
4 v! D; g+ L7 c/ F* C7 H( M.DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"),
, x/ I1 K1 i9 f* E' P+ a$ k// 抖动调整,可设置为源同步、系统同步或0~15之间的任意整数 3 ?# c0 W3 B: U5 M
.DFS_FREQUENCY_MODE("LOW"),
4 i, n' b( L6 v) ?! `, x// 数字频率合成模式,可设置为LOW或HIGH 两种频率模式 : D5 C" _2 z$ y, Y* j$ K
.DLL_FREQUENCY_MODE("LOW"), ) J+ }6 l. N6 Q/ X+ \
// DLL的频率模式,可设置为LOW、HIGH或HIGH_SER 7 S7 g) w( ~" `6 S" @; h+ U& D1 {0 q
.DUTY_CYCLE_CORRECTION("TRUE"), 0 t* [" ~$ @0 F! |! q0 h! D
// 设置是否采用双周期校正,可设为TRUE或FALSE
6 j$ G2 e7 ^% c" r3 q.FACTORY_JF(16'hf0f0), $ H( y/ A% `" m) g) ]% G6 A1 x
// 16比特的JF因子参数
2 A; H3 Q4 V9 \6 w. L/ F. w1 h, T4 W.PHASE_SHIFT(0),
/ b* i. M0 Y9 i4 M" y, F// 固定相移的数值,可设置为 -255 ~ 1023之间的任意整数 6 R3 v4 l: u s7 Q" W) U8 t: d
.STARTUP_WAIT("FALSE") : _5 R9 D1 M$ G# H3 F+ }
// 等DCM锁相后再延迟配置DONE管脚,可设置为TRUE/FALSE
; }$ e' M9 V- ?4 |8 n! p0 K* B, i) DCM_BASE_inst (
: @* u" K& p: X G# P.CLK0(CLK0), // 0度移相的DCM时钟输出 ! ^* M( w1 t/ Y: U
.CLK180(CLK180), // 180度移相的DCM时钟输出 . j* L, G6 j. {$ V# a3 a) K4 F/ e
.CLK270(CLK270), // 270度移相的DCM时钟输出
- B& f( x6 {' D( e, g# @" a7 c.CLK2X(CLK2X), // DCM模块的2倍频输出 7 k: w! J$ r$ O/ A0 L/ i* h+ S0 X
.CLK2X180(CLK2X180), // 经过180度相移的DCM模块2倍频输出
% [1 s1 p' \' |.CLK90(CLK90), // 90度移相的DCM时钟输出 # L3 m& L0 G) o& s( E7 R* v
.CLKDV(CLKDV), // DCM模块的分频输出,分频比为CLKDV_DIVIDE
. ]* t2 f$ E1 ]% L) F9 `.CLKFX(CLKFX), // DCM合成时钟输出,分频比为(M/D)
$ I; f% h0 \1 ?) d$ F.CLKFX180(CLKFX180), // 180度移相的DCM合成时钟输出
3 g) Y' P; ]$ f0 q7 R& b.LOCKED(LOCKED), // DCM锁相状态输出信号 3 }* d5 J6 B, x# `0 X
.CLKFB(CLKFB), // DCM模块的反馈时钟信号 2 r) f# Z% y# d6 h6 {% E0 i
.CLKIN(CLKIN), // DCM模块的时钟输入信号
9 c% R/ }; q' i! D% T! w! M- d: K, o% S.RST(RST) // DCM 模块的异步复位信号 : d0 |) o. X3 d, s
); & w9 M) h8 O$ v F4 B
// 结束DCM_BASE模块的例化过程
* N$ V1 R. b( W$ x% Z在综合结果分析时,DCM系列原语的RTL结构如图3-36所示。 4 t- r" g. |6 ?4 U% H$ Z- V
3 b6 v5 k$ J ~0 y图3-36 DCM模块的RTL级结构示意图
$ B; `) ?1 f8 K7 O, j- j5 ^/////////////////////////////////////////////////////////////////////////////////////////////////////////////
- j1 ^0 q6 w% v5 \/ B% kSpartan-3 DCM的兼容性
' P3 v1 [1 d ^& y( I S3 的DCM和 Virtex-II 以及pro的DCM 功能基本相同。但是S3 DCM的技术属于3代技术,因此在抗噪性能、相移能力方面有进一步提高。(客观的说,对我们的普通应用,不是特别重要。)7 |5 W$ L5 J& w8 O+ o. R/ @2 B! e
但是和Spartan-2系列相比,有很大改进。S2系列不叫DCM叫DLL,可见DFS和PS等功能完全是新加入的,所以S2系列其实除了二倍频几乎没有倍频和分频能力。从这点来讲,S3真的是用起来很爽了。
1 P9 R+ j& K1 U
* J0 m, a/ r3 G( ]DCM 输入时钟的限制
) x3 g. x. r$ |+ C/ o3 h 和所有物理器件一样,DCM的工作范围也是受限的。由于DLL和DFS的要求各不相同,因此DCM的输入频率的限制也视乎是否同时使用DLL和DFS还是单独使用其中之一。如果同时使用,则取限制较严格者作为整个DCM系统的限制。我们来看两者的独立限制。
" \+ ?: {0 K5 i$ f
* n3 N2 a; s( ?9 ~' q 呵呵,这部分内容不用记哦,需要的时候查一下软件或者手册就可以了。只要明白“CLKIN输入频率有限制,而且DLL、DFS同时使用时取其严格者” 这些道理就可以了。
8 F7 l7 s# t( P9 q- u( t3 L 除了时钟限制之外,对于时钟的质量也有一定限制,主要有3个:3 B% H* q$ T+ e( \3 p1 M, h
1. CLKIN cycle-to-cycle jitter:约束了前后两个CLKIN周期的差异;
: B1 b0 P. U" _6 c; j3 U2. CLKIN period jitter:约束了100万个cycle中最大周期和最小周期之间的差异;. U- T; G! O% a2 y+ V
3. CLKFB path delay variation:约束了从外部进来的反馈回路的延迟波动,这种延迟波动在概念上其实和jitter如出一辙。
% ?/ q& |; W$ m# p具体数值请查手册,知道有这么回事就可以了。7 C- S3 M) P6 [2 t# L- k
LOCKED信号的行为方式+ M& Z/ m: P3 n5 t. M* B6 S
LOCKED信号用于指示整个DCM系统已经和CLKIN同步,从LOCKED信号有效开始,输出时钟才可以使用,在此之前,输出时钟可能会处于各种复杂的不稳定状态。我们来看一下LOCKED信号的行为状态机。
8 Y2 o; ^: I1 D! {FPGA配置:; m& ]0 [( e8 `, i2 z# l5 \" N+ [
if (CLKIN已经稳定) next_state = 判断同步;: n( g, a" e* x4 S3 }
else next_state = RST_DCM;7 Z, A5 k' ^/ H8 v
判断同步:
: w# }& m3 i- j6 m! c7 ^+ |1 G if (已经同步) next_state = 判断同步;) x) A, o* ~. i( W- w+ B
else next_state = 同步失败;
8 o8 N, }6 o( P& e% l同步失败: next_state = RST_DCM;
! S' g# K( o S: XRST_DCM: next_state = FPGA配置;: d5 I' ^3 z* H
: B" B/ w$ G$ w% N现在来看看各个状态下的输出。% P: f$ p& \9 c) Y% \$ j
# e: c J* h8 h/ n$ w) P! P$ W* U
case (state)
0 W! O: f; @9 L3 D( } FPGA配置: LOCKED = 0;
% i1 n% P% @) H2 ^3 K 判断同步: LOCKED = 1;' q2 O* j& C% `0 a) b2 l
同步失败: LOCKED = 0;
) n/ @3 Y9 G) p5 J. g RST_DCM:LOCKED = 0;
Y, c$ R* g0 W; z, ?# p& R) U5 pendcase; o) v% t4 F% b' j; T4 l
RST 信号——重启锁定
* d8 P4 q0 {1 v' `& C6 v# I RST信号用于在时钟不稳定或者失去锁定时,将DCM的相关功能重置,从而重新启动锁定追踪。
! J4 d6 r" r! x# F 作为一个输入信号,RST无法被DCM自身置位,因此需要我们的应用设计来控制这个RST信号,否则需将其接地。
1 a0 i1 |/ q! T0 n& |6 U 置位RST会将延迟tap的位置置0,因此可能会产生glitch或者是duty cycle 发生变化,另外相位偏移也会重置回到默认值。
- U1 t2 C: F. e# i1 B# fDCM 生成向导
1 c) z) [8 t( `安装了ISE就能得到一系列accessories。利用其中的Architecture Wizard 我们可以生成DCM模块。生成的DCM将产生3种输出:
5 | X! U9 O% @1. 一个例化了DCM的逻辑综合文件(采用生产商特定格式的VHDL / Verilog)
$ g" C5 e# O) e- m3 j2. 一个UCF文件控制特定实现9 @! h8 |' p/ p/ K I
3. 所有其他用户设置都保存到XAW(Xilinx Architecture Wizard)文件中。
: \6 y" ^5 |, {- r' d9 Y% j; m% o' I: I H
接下来描述一下向导使用步骤。+ r+ o( ~0 d5 z; Q0 @2 Y
1. 从ISE或者Arch wizard中启动界面;
! J& X' f2 k9 o% a( P: k F2. 第一个页面做基本配置:路径、XAW文件名、VHDL / Verilog选择、综合工具、FPGA型号;+ S4 a4 M1 M [# ]$ z
3. 进行General setup,一看就明白,不细说,注意一下几点:! k$ W% A' r" q, u$ }8 S8 P
- CLKIN source 如果选 external 则 DCM 的 CLKIN 会自动连接到 IBUFG。! c! d' q6 C5 p3 V: d: f+ I6 J4 `
- Feedback如果选 internal 则反馈来自 BUFG。* o7 H/ e- t: k5 q3 ^/ S
4. 高级设置
& b4 P( b' i# K& O - 选择FPGA的配置过程是否包含DCM的锁定,如果是,则配置完成信号DONE将在LOCKED信号有效后方能有效。
, S( ^( }* {& s5 \+ ^( R( s - 选择CLKIN是否要除2。由于DCM的输入频率有限,对于过高的输入时钟通过除2使之可用。7 `$ s) M! e! R
- Deskew调整,这个选项建议在咨询xilinx工程师后再使用。$ @0 |6 E" ]+ D m; t" V
5. 时钟输出口 Buffer 设置
, N& R6 \* g+ O0 G# L - 默认情况下所有输出口都链接 BUFG 全局时钟网络入口
5 m: u6 G; |: C* X% F) g5 p - 由于全局时钟网络的入口有限,用户可以定制时钟输出口连接到其他类型的Buffer) r9 B2 K" _5 I! j" m& P
- Global Buffer:进入全局时钟网络的入口Buffer,共有4个,简称BUFG4 N8 g1 r% f/ [, h. `
- Enabled Buffer:还是上面的4个全局时钟Buffer,但是配置为有使能信号控制,简称BUFGCE
0 Q; b, M2 v/ m6 l0 ?, @2 u: U( k - Clock MUX:还是上面的4个全局时钟Buffer,但是配置为 2-to-1 MUX类型,由S信号控制选出,简称BUFGMUX
1 Q" } y- l1 F3 @, z( W - Low skew line:没有buffer了,只能使用 skew 比较小的连线
* Z+ q9 C) z7 e5 e - Local Routing:连到本地,skew的要求不是很严格5 s1 b( r* s5 s$ n# ~
- None:禁止输出
/ b$ u5 z/ i0 f% c7 t - 对于Enabled Buffer类型和Clock Mux类型,需要指定En口的名字
: A- S1 z. c7 k, u4 } - 需要为输出时钟信号指定名字或者使用默认. H: W3 s- V1 y* ?2 O
6. 设置DFS
7 k8 y4 [8 ]% N9 k - 设置目标输出频率,然后按calculate,自动生成 M/D 值和 Jitter 值! S) `# o2 q8 i% K" z
- 或者手动设置 M/D 值,然后按calculate,自动生成频率和 Jitter 值( _! c+ w0 B. h+ b
7. 最后输出所需的3种文件。 |
|