赞
踩
目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高的要求。为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时钟,以达到最低的时钟抖动和延迟。 FPGA 全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小。为了适应复杂设计的需要,Xilinx的FPGA中集成的专用时钟资源与数字延迟锁相环(DLL)的数目不断增加,最新的 Virtex II器件最多可以提供16个全局时钟输入端口和8个数字时钟管理模块(DCM)。
FPGA全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小。然后将那些原语分为两类:1,缓冲。2,驱动。
缓冲:就是输入缓冲或者输出缓冲,这些缓冲主要用来片外输入时钟或者片外差分输入的信号处理,因为FPGA有对时钟的专门资源,同时也要保证时钟的精准,有效解决颤抖、延迟等问题,另外就是差分信号(包括差分时钟)进入片内之后不经过IBUFGDS、IBUFDS缓冲无法直接处理。另外对于时钟来说,时钟引脚的输入只能接IBUGDS缓冲器,IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。如果不用原语链接这两部分时钟信号无法到达芯片内部的CLB等资源,也就是无法使用。(补充:IBUGDS和时钟输入引脚为对应的,也就是IBUGDS的输入必须为时钟引脚,时钟引脚必须链接IBUFGDS。这段中IBUFGDS 也可以换成IBUFG) 对了还有一个OBUFDS就是差分输出缓冲。
驱动:驱动在时钟约束部分说过,当信号扇出过大是可以通过加BUFG来增加稳定性,这里的BUFG就是全局缓冲,以BUFG为例,该原语的输入信号可以是IBUFGDS的输出也可以是逻辑信号的输出(内部信号),但是过一次BUFG有大约10ns的延时,但是通过BUFG之后输出到片内所有单元的延时可以忽略不计,另外一个典型的TTL逻辑门最多有10个扇出信号,而缓冲器可以驱动20到30个扇出信号,在这里可以理解为反相器,反相器一般情况下扇出较大。
一般情况下IBUFGDS+BUFG或者IBUFG+BUFG可配套使用,当全局时钟扇出较少的时候可以不加BUFG。
与全局时钟资源相关的原语常用的与全局时钟资源相关的Xilinx器件原语包括:IBUFG、IBUFGDS、BUFG、BUFGP、BUFGCE、BUFGMUX、BUFGDLL和DCM等
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可以用Xilinx ISE软件中的Architecture Wizard直接生成。
输出缓冲器,用于将输出信号驱动到FPGA器件引脚,这些引脚不需要是三态的(恒定驱动)。 必须将OBUF,OBUFT,OBUFDS或OBUFTDS连接到设计中的每个输出端口。该元件隔离内部电路并为离开芯片的信号提供驱动电流。 它存在于输入/输出块(IOB)中。 其输出(O)连接到OPAD或IOPAD。
(1)IBUFG + BUFG的使用方法:
IBUFG后面连接BUFG的方法是最基本的全局时钟资源使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。
(2)IBUFGDS + BUFG的使用方法:
当输入时钟信号为差分信号时,需要使用IBUFGDS代替IBUFG。
(3)IBUFG + DCM + BUFG的使用方法:
这种使用方法最灵活,对全局时钟的控制更加有效。通过DCM模块不仅仅能对时钟进行同步、移相、分频和倍频等变换,而且可以使全局时钟的输出达到无抖动延迟。
(4)Logic + BUFG的使用方法:
BUFG不但可以驱动IBUFG的输出,还可以驱动其它普通信号的输出。当某个信号(时钟、使能、快速路径)的扇出非常大,并且要求抖动延迟最小时,可以使用BUFG驱动该信号,使该信号利用全局时钟资源。但需要注意的是,普通IO的输入或普通片内信号进入全局时钟布线层需要一个固有的延时,一般在 10ns左右,即普通IO和普通片内信号从输入到BUFG输出有一个约10ns左右的固有延时,但是BUFG的输出到片内所有单元(IOB、CLB、选择性块RAM)的延时可以忽略不计为“0”ns。
(5) Logic + DCM + BUFG的使用方法:
DCM同样也可以控制并变换普通时钟信号,即DCM的输入也可以是普通片内信号。使用全局时钟资源的注意事项全局时钟资源必须满足的重要原则是:使用 IBUFG或IBUFGDS的充分必要条件是信号从专用全局时钟管脚输入。换言之,当某个信号从全局时钟管脚输入,不论它是否为时钟信号,都必须使用 IBUFG或IBUFGDS;如果对某个信号使用了IBUFG或IBUFGDS硬件原语,则这个信号必定是从全局时钟管脚输入的。如果违反了这条原则,那么在布局布线时会报错。这条规则的使用是由FPGA的内部结构决定的:IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。另外,由于BUFGP相当于IBUFG和BUFG的组合,所以BUFGP的使用也必须遵循上述的原则。
全局时钟资源的例化方法大致可分为两种:
(1)在程序中使用原语直接例化全局时钟资源;
(2)通过综合阶段约束或者实现阶段约束实现对全局时钟资源的使用;
第一种方法比较简单,用户只需按照前面讲述的5种全局时钟资源的基本使用方法编写代码或者绘制原理图即可。
第二方法是通过综合阶段约束或实现阶段的约束完成对全局时钟资源的调用,这种方法根据综合工具和布局布线工具的不同而异。
下面详细说明:
IBUFDS:Differential Signaling Input Buffer with Selectable I/O Interface //差分输入时钟缓冲器
IBUFDS是一个输入缓冲器,支持低压差分信号(如LVCMOS、LVDS等)。在IBUFDS中,一个电平接口用两个独特的电平接口(I和IB)表示。一个可以认为是主信号,另一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是相位相反。
- IBUFDS instance_name (.O (user_O),
- .I (user_I),
- .IB (user_IB));
IBUFGDS
Dedicated(专用的) Differential Signaling Input Buffer with Selectable I/O Interface //专用差分输入时钟缓冲器
IBUFGDS是一个连接时钟信号BUFG或DCM的专用的差分信号输入缓冲器。在IBUFGDS中,一个电平接口用两个独立的电平接口(I和IB)表示。一个可以认为是主信号,另一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是相位相反。
- IBUFGDS instance_name (.O (user_O),
- .I (user_I),
- .IB (user_IB));
OBUFDS
Differential Signaling Output Buffer with Selectable I/O Interface//差分输出时钟缓冲器
OBUFDS是一个输出缓冲器,支持低压差分信号。OBUFDS隔离出了内电路并向芯片上的信号提供驱动电流。它的输出用O和OB两个独立接口表示。一个可以认为是主信号,另一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是,相位相反。
- OBUFDS instance_name (.O (user_O),
- .OB (user_OB),
- .I (user_I));
例如FPGA的时钟有外部晶振提供,我内部处理需要多个频率的时钟,这时候也许需要使用多个分频器(PLL,或MMCM等),外部晶振进来的时钟不能驱动多个PLL(两个都不能),我们需要使用IBUFG或IBUFGDS原语,外部时钟是单端的就用IBUFG,如果是差分的,就用IBUFGDS之后在驱动各个PLL,(也就是作为PLL的输入),就没有问题。
上面所说的也就是一个时钟上树问题,上全局时钟树,让输入时钟信号变得驱动能力强,产生的时钟偏斜小,抖动小。IBUFG,IBUFGDS
BUFG叫 Global Clock Simple Buffer,自然和时钟有关,它的作用是使经过这个Buffer的信号能够具有高扇出,驱动能力强的能力,使信号接入全局布线资源,使得信号具有低偏斜的特性;既然是一个时钟buffer,当然时钟信号首当其冲,但不仅仅局限于此,还可以是复位,置位以及时钟使能等需要具有高扇出的信号。
但这个buffer必须需要组合使用,不需要你在Verilog设计中去例化。
一般情况下IBUFGDS+BUFG或者IBUFG+BUFG可配套使用,当全局时钟扇出较少的时候可以不加BUFG。
一般FPGA的输入时钟(一般来自晶振)先经过IBUFGDS,之后的BUFG可以根据综合工具进行推断是否组合使用。IBUFGDS需要自己例化,例如:
- IBUFG #(
- .IBUF_LOW_PWR("TRUE"), // Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
- .IOSTANDARD("LVCMOS18") // Specify the input I/O standard
- ) IBUFG_inst (
- .O(fpga_clk), // Clock buffer output
- .I(fpga_clk1) // Clock buffer input (connect directly to top-level port)
- );
上面都是讲的时钟信号,那非时钟信号呢?有时候也会有一些需求,例如AD采样出来的数据是差分数据,我需要转换为单端信号在FPGA内部进行数据处理,我就需要差分转单端的Buffer,例如:
- generate
- genvar j;
- for(j=0;j<10;j=j+1): ibufds10
- begin
- IBUFDS ibufds_inst1
- (
- .I(ad1_bp[j]),
- .IB(ad1_bn[j]),
- .O(ad_data_b[j])
- );
- end
- endgenerate
IBUFDS这个原语是针对信号的,能够改善信号完整性,使用这个原语的原因在于差分信号在片内不经过这个原语不能直接处理。我们平时使用的selectIO IP核的信号输入也可以是差分的,其实内部也用到了这些原语
1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。
2.未经原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。
下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。