2.2 Xilinx FPGA时钟详述 |
![]() |
在Virtex-6 FPGA中,为了实现更好地控制时钟,时钟被分为若干个时钟区域,如图2-2所示为基于Bank划分的时钟模块和全局时钟架构。时钟架构可从水平方向和垂直方向进行划分,垂直方向包括五列:中间列,在中间列两侧的两个I/O列(IOCL和IOCR),外侧的I/O列IOOL(LX、LXT和SXT系列支持)和吉比特收发器GTX列(部分器件支持)。FPGA还包括若干时钟区域和时钟资源,为了进一步理解时钟架构,以下分别对时钟资源和术语进行说明。
图2-2 基于Bank划分的时钟模块和全局时钟架构
FPGA在水平方向以时钟区域为组织结构,单个时钟区域的高度为40个CLB,时钟域宽度为器件宽度的一半。如图2-3所示为XC6VLX75T FPGA的时钟区域示例。
图2-3 XC6VLX75T FPGA的时钟区域示例
用户在使用FPGA时对Bank(分组)和时钟区域的概念可能会混淆:在Virtex-6 FPGA中,每个Bank高度为40个I/O,因此一个Bank只在一个时钟区域内,但一个时钟区域可能包含多个Bank,例如,LX、LXT和SXT系列FPGA左侧有两个I/O列,因此每个时钟区域包括两个I/O Bank。每个FPGA被分为多个区域,不同型号器件的区域数量不同。FPGA中的时钟区域具有固定的尺寸,使得高端器件具有更多的时钟区域数量,如表2-2所示为Virtex-6 FPGA时钟区域和I/O Bank数量。
表2-2 Virtex-6 FPGA时钟区域和I/O Bank数量
另外,每个时钟区域中间有一个水平时钟行(HROW),包括12个水平时钟树、6个区域时钟(BUFR)和12个垂直时钟(BUFH)。
在Virtex-6 FPGA中,紧邻中间列右边的位置为CMT列,每个时钟区域对应一个CMT列,因此不同型号器件的CMT列包含的CMT数量不同。一个CMT包含两个MMCM,并包括32个垂直全局时钟树。CMT可以输出较低延迟的时钟,因此通常使用CMT来驱动全局时钟缓冲器以减少时钟分配延迟。
Virtex-6 FPGA有32根全局时钟线,对整个器件上的所有顺序资源(CLB、BlockRAM、DSPs和I/O)进行时钟控制。全局时钟线只能被BUFG驱动。
全局时钟引脚对分别位于IOCL和IOCR列中。Xilinx FPGA分成不同的Bank,在同一个Bank中所有引脚需遵循相同电平标准,因此为了满足不同Bank支持不同的I/O标准,每个Bank中包括4个GC引脚。
Clock-capable引脚位于I/O列中,每个I/O列中包括4个CC引脚,可以直接驱动区域时钟资源BUFR和BUFIO,每个Bank的4个CC中的2个可以连接到相邻区域的BUFIO中。
在FPGA设计中,为了满足同步逻辑设计,需要采用驱动能力较强的时钟资源和引脚进行逻辑模块和芯片的驱动。FPGA提供的全局时钟具有低抖动、低功耗和高扇出的时钟驱动能力,同时支持高频率时钟信号。Xilinx FPGA全局时钟路径具有专用的时钟缓冲和驱动,以提供具有最小偏移、最大扇出能力和可预测的时钟特性,同时具有专门的全局时钟引脚来驱动单个主时钟,并且可以驱动FPGA中的每个D触发器。全局时钟资源包括全局时钟输入(Global Clock Inputs)和全局时钟缓冲器(Global Clock Buffers)。
Virtex-6 FPGA中具有专门的全局时钟输入引脚,当不用作时钟输入时,可作为普通I/O引脚使用。全局时钟输入引脚可配置为任意I/O标准(包括差分I/O标准),并且支持单端或差分形式。当用作单端时钟输入时,全局时钟输入连接引脚的P端,此时N端不能作为其他单端时钟接入,但可作为普通I/O引脚使用;当用作时钟输出时,可配置为任意输出标准。全局时钟输入分布在内部I/O列的多个Bank中,可以灵活支持不同I/O标准。全局时钟输入缓冲器如表2-3所示。
表2-3 全局时钟输入缓冲器
IBUFG是全局时钟输入缓冲器,是与全局时钟输入引脚相连接的首级全局缓冲器。IBUFGDS是IBUFG的差分形式,当时钟信号从一对差分全局时钟引脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲器。实际应用FPGA开发时,全局时钟输入引脚连接到PCB上的单端或差分时钟,IBUFG和IBUFGDS再与全局时钟输入引脚互连。
IBUFG和IBUFGDS的使用与专用全局时钟输入引脚紧密相关,当某个信号从全局时钟引脚输入(不论它是否为时钟信号)时,都必须使用IBUFG或IBUFGDS。如果对某个信号使用了IBUFG或IBUFGDS硬件原语,则此信号必定是从全局时钟引脚输入的,若该信号未从全局时钟引脚输入,则ISE工具在布局布线时会报错。
全局时钟缓冲器用于将输入的时钟信号接入全局时钟网络,使得FPGA的内部资源都可以利用该时钟信号进行时序设计。全局时钟缓冲器允许各种时钟/信号资源接入全局时钟树和网络。可以驱动全局时钟缓冲器的源包括:
■ 全局时钟输入驱动器,包括IBUFG或IBUFGDS;
■ 位于中间I/O列,并在同一个时钟区域的Clock-capable输入;
■ 在器件同一边的CMT(包括MMCM)驱动BUFG;
■ 其他全局时钟缓冲器输出(BUFG);
■ 区域时钟缓冲器(BUFR);
■ I/O时钟输出的时钟信号,如吉比特收发器等。
与全局时钟资源相关的时钟原语可概括为如表2-4所示,其中IBUFG和IBUFGDS直接和全局时钟输入引脚相连,对I/O标准的支持在使用时需进行约束。BUFG、BUFGCE和BUFGMUX是在BUFGCTRL基础上配置的常用时钟缓冲器。
表2-4 全局时钟资源说明
与全局时钟资源相关的原语包括IBUFG、IBUFGDS、BUFGCTRL、BUFG、BUFGCE、BUFGMUX、BUFGMUX_CTRL和DCM等,对上述原语的详细介绍如下。
IBUFG是输入全局缓冲器,即全局时钟引脚的缓冲器。作为与全局时钟输入引脚连接的首级全局缓冲器,所有全局时钟输入引脚的输入信号必须通过IBUFG驱动内部信号,否则在ISE布局、布线过程中会报错。IBUFGDS是IBUFG的差分形式,当全局时钟输入引脚为差分形式时,使用IBUFGDS来驱动内部信号。IBUFG的VHDL原语如下所示。
BUFGCTRL是全局时钟缓冲器,所有全局时钟缓冲器(BUFG、BUFMUX和BUFGCE)都是基于BUFGCTRL的不同配置来实现的。BUFGCTRL基元如图2-4所示,包括2条输入线:I0和I1;4条输入选择线:S0、S1、CE0和CE1;2条附加控制线:IGNORE0和IGNORE1。通过这6条选择控制线来控制输入I0和I1,并实现两个异步时钟输入的切换。
图2-4 BUFGCTRL基元
BUFGCTRL输入信号的选择由“选择信号”(S0、CE0或S1、CE1)为高或低来决定,如果S或CE中的任一信号不为高,则不选择相对应的输入信号。在正常操作中,S和CE引脚对不会同时置高,通常选择一个引脚作为输入,另一个引脚固定为高。需要注意的是:S和CE信号的作用有所不同,当使用CE信号作为选择时钟时,时钟切换比使用S快一些;使用S信号使得输入信号之间的切换无须考虑建立/保持时间,进而不会导致锁存。BUFGCTRL输入选择真值表如表2-5所示。
表2-5 BUFGCTRL输入选择真值表
BUFGCTRL的时序图如图2-5所示。BUFGCTRL的Default状态为下降沿有效,在新的输入信号切换前输出信号保持为低。例如,当选择信号S0或S1信号从高变低后,输出信号一直保持为低,直到相应选择输入由高变低后,输出信号才输出新的时钟。BUFGCTRL的时钟沿敏感属性可以通过INIT_OUT的属性配置为上升沿敏感,同时也可以配置IGNORE属性,用于忽略MUX进行时钟输入切换时的切换条件判断。
BUFGCTRL的状态可以通过配置BUFGCTRL属性来改变,使用时可通过位置约束进行BUFGCTRL属性的配置。BUFGCTRL属性如表2-6所示。
图2-5 BUFGCTRL的时序图
表2-6 BUFGCTRL属性
BUFG是具有单个时钟输入和单个时钟输出的时钟缓冲器。BUFG作为IBUFG的输出,可以对FPGA内部的IOB、CLB等进行驱动。BUFG是基于BUFGCTRL特定配置的时钟缓冲器,如图2-6所示。
图2-6 基于BUFGCTRL生成的BUFG基元
BUFG的VHDL原语如下所示。
BUFGCE是具有1个时钟输入、1个时钟输出和1条时钟控制线(时钟使能)的全局时钟缓冲器。BUFGCE同样是基于BUFGCTRL配置而成的时钟缓冲器,BUFGCE基元如图2-7所示。
图2-7 基于BUFGCTRL配置而成的BUFCE基元
BUFGCE_1和BUFGCE除了切换条件不同之外,具有相同的结构和功能。如图2-8所示为BUFGCE和BUFGCE_1的时序图。其中,当CE信号为Low时,禁用时钟,BUFGCE在CE为Low时的下一个上升沿有效,并且输出保持Low;BUFGCE_1在CE为Low时的下一个下降沿有效,并且输出保持High。
图2-8 BUFGCE和BUFGCE_1的时序对比图
BUFGCE(BUFGCE_1)的VHDL原语如下所示。
BUFGMUX是具有2个时钟输入、1个输出引脚和1条时钟选择线的时钟缓冲器,BUFGMUX也是基于BUFGCTRL实现的,如图2-9所示。在FPGA中选择时钟信号时,为了避免产生毛刺,需采用同步和复位控制电路进行时钟选择。BUFGMUX缓冲器可以支持时钟选择,并能有效避免毛刺的产生,从而降低了逻辑设计的资源消耗。BUFGMUX使用CE作为选择引脚(选择切换时必须满足建立时间要求,否则可能导致毛刺),选择I0或I1输入时钟进行输出。
图2-9 基于BUFGCTRL配置而成的BUFGMUX
全局时钟选择缓冲器包括BUFGMUX和BUFGMUX_1,两者具有相同的结构和功能,不同之处如图2-10所示。BUFGMUX对下降沿敏感,并且在输入切换之前保持Low;BUFGMUX_1对上升沿敏感,并且在输入切换之前保持High。
图2-10 BUFGMUX和BUFGMUX_1的时序对比图
BUFGMUX(BUFGMUX_1)的VHDL原语如下所示。
BUFGMUX_CTRL是具有2个时钟输入、1个时钟输出和1条选择信号线的时钟缓冲器。不同于BUFGMUX,BUFGMUX_CTRL使用S引脚作为选择引脚。BUFGMUX_CTRL也是基于BUFGCTRL的,如图2-11所示。
图2-11 基于BUFGCTRL配置而成的BUFGMUX_CTRL
信号S需满足建立/保持时间要求,否则输入信号切换时输出信号会产生毛刺,但不会造成锁存。如图2-12所示为BUFGMUX_CTRL的时序图。例如,I0由高变低之前满足S的建立时间T BCCK _S要求,则输出对输入信号I0不会产生毛刺。在任何情况下,输出都会在较慢时钟(I0或I1)的3个时钟周期后变为新的时钟。
图2-12 BUFGMUX_CTRL的时序图
BUFGMUX_CTRL的VHDL原语如下所示。
全局时钟缓冲器的多种原语模型总结如表2-7所示。
表2-7 全局时钟缓冲器原语
续表
全局时钟资源的使用方法主要概括为5种,分别是IBUFG+BUFG、IBUFGDS+BUFG、IBUFG+DCM+BUFG、Logic+BUFG和Logic+DCM+BUFG。
■ IBUFG+BUFG
IBUFG和IBUFGDS作为全局时钟引脚输入使用。FPGA内部结构决定了IBUFG和IBUFGDS的输入端仅与FPGA的专用全局时钟输入引脚有物理连接,与普通I/O和其他内部CLB等没有物理连接。如图2-13所示,IBUFG+BUFG是最基本的全局时钟资源使用方法,通过连接BUFG可以提高全局时钟的驱动能力并保证较高的时钟信号质量。
图2-13 IBUFG + BUFG连接示意图
■ IBUFGDS+BUFG
当输入时钟信号为差分信号时,需要使用IBUFGDS代替IBUFG,如图2-14所示。
图2-14 IBUFGDS+BUFG连接示意图
■ IBUFG+DCM+BUFG
当时钟网络需要多种频率、相位和高质量时钟进行同步驱动时,将输入的主时钟接入DCM,不仅能对时钟进行同步、移相、分频和倍频等变换,而且可输出多个低抖动和低延迟的全局时钟,如图2-15所示,采用DCM使得对全局时钟的控制更加灵活有效。
图2-15 IBUFG+DCM+BUFG连接示意图
■ Logic+BUFG
BUFG不仅可以驱动IBUFG的输出,还可以驱动其他FPGA内部普通信号的输出,如图2-16所示。当某个信号(时钟、使能、快速路径)的扇出非常大,并且要求抖动延迟最小时,可以使用BUFG驱动该信号,使该信号到所驱动信号的路径最优。需要注意的是,普通I/O的输入或FPGA片内信号进入全局时钟布线层时会有一个固有延时,即普通I/O和片内信号从输入到BUFG输出都存在固有延时,但是BUFG的输出到片内所有资源(IOB、CLB、Block RAM)的延时可以忽略不计。
图2-16 Logic+BUFG连接示意图
■ Logic+DCM+BUFG
DCM同样也可以控制并变换普通时钟信号,即DCM的输入也可以是普通片内信号(内部时钟),如图2-17所示。通过DCM可以灵活地产生各种频率、相移信号,并接入BUFG提高信号输出的扇出能力。
图2-17 Logic+DCM+BUFG连接示意图
全局时钟资源用于对全局时钟网络进行驱动,其主要使用方法总结如表2-8所示。
表2-8 全局时钟资源主要使用方法总结
全局时钟资源在使用时需要在ISE工具中例化生成,全局时钟资源的例化方法可概括为以下两种。
■ 在程序中例化全局时钟资源,此方法只需编写代码或绘制原理图即可。在Xilinx设计工具ISE中提供了时钟原语,用户可以在Template中直接调用。
■ 通过综合阶段约束或实现阶段的约束完成对全局时钟资源的调用,此方法根据综合工具和布局布线工具的不同而异。大多数综合工具会自动分析时钟信号的扇出数目,在全局时钟资源富裕的情况下,将扇出数目最大的信号自动指定使用全局时钟资源,此时用户需检查综合结果是否满足上述使用原则。例如,某个信号的扇出很大,因此ISE综合器会自动指定使用IBUFG、IBUFGDS等全局时钟资源,但该信号未从专用全局时钟引脚输入,则在布局布线时会报错。
在FPGA的设计中,全局时钟网络和资源可以提供低抖动、高扇出的时钟输出,为FPGA内部的主要逻辑和互联提供稳定时钟,但全局时钟资源有限,且无法实现时钟区域(如单个逻辑模块中)内时钟的精确控制,因此提出了区域时钟的概念。
时钟区域是指高度为40个I/O和40个CLB,宽度为芯片宽度一半(或为左半区域,或为右半区域)的区域,Virtex-6 FPGA中有6~18个时钟区域,在每个区域中间包括一个水平时钟行(Horizontal Clock Row,HROW)。在时钟区域中包括区域时钟网络和多种区域时钟资源,在Virtex-6 FPGA中,每个时钟区域最多有8个差分区域时钟缓冲器(Differential Regional Clock Buffer )和6条区域时钟布线资源。如图2-18所示,每个I/O Bank包含在一个时钟区域中,每个Bank包括4个Clock-capable时钟输入(CCIO),每个输入可以单独或差分驱动4个I/O时钟(BUFIO),区域时钟可以驱动本区域及其上下区域内的所有时钟目标端。
图2-18 区域时钟示意
区域时钟中主要的时钟资源包括CCIO,BUFR,BUFIO,BUFH和区域时钟网等。区域时钟资源的使用可以为时钟区域提供低抖动和高性能时钟网络,避免了使用有限的全局时钟资源,同时区域时钟资源更适合于源同步接口设计。
区域时钟网络不依赖于全局时钟,它通过内部的区域时钟资源和布线,为时钟区域内的设计提供了更精细化的时钟驱动控制。Virtex-6 FPGA中的区域时钟资源和布线包括如下组件和通路:
■ Clock-capable I/O——CCIO;
■ 区域时钟网——Regional Clock Net;
■ I/O时钟缓冲器——BUFIO;
■ 区域时钟缓冲器——BUFR;
■ 水平时钟缓冲器——BUFH;
CCIO是与附近时钟区域具有特殊硬件连接的普通I/O引脚对,在Virtex-6 FPGA中,每个I/O Bank中包括4个CCIO对。当CCIO作为时钟输入时,可以驱动BUFR和BUFIO,其中内部I/O列中的CCIO可以驱动MMCM和BUFG的时钟输入,当CCIO用于驱动MMCM时,CCIO必须在MMCM所在位置的左侧或右侧的同一个时钟区域/Bank。与使用全局时钟引脚驱动MMCM相比,通过CCIO驱动MMCM的路径具有更好的质量。需要注意的是,当使用CCIO作为单端时钟引脚时,需使用CCIO引脚对的P端。
区域时钟的布线资源主要为6个(Virtex-6系列)独立的区域时钟网,如图2-19所示。区域时钟网的跨度仅限于一个时钟区域,可以为时钟区域提供低功耗和低歪斜时钟,并且当所有逻辑资源都使用时,时钟网可以进行负载/扇出管理;接入区域时钟网时需通过区域时钟缓冲器BUFR(使用前需例化)。BUFR可以驱动多个区域时钟,在芯片中间位置的1个BUFR最多可以驱动3个区域时钟,即当前区域时钟和上/下相邻的区域时钟;在芯片顶/底部位置的BUFR最多可以驱动2个区域时钟,即当前区域时钟和相邻上或下区域时钟。
图2-19 区域时钟网示意图
与区域时钟资源相关的时钟原语如表2-9所示。
表2-9 区域时钟资源说明
与区域时钟资源相关的原语包括BUFIO、BUFR和BUFH,每种原语的详细介绍如下。
BUFIO是驱动I/O列内部时钟网(独立于全局时钟网络)的时钟缓冲器,它通过在同一个时钟域的CCIO进行驱动。在一个时钟域中,每个Bank包括4个BUFIO,每个BUFIO可以驱动同一个时钟域的单个I/O时钟网络,其中2个BUFIO可以驱动上/下相邻时钟区域的I/O时钟网。需要注意的是,BUFIO不能直接驱动逻辑资源(如CLB、Block RAM、DSP等),因为I/O时钟网络仅能覆盖同一个Bank或上/下相邻Bank的I/O列,BUFIO必须连接BUFR才可以驱动时钟域内的其他资源。
BUFIO是一个区域时钟输入/输出缓冲器,在输入和输出之间存在相位延迟,BUFIO基元如图2-20所示。
图2-20 BUFIO基元
BUFIO的VHDL原语如下所示。
BUFR是另一种区域时钟缓冲器,它可以将时钟信号驱动到时钟区域的专用时钟网(独立于全局时钟树),每个BUFR可以驱动同一个时钟区域的6个区域时钟网和相邻时钟区域的6个区域时钟网。Virtex-6 FPGA内部最多包括4个I/O列,每个时钟区域最多有2个时钟Bank,每个Bank中包括2个BUFR。Virtex-6 FPGA中,BUFR可以直接驱动MMCM时钟输入和BUFG,同时,BUFR(区别于BUFIO)可以直接驱动同一个或相邻区域的I/O和逻辑资源。另外,BUFR可以根据时钟输入生成分频时钟输出,分频系数为从1到8的整数。
BUFR可以通过如下资源或组件进行驱动:
■ CCIO;
■ Local interconnect (本地互连);
■ MGT;
■ MMCM。
BUFR是一个具有时钟分频的时钟输入/输出缓冲器,BUFR基元如图2-21所示。
图2-21 BUFR基元
BUFR基元的接口列表和说明如表2-10所示,其中CLR完成异步分频逻辑的清除。
表2-10 BUFR基元的接口列表和说明
BUFR的分频功能是通过BUFR_DIVIDE属性来确定的,使用时可以通过软件设置或BUFR在例化时修改BUFR_DIVIDE属性得到所需的分频时钟输出。需要注意的是,BUFR_DIVIDE的不同属性值会造成不同的分频输出延迟。BUFR_DIVIDE属性说明如表2-11所示。
表2-11 BUFR_DIVIDE属性说明
BUFR的VHDL原语如下所示。
BUFH是用于驱动时钟区域中全局时钟树的区域时钟缓冲器,每个BUFH同时包括一个时钟使能引脚(CE),该使能可控制时钟输出的动态开关。BUFH和BUFHCE基元如图2-22所示。
BUFH可以通过如下资源或组件进行驱动:
■ 同一个时钟域的MMCM输出;
■ BUFG输出;
■ 本地互连;
■ 水平时钟区域相邻Bank(左/右)的CCIO引脚。
图2-22 BUFH和BUFCE基元
Virtex-6 FPGA中的时钟区域中间包括一条水平全局时钟树(HROW),在每个时钟域中包括12个BUFH,用于驱动此时钟区域中的水平全局时钟树,如图2-23所示。
图2-23 BUFH在时钟区域中的示意图
由图2-23可知,在使用BUFH时需要两个时钟域的逻辑相邻。而CE信号可以实现时钟的完全关闭。与BUFG驱动相邻的时钟域实现低抖动和功耗相比,BUFH在低功耗方面具有更好的性能。用户在进行设计时,如果部分逻辑模块(逻辑资源需在同一个时钟区域)是间断性运行的,接入该模块的全局时钟可通过BUFH进行驱动,在该模块无须工作时控制CE信号禁止输出,从而降低器件的功耗。
BUFH的VHDL原语如下所示。
BUFHCE的VHDL原语如下所示。
区域时钟缓冲器的原语总结如表2-12所示。
表2-12 区域时钟缓冲器原语
区域时钟资源具有不同的用法,主要包括BUFIO和BUFR的使用。
BUFIO驱动I/O列内独立于全局时钟资源的专门时钟网,因此BUFIO非常适用于源同步的数据采集,即CCIO通过BUFIO驱动I/O列中的时钟网络,对同一个区域时钟内的I/O信号进行采样,从而达到以最小的延时采样相关信号的目的。
如图2-24所示,BUFIO使用CCIO驱动I/O逻辑,这种模式适合于源同步实现方案,其时钟用于输入数据的采样。
图2-24 BUFIO应用示例
CCIO可以采样的I/O均分布在其周围,且属于同一个时钟区域的信号;在PCB上,这些I/O(包括CC)具有相似的布线轨迹和区域,使用CCIO对这些信号采样,可以得到最大的眼图。
BUFR可以直接驱动同一个或相邻区域的I/O和逻辑资源(如CLK、Block RAM等),同时可以根据时钟输入生成分频时钟输出,这一功能可与可编程I/O中的Serializer/Deserializer(串行器/解串器)相配合,实现源同步资源系统设计,无须额外的逻辑资源即可跨越时钟域,如图2-25所示。
图2-25 BUFR应用示例
区域时钟资源原语(主要包括BUFIO,UFR和BUFH)在使用前必须例化,其例化可以通过直接调用原语生成,ISE软件中提供了所有时钟原语,用户在Template中直接调用即可。在例化时需注意输入/输出的接口种类,例如,BUFIO只能由CCIO驱动,输出只能用于驱动I/O时钟网络等。
由于区域时钟资源只作用于本时钟区域或相邻时钟区域(BUFR),所以在使用区域时钟原语进行时钟驱动和管理时,应注意其位置应和所驱动信号在相同区域,因此需要对所调用的时钟原语进行位置约束。如图2-26所示为时钟区域中的区域时钟资源示意,详细说明可参考Virtex-6器件手册。当调用区域时钟资源对该区域进行时钟管理时,需调用该区域的区域时钟原语,同时对BUFIO和BUFH进行位置约束。
图2-26 区域时钟资源位置示意图