如何使用DCM

有些fpga学习者,看xilinx的datasheet会注意到xilinx的fpga没有pll,其实dcm就是时钟管理单元。
1、dcm概述
dcm内部是dll(delay lock loop结构,对时钟偏移量的调节是通过长的延时线形成的。dcm的参数里有一个phaseshift(相移),可以从0变到255。所以我们可以假设内部结构里从输入引脚clkin到输出引脚clk_1x之间应该有256根延时线(实际上,由于对不同频率的时钟都可以从0变到255,延时线的真正数目应该比这个大得多)。dcm总会把输入时钟clkin和反馈时钟clkfb相比较,如果它们的延时差不等于所设置的phaseshift,dcm就会改变在clkin和clk_1x之间的延时线数目,直到相等为止,输出和输入形成闭环,动态调整到设定值再退出。这个从不等到相等所花的时间,就是输出时钟锁定的时间,相等以后,lock_flag标识才会升高。
当dcm发现clkin和clkfb位相差不等于phaseshift的时候,就去调节clk_1x和clkin之间延时,所以如果clk_1x和clkfb不相关的话,那就永远也不能锁定了。
2、如何使用dcm
dcm一般和bufg配合使用,要加上bufg,应该是为了增强时钟的驱动能力。dcm的一般使用方法是,将其输出clk_1x接在bufg的输入引脚上,bufg的输出引脚反馈回来接在dcm的反馈时钟脚clkfb上。另外,在fpga里,只有bufg的输出引脚接在时钟网络上,所以一般来说你可以不使用dcm,但你一定会使用bufg。有些兄弟总喜欢直接将外部输入的时钟驱动内部的寄存器,其实这个时候虽然你没有明显地例化bufg,但工具会自动给你加上的。
3、使用dcm可以消除时钟skew
使用dcm可以消除时钟skew。这个东西一直是我以前所没有想清楚的,时钟从dcm输出开始走线到寄存器,这段skew的时间总是存在的,为什么用dcm就可以消除呢?直到有一天忽然豁然开朗,才明白其原委。对高手来说,也许是极为easy的事情,但也许有些朋友并不一定了解,所以写出来和大家共享。
为说明方便起见,我们将bufg的输出引脚叫做clk_o,从clk_o走全局时钟布线到寄存器时叫做clk_o_reg,从clk_o走线到dcm的反馈引脚clkfb上时叫clkfb,如图所示。实际上clk_o, clk_o_reg, clkfb全部是用导线连在一起的。
所谓时钟skew,指的就是clk_o到clk_o_reg之间的延时。如果打开fpga_editor看底层的结构,就可以发现虽然dcm和bufg离得很近,但是从clk_o到clkfb却绕了很长一段才走回来,从而导致从clk_o到clk_o_reg和clkfb的延时大致相等。
总之就是clk_o_reg和clkfb的相位应该相等。所以当dcm调节clkin和clkfb的相位相等时,实际上就调节了clkin和clk_o_reg相等。而至于clk_1x和clk_o的相位必然是超前于clkin, clkfb, clk_o_reg的,而clk_1x和clk_o之间的延时就很明显,就是经过那个bufg的延迟时间。
4、对时钟skew的进一步讨论
最后,说一说时钟skew的概念。时钟skew实际上指的是时钟驱动不同的寄存器时,由于寄存器之间可能会隔得比较远,所以时钟到达不同的寄存器的时间可能会不一样,这个时间差称为时钟skew。这种时钟skew可以通过时钟树来解决,也就是使时钟布线形成一种树状结构,使得时钟到每一个寄存器的距离是一样的。很多fpga芯片里就布了这样的时钟树结构。也就是说,在这种芯片里,时钟skew基本上是不存在的。
说到这里,似乎有了一个矛盾,既然时钟skew的问题用时钟树就解决了,那么为什么还需要dcm+bufg来解决这个问题?另外,既然时钟skew指的是时钟驱动不同寄存器之间的延时,那么上面所说的clk_o到clk_o_reg岂非不能称为时钟skew?
先说后一个问题。在一块fpga内部,时钟skew问题确实已经被fpga的时钟方案树解决,在这个前提下clk_o到clk_o_reg充其量只能叫做时钟延时,而不能称之为时钟skew。可惜的是fpga的设计不可能永远只在内部做事情,它必然和外部交换数据。例如从外部传过来一个32位的数据以及随路时钟,数据和随路时钟之间满足建立保持时间关系(setup hold time),你如何将这32位的数据接收进来?如果你不使用dcm,直接将clkin接在bufg的输入引脚上,那么从你的clk_o_reg就必然和clkin之间有个延时,那么你的clk_o_reg还能保持和进来的数据之间的建立保持关系吗?显然不能。相反,如果你采用了dcm,接上反馈时钟,那么clk_o_reg和clkin同相,就可以利用它去锁存进来的数据。可见,dcm+bufg的方案就是为了解决这个问题。而这个时候clk_o到clk_o_reg的延时,我们可以看到做内部寄存器和其他芯片传过来的数据之间的时钟skew。
由此,我们可以得出一个推论,从晶振出来的时钟作为fpga的系统时钟时,我们可以不经过dcm,而直接接到bufg上就可以,因为我们并不在意从clkin到clk_o_reg的这段延时。
原文标题:fpga 的 dcm时钟管理单元概述
文章出处:【微信公众号:fpga之家】欢迎添加关注!文章转载请注明出处。


ADC交错(织)技术进阶篇
Linux下进程的内存结构
tl494简单逆变器电路
基于无人机高光谱遥感的森林可燃物分类方法研究-莱森光学
依利安达5G通讯电路板成为支撑5G通讯基站顺利运行的核心部件
如何使用DCM
加州拟全面禁止燃油车 还有许多困难要克服
了解和使用Maxim 1-Wire和iButton产品的循环冗余校验
全球及中国矿山自动驾驶行业研究报告
200个传感器环绕生活 200个传感器如何分工
制造革新-首家使用Stratasys Infinite Build 3D打印机的汽车制造商
教你打包一个自己的Vivado IP核
SII精工半导体正式改名为ABLIC Inc“3S”理念扩大模拟IC市场
中软国际数据治理专业服务解决方案获得华为云联合基线解决方案认证
贸泽开售适用于可编程光纤模块的 Renesas高性能FemtoClock2合成器
激光熔覆工艺深度解析:原理、分类与材料选择
奶业物联网技术对我们有什么意义
红米Note7Pro拍照对比荣耀V20 同款主摄区别到底有多大
饱受诟病的Android 应用权限问题
CK开发出KXT系列瞬间作用开关