目录
在 FPGA基础知识 1(FPGA 内部结构)文章中,了解到 FPGA 内部集成了很多资源,时钟、BRAM、IOB、CLB、DSP等;时钟是时序电路的基石,所以掌握时钟资源和相关的知识显得尤为重要;
1、时钟网络与全局缓冲
在Xilinx的FPGA中,时钟网络资源分为两大类:全局时钟资源和区域时钟资源。
全局时钟资源是一种专用互连网络,它可以降低时钟歪斜、占空比失真和功耗,提高抖动容限。Xilinx的全局时钟资源设计了专用时钟缓冲与驱动结构,从而使全局时钟到达CLB、IOB和BRAM的延时最小。
以全铜工艺实现的全局时钟网络,加上专用时钟缓冲与驱动结构,从而可使全局时钟到达芯片内部所有的逻辑可配置单元,且I/O单元以及块RAM的时延和抖动最小,可满足高速同步电路对时钟触发沿的苛刻需求
区域时钟资源是独立于全局时钟网络的。Xilinx的器件分成若干个时钟区域,以Virtex-6为例,Virtex-6的最小器件有6个区域,最大器件有18个区域。它与全局时钟不同,区域时钟信号X只能驱动限定的时钟区域。
在FPGA设计中,FPGA全局时钟路径需要专用的时钟缓冲和驱动,具有最小偏移和最大扇出能力,因此最好的时钟方案是由专用的全局时钟输入引脚驱动的单个主时钟,去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟,因为对于一个设计项目来说,全局时钟是最简单和最可预测的时钟。
在ISE设计全局时钟时,IBUFG、BUFG、BUFGMUX 等概念经常会被提及,这些资源可以统称为时钟资源,它们分为四类:全局时钟输入端口、全局时钟复用器、I/O时钟缓冲、水平时钟布线缓冲。下面挑选其中几个常见的资源种类,简单介绍下:
IBUFG:即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVPECL、LVTTL、PCI、 PCIX和SSTL等多种格式的IO标准。
IBUFGDS:是IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。IBUFG支持BLVDS、LDT、LVDSEXT、LVDS、LVPECL和ULVDS等多种格式的IO标准。
BUFG:是全局缓冲,它的输入是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。
BUFGCE:是带有时钟使能端的全局缓冲。它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出。
BUFGMUX:是全局时钟选择缓冲,它有I0和I1两个输入,一个控制端S,一个输出端O。当S为低电平时输出时钟为I0,反之为I1。需要指出的是BUFGMUX的应用十分灵活,I0和I1两个输入时钟甚至可以为异步关系。
BUFGP:相当于IBUG加上BUFG。
BUFGDLL:是全局缓冲延迟锁相环,相当于BUFG与DLL的结合。BUFGDLL在早期设计中经常使用,用以完成全局时钟的同步和驱动等功能。随着数字时钟管理单元(DCM)的日益完善,目前BUFGDLL的应用已经逐渐被DCM所取代。
DCM:即数字时钟管理单元,主要完成时钟的同步、移相、分频、倍频和去抖动等。DCM与全局时钟有着密不可分的联系,为了达到最小的延迟和 抖动,几乎所有的DCM应用都要使用全局缓冲资源。DCM可以用XilinxISE软件中的ArchitectureWizard直接生成。
以上为常用的时钟资源,对于一般的全局时钟系统设计,有这些资源就足够了。
2、全局时钟资源的使用方法
要组建一个全局时钟系统,首先要从全局时钟管脚输入一个时钟。有了这个时钟,就可以组建各种类型的全局时钟系统了。一般来说,常用的全局时钟系统有两种:IBUFG+BUFG 系统、IBUFG+DCM(PLL)+BUFG。
2.1、IBUFG+BUFG
IBUFG+BUFG方案如下图所示,这也是最基本的全局时钟系统。将时钟管脚输入的时钟作为IBUFG的输入,然后将IBUFG的输出再作为BUFG的输入,则BUFG的输出即为得到的全局时钟。IBUFG+BUFG的方案相当于BUFGP。
2.2、IBUFG+DCM(PLL)+BUFG
平时用得最多的还是IBUFG+DCM(PLL)+BUFG方案,如下图所示。将时钟管脚输入的时钟作为IBUFG的输入,然后将IBUFG的输出作为DCM(PLL)的输入,将经DCM(PLL)频率变换后的输出再作为BUFG的输入这种方案使用方法最为灵活,对全局时钟的控制更加有效。通过 DCM(PLL)模块不仅能对时钟进行同步、移相、分频、倍频等变换,而且可以使全局时钟的输出达到无抖动延迟(“0” skew)。
使用全局时钟资源可以直接用原语例化,也可以使用IP核。仔细观察了一下IP核产生的源文件,发现 IP核生成的就是3个原语的
组合;
3、全局时钟系统使用的问题与注意事项
1、全局时钟的时钟源必须从全局时钟管脚输入,并且要先经过IBUFG。
2、如果全局时钟涉及到逻辑运算,可以将BUFG换成BUFGCE(与)、BUFGMUX(二选一)等,事实上,BUFG、BUFGCE 等资源均是由 BUFGMUX 生成。
3、从BUFG输出的时钟,是不能直接连接普通I/O管脚输出的,会报错,若要将全局时钟输出,有两种方法:一是直接将BUFG的输入连接普通I/O管脚输出,或者将BUFG的输出经由ODDR2后再连接I/O管脚输出。需要注意的是,将CLOCK_DEDICATED_ROUTE属性设为FALSE虽然会将ERROR降为WARNING,但是这样时钟系统将不再是全局时钟系统,不建议这样做。
4、DCM(PLL)资源中有时钟反馈输入和时钟反馈输出管脚,一般的处理方法是将时钟反馈输出管脚经由BUFG后输入到时钟反馈输入管脚。
4、全局时钟系统使用举例
下面将举出实例,来看一下如何组建一个全局时钟系统。
某FPGA从全局时钟管脚引入频率为26M的晶振源,FPGA内部需要22MHz、22MHz反向、171.6MHz、36MHz,其中22MHz、22MHz反向、171.6MHz为FPGA内部使用,22MHz、36MHz经由普通I/O管脚输出,而且22MHz反向还要与信号t_rn作逻辑与运算,试给出该需求的全局时钟系统解决方案。
在ISE中组建时钟系统有两种方法:
1、用IP核生成器配置生成相应IP,再用线连接起来。
2、在文件中直接用语言配置生成各类资源(DCM、PLL、IBUFG、BUFG等),再用线连接。
第一种方法较为简单但灵活性差,而第二种方法稍微复杂但灵活性较强,可以随时修改,使用哪种方法取决于个人喜好。
4.1、生成 IP Core 方式
生成 IP Core 的方式,可以参考《Xilinx Spartan-6 使用 PLL IP 核》,在生成 Clock IP Core 后,我们打开 ipcore_dir 文件中的 pll_controller.v 文件,可以直观的看到:
1、全局时钟 CLK_IN1(来源于外部晶振) 作为 IBUGF 的输入,输出为 clkin1;
2、clkin1 作为 DCM 的输入,并根据配置进行分频、倍频、移相等操作;
3、在以 DCM 的输出为 BUFG 的输入,最后由 BUFG 输出指定的时钟;(如果输入时钟分频为2个不同时钟,那么这里用到 2 个 BUFG)
其实就和 2.2 节的过程一致;
4.2、原语调用方式
这里用第二种方法来生成上文需求的全局时钟系统,下图为最终效果图。
1、clk26为从全局时钟管脚输入的时钟源,从管脚输入后先经过一个IBUFG。
2、因为22MHz、171.6MHz和36MHz不能由一个PLL产生,故将IBUFG的输出时钟信号输入到两个PLL。
3、PLL0有三个输出:CLKOUT0、CLKOUT1、CLKOUT2,分别为22MHz、171.6MHz和22MHz反向。clk22_out为22MHz时钟的I/O输出信号,故不经BUFG直接输出;clk22为22MHz经过BUFG后的信号,为全局时钟信号;clk171p6为171.6MHz经过BUFG后的信号,为全局时钟信号;clk22_inv为22MHz反向经过BUFGCE(与t_rn作逻辑与运算)后的信号,为全局时钟信号
4、PLL1有一个输出:CLKOUT0,为36MHz,clk36_out为36MHz的I/O输出信号,故不经BUFG直接输出。
具体的原语调用的方式可以参考:
https://blog.csdn.net/Reborn_Lee/article/details/80393095
https://blog.csdn.net/phenixyf/article/details/14128875 等等文章;
相关参考文档:
https://blog.csdn.net/lg2lh/article/details/45220283
https://blog.csdn.net/phenixyf/article/details/14128875
https://blog.csdn.net/lg2lh/article/details/44997937
https://blog.csdn.net/github_33678609/article/details/53789063