时序分析/约束——Xilinx时钟资源 & ISE时序分析器
 
- UID
- 1029342
- 性别
- 男
|

时序分析/约束——Xilinx时钟资源 & ISE时序分析器
1. Xilinx 时钟资源
xilinx 时钟资源分为两种:全局时钟和第二全局时钟。
1. 全局时钟资源
Xilinx全局时钟采用全铜工艺实现,并设计了专用时钟缓冲与驱动结构,可以到达芯片内部任何一个逻辑单元,包括CLB、I/O引脚、内嵌RAM、硬核乘法器等,而且时延和抖动都很小。对FPGA设计而言,全局时钟是最简单最可预测的时钟,最好的时钟方案是:由专用的全局时钟输入引脚驱动单个全局时钟,并用后者去控制设计中的每个触发器。全局时钟资源是专用布线资源,存在与全铜布线层上,使用全局时钟资源不影响芯片的其他布线资源,因此在可以使用全局时钟的时候尽可能使用。
目前,主流芯片都集成了专用时钟资源、时钟管理模块(DCM)。以Virtex 5 为例,含有6个CMTs(ClockManagement Tiles),每个CMTs包含2个DCM和一个PLL,1个DCM内包含2个DLL和一个PLL。
全局时钟资源需要通过原语(Primitives)调用,常见的时钟原语有:
IBUFG: Single-ended Input GlobalClock Buffer
IBUFGDS: Differential InputGlobal Clock Buffer
BUFG: Global Clock Buffer
BUFGCE: Global Clock Buffer w/Enable
DCM: DCM_ADV DCM_BASE
这些原语的使用在Language Templates都有示例,在userguide(v5对应为UG190)里也有详细说明。常用组合:
- IBUFG / IBUFGDS + BUFG最基本的时钟使用方法。当信号从全局时钟引脚输入时,无论是否为时钟信号,都必须使用IBUFG/IBUFGDS;反之,如果使用了IBUFG/IBUFGDS,则信号必须从全局时钟引脚输入,否则布局布线会报错。IBUFG/IBUFGDS的输入只与芯片的专用全局时钟输入引脚有物理连接,与普通的I/O和其他内部CLB没有物理连接,所以后面要加BUFG。
- LOGIC + BUFGBUFG不仅可以驱动IBUFG的输出,还可以驱动普通信号(非时钟信号)的输出。当某个信号(时钟、使能、快速路径)的扇出非常大,要求抖动延迟最小时,可以使用BUFG驱动该信号,使该信号利用全局时钟资源。注意:普通I/O信号或片内信号进入BUFG到从BUFG输出,有大约10ns的固定时延,但是BUFG到片内所有单元的延时可以忽略为0ns。
- IBUFG / IBUFGDS + DCM + BUFG更加灵活的控制时钟信号。通过DCM可以对时钟进行同步、移相、分频和倍频,而且可以使全局时钟的输出没有抖动延迟。
使用全局时钟资源可以直接用原语例化,也可以使用IP核。仔细观察了一下IP核产生的源文件,发现IP核生成的就是这3个原语的组合:
[plain] viewplaincopy & ISE时序分析器【转】" height="12" width="12"> & ISE时序分析器【转】" height="12" width="12">
- 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内部是没有差分信号的,所有内部时钟信号都是单端信号。
|
|
|
|
|
|