看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不相关的话,那就永久也不能确定了。
图一、DCM和BUFG合作运用示意图
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的这段延时。