Xilinx FPGA器件中时钟资源的说明以及使用

xilinx 时钟资源分为两种:全局时钟和第二全局时钟。

一、全局时钟资源

Xilinx 全局时钟采用全铜工艺实现,并设计了专用时钟缓冲与驱动结构,可以到达芯片内部任何一个逻辑单元,包括CLB、I/O引脚、内嵌RAM、硬核乘法器等,而且时延和抖动都很小。对FPGA设计而言,全局时钟是最简单最可预测的时钟,最好的时钟方案是:由专用的全局时钟输入引脚驱动单个全局时钟,并用后者去控制设计中的每个触发器。全局时钟资源是专用布线资源,存在与全铜布线层上,使用全局时钟资源不影响芯片的其他布线资源,因此在可以使用全局时钟的时候尽可能使用。

目前,主流芯片都集成了专用时钟资源、时钟管理模块(DCM)。以Virtex 5 为例,含有6个CMTs(Clock Management Tiles),每个CMTs包含2个DCM和一个PLL,1个DCM内包含2个DLL和一个PLL。

全局时钟资源需要通过原语(Primitives)调用,常见的时钟原语有:

  • IBUFG: Single-ended Input Global Clock Buffer
  • IBUFGDS: Differential Input Global Clock Buffer
  • BUFG: Global Clock Buffer
  • BUFGCE: Global Clock Buffer w/ Enable
  • DCM: DCM_ADV DCM_BASE

这些原语的使用在Language Templates都有示例,在user guide(v5对应为UG190)里也有详细说明。常用组合:

  • IBUFG / IBUFGDS + BUFG
    最基本的时钟使用方法。当信号从全局时钟引脚输入时,无论是否为时钟信号,都必须使用IBUFG/IBUFGDS;反之,如果使用了IBUFG/IBUFGDS,则信号必须从全局时钟引脚输入,否则布局布线会报错。 IBUFG/IBUFGDS的输入只与芯片的专用全局时钟输入引脚有物理连接,与普通的I/O和其他内部CLB没有物理连接,所以后面要加BUFG。

  • LOGIC + BUFG
    BUFG不仅可以驱动IBUFG的输出,还可以驱动普通信号(非时钟信号)的输出。当某个信号(时钟、使能、快速路径)的扇出非常大,要求抖动延迟最小时,可以使用BUFG驱动该信号,使该信号利用全局时钟资源。注意:普通I/O信号或片内信号进入BUFG到从BUFG输出,有大约10ns的固定时延,但是BUFG到片内所有单元的延时可以忽略为0ns。

  • IBUFG / IBUFGDS + DCM + BUFG
    更加灵活的控制时钟信号。通过DCM可以对时钟进行同步、移相、分频和倍频,而且可以使全局时钟的输出没有抖动延迟。

使用全局时钟资源可以直接用原语例化,也可以使用IP核。仔细观察了一下IP核产生的源文件,发现 IP核生成的就是这3个原语的组合:

module DCM_100M(CLKIN_IN,   
                RST_IN,   
                CLKIN_IBUFG_OUT,   
                CLK0_OUT,   
                CLK2X_OUT,   
                LOCKED_OUT);  
  
   input CLKIN_IN;  
   input RST_IN;  
   output CLKIN_IBUFG_OUT;  
   output CLK0_OUT;  
   output CLK2X_OUT;  
   output LOCKED_OUT;  
     
   wire CLKFB_IN;  
   wire CLKIN_IBUFG;  
   wire CLK0_BUF;  
   wire CLK2X_BUF;  
   wire GND_BIT;  
   wire [6:0] GND_BUS_7;  
   wire [15:0] GND_BUS_16;  
     
   assign GND_BIT = 0;  
   assign GND_BUS_7 = 7'b0000000;  
   assign GND_BUS_16 = 16'b0000000000000000;  
   assign CLKIN_IBUFG_OUT = CLKIN_IBUFG;  
   assign CLK0_OUT = CLKFB_IN;  

   IBUFG  CLKIN_IBUFG_INST (.I(CLKIN_IN),   
                           .O(CLKIN_IBUFG));  

   BUFG  CLK0_BUFG_INST (.I(CLK0_BUF),   
                        .O(CLKFB_IN));  

   BUFG  CLK2X_BUFG_INST (.I(CLK2X_BUF),   
                         .O(CLK2X_OUT));  

   DCM_ADV #( .CLK_FEEDBACK("1X"), 
                         .CLKDV_DIVIDE(2.0), 
                         .CLKFX_DIVIDE(1),   
                         .CLKFX_MULTIPLY(4), 
                         .CLKIN_DIVIDE_BY_2("FALSE"),   
                         .CLKIN_PERIOD(10.000),
                         .CLKOUT_PHASE_SHIFT("NONE"),       
                         .DCM_AUTOCALIBRATION("TRUE"), 
                         .DCM_PERFORMANCE_MODE("MAX_SPEED"),   
                         .DESKEW_ADJUST("SYSTEM_SYNCHRONOUS"), 
                         .DFS_FREQUENCY_MODE("LOW"),   
                         .DLL_FREQUENCY_MODE("LOW"), 
                         .DUTY_CYCLE_CORRECTION("TRUE"),   
                         .FACTORY_JF(16'hF0F0), 
                         .PHASE_SHIFT(0), 
                         .STARTUP_WAIT("FALSE"),   
                         .SIM_DEVICE("VIRTEX5") )
 DCM_ADV_INST (.CLKFB(CLKFB_IN),   
                         .CLKIN(CLKIN_IBUFG),   
                         .DADDR(GND_BUS_7[6:0]),   
                         .DCLK(GND_BIT),   
                         .DEN(GND_BIT),   
                         .DI(GND_BUS_16[15:0]),   
                         .DWE(GND_BIT),   
                         .PSCLK(GND_BIT),   
                         .PSEN(GND_BIT),   
                         .PSINCDEC(GND_BIT),   
                         .RST(RST_IN),   
                         .CLKDV(),   
                         .CLKFX(),   
                         .CLKFX180(),   
                         .CLK0(CLK0_BUF),   
                         .CLK2X(CLK2X_BUF),   
                         .CLK2X180(),   
                         .CLK90(),   
                         .CLK180(),   
                         .CLK270(),   
                         .DO(),   
                         .DRDY(),   
                         .LOCKED(LOCKED_OUT),   
                         .PSDONE());  
endmodule  

时钟从CLKIN_IN输入,经过IBUFG,输出为CLKIN_IBUFG,然后输入到DCM_ADV,输出为CLK0_BUF和 CLK2X_BUF,CLK0_BUF经过BUFG得到CLKFB_IN,一方面反馈到DCM的,另一方面也从CLK0_OUT输出;CLK2X_BUF 则经过BUFG后直接输出为CLK2X_OUT。

  • LOGIC + DCM + BUFG
    和前一种的区别在于DCM的输入是从内部输入还是外部输入。从外部输入则用IBUFG,保证时钟信号由芯片引脚输入;从内部输入则可以选择内部逻辑的任意信号,在FPGA内部是没有差分信号的,所有内部时钟信号都是单端信号。

二、第二全局时钟资源

第二全局时钟资源属于长线资源,长度和驱动能力仅次于全局时钟资源,也可以驱动芯片内部的任何一个逻辑,抖动和延时仅次于全局时钟。在设计中,一般将高频率、高扇出的时钟使能信号以及高速路径上的关键信号指定为全局第二时钟信号。使用全局时钟资源并不占用逻辑资源,也不影响其他布线资源;第二时钟资源占用的是芯片内部的资源,占用部分逻辑资源,各个部分的布线会相互影响,所以建议在设计中逻辑占用资源不超过70%时使用。

使用第二时钟资源:
可以在约束编辑器中的专用约束Misc选项中,指定所选信号使用低抖动延迟资源“Low Skew”来指定,也可以在ucf文件中添加“USELOWSKEWLINES"约束命令。比如:

NET "s1" USELOWSKEWLINES;  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • 来源:FPGA 时钟设计 1 —— 时钟资源总结 关于一款芯片,最权威、最新的资料当然是厂家的官方文件。很多大牛都...
    暗夜望月阅读 3,383评论 0 2
  • 目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高...
    我是嘻哈大哥阅读 837评论 0 0
  • 目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高...
    暗夜望月阅读 15,350评论 1 3
  • 以下三个是最经常被问到的,基本上属于介绍性的题目,无所谓正确答案,在我看来,这些不算真正的问题。 Discuss ...
    蜀湘情缘阅读 6,071评论 0 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,505评论 18 399