3.2 解决方案 3.2.1 门控时钟 实际上,BUFGMUX并不是简单的时钟缓冲器,他是一个具有低时钟偏差、高驱动能力并带有选择端的双路选择器。使用不同的原语进行实例化,BUFGMUX可以构成时钟选择器、时钟门控器或者简单的时钟缓冲器[1]。 尽管BUFGMUX就3种使用方式,但如果让综合软件自动在合适的位置指定BUFGMUX,由于综合软件只能认出网线形式的时钟信号,因而只会使用BUFG的方式使用BUFGMUX,造成了上述的问题。
为了去除由于门控时钟造成的时钟偏差,只能通过手动更改代码,在合适的位置实例化BUFGMUX。在此例中可以为CLK_2X信号实例化BUFG原 语,而使用BUFGCE原语替代原来的与门,并直接使用CLK_IN为BUGCE的输入。这样CLK_2X和CLK_2XG都只经过了一个 BUFGMUX,因此可以近似地认为不存在时钟偏差。同理CLK_1X和CLK_1XG之间的时钟偏差也可以解决。 3.2.2 分频时钟 然而,BUFGMUX的3种使用方式并不能解决分频寄存器造成的CLK_1X和CLK_2X之间的时钟偏差问题。比较简单的一种方法是使用CLK_IN作为分频寄存器的输入,而不对CLK_2X进行分频。 尽管如此,由于分频寄存器的器件延时和相应的连接线路延时,CLK_2X和CLK_1X之间仍然存在大约2-3ns的时钟偏差,对于某些跨时钟域的 关键路径和时钟保持(Hold Time)约束来说,仍然过大。另外,由于CLK_IN被分频寄存器当作时钟使用,可能会造成综合软件自动给CLK_IN指定BUFG,导致所有时钟信号 都需要经过两个BUFGMUX,产生一个12ns左右的输入延时。 针对这种问题,可以使用FPGA当中的另一个特殊资源——DCM(Digital Clock Manager,数字时钟管理单元)。DCM当中包含一个DLL(Delay-Locked loop,延迟锁定电路),可以提供对时钟信号的二倍频和分频功能,并且能够维持各输出时钟之间的相位关系,即零时钟偏差(更详细的说明可查看参考文献 [1,2]。 因此,针对分频时钟,可以直接利用DCM的分频功能,从而省去分频寄存器,彻底地解决了CLK_2X和CLK_1X之间的时钟偏差。不过更合适的选择是使用DCM的倍频功能,这样只需要为FPGA准备一个40MHz的低频时钟输入,相对80MHz要更容易实现。 3.2.3 最终实现 通过BUFGMUX和DCM的使用,可以将图4改造为图6所示的电路结构。
改造后,每个时钟域的时钟信号和信号源CLK_IN之间都只通过一个DCM和一个BUFGMUX,他们之间的时钟偏差仅为时钟网络本身的时钟偏差和 DCM的输出到各BUFGMUX输入端之间的线路延时偏差。如果进一步优化,通过在布局布线的步骤施加对BUFGMUX的位置约束,迫使图5中的4个 BUFGMUX都处于FPGA的上方或者下方的8个BUFGMUX上,跨时钟域的时钟偏差在VIRTEX Ⅱ 6000FPGA当中可以控制在0.5ns以内,基本满足80MHz的要求。改造后的时钟电路的后仿波形如图7所示,其最大的时钟偏差为0.722ns。
实际上,DCM和BUFGMUX从VIRTEX Ⅱ开始,已经成为FPGA的标准元件,可以在SPARTAN-3,VIRTEX Ⅱ,VIRTEX Ⅱ PRO,VIRTEX-4等器件上直接使用,因此该电路结构也可相应推广到这些FPGA的电路设计当中。 4 结语 本文通过比较ASIC时钟树结构和FPGA时钟网络的结构,说明了FPGA时钟网络的自身特点。通过一个设计实例,分析了直接使用综合工具实现多时 钟域的电路设计所存在的问题,并针对这些问题提出了利用BUFGMUX的三种使用方式代替门控时钟与利用DCM代替分频时钟的方法,较好地解决了FPGA 时钟电路的时钟偏差问题,并具有一定的适用性。 |