FPGA DCM 时钟管理单元的理解
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
DCM 一般和 BUFG 配合使用,要加上 BUFG,应该是为了增强时钟的驱动能力。DCM 的一般
使用方法是,将其输出 clk_1x 接在 BUFG 的输入引脚上,BUFG 的输出引脚反馈回来接在 DCM
的反馈时钟脚 CLKFB 上。另外,在 FPGA 里,只有 BUFG 的输出引脚接在时钟网络上,所以一般
来说你可以不使用 DCM,但你一定会使用 BUFG。有些兄弟总喜欢直接将外部输入的时钟驱动
内部的寄存器,其实这个时候虽然你没有明显地例化 BUFG,但工具会自动给你加上的。
使用 DCM 可以消除时钟 skew
使用 DCM 可以消除时钟 skew。这个东西一直是我以前所没有想清楚的,时钟从 DCM 输出
开始走线到寄存器,这段 skew 的时间总是存在的,为什么用 DCM 就可以消除呢?直到有一天
忽然豁然开朗,才明白其原委。对高手来说,也许是极为 easy 的事情,但也许有些朋友并不一定