xilinx 時(shí)鐘資源分為兩種:全局時(shí)鐘和第二全局時(shí)鐘。
一揩瞪、全局時(shí)鐘資源
Xilinx 全局時(shí)鐘采用全銅工藝實(shí)現(xiàn)嗤攻,并設(shè)計(jì)了專用時(shí)鐘緩沖與驅(qū)動(dòng)結(jié)構(gòu),可以到達(dá)芯片內(nèi)部任何一個(gè)邏輯單元颜启,包括CLB口猜、I/O引腳须尚、內(nèi)嵌RAM撩轰、硬核乘法器等,而且時(shí)延和抖動(dòng)都很小。對FPGA設(shè)計(jì)而言寂玲,全局時(shí)鐘是最簡單最可預(yù)測的時(shí)鐘,最好的時(shí)鐘方案是:由專用的全局時(shí)鐘輸入引腳驅(qū)動(dòng)單個(gè)全局時(shí)鐘漱凝,并用后者去控制設(shè)計(jì)中的每個(gè)觸發(fā)器愕乎。全局時(shí)鐘資源是專用布線資源,存在與全銅布線層上,使用全局時(shí)鐘資源不影響芯片的其他布線資源,因此在可以使用全局時(shí)鐘的時(shí)候盡可能使用。
目前凿可,主流芯片都集成了專用時(shí)鐘資源屋确、時(shí)鐘管理模塊(DCM)呜投。以Virtex 5 為例,含有6個(gè)CMTs(Clock Management Tiles)袍冷,每個(gè)CMTs包含2個(gè)DCM和一個(gè)PLL你雌,1個(gè)DCM內(nèi)包含2個(gè)DLL和一個(gè)PLL苫昌。
全局時(shí)鐘資源需要通過原語(Primitives)調(diào)用,常見的時(shí)鐘原語有:
- 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對應(yīng)為UG190)里也有詳細(xì)說明闯睹。常用組合:
IBUFG / IBUFGDS + BUFG
最基本的時(shí)鐘使用方法酷宵。當(dāng)信號(hào)從全局時(shí)鐘引腳輸入時(shí),無論是否為時(shí)鐘信號(hào)煌抒,都必須使用IBUFG/IBUFGDS;反之况既,如果使用了IBUFG/IBUFGDS,則信號(hào)必須從全局時(shí)鐘引腳輸入,否則布局布線會(huì)報(bào)錯(cuò)匙瘪。 IBUFG/IBUFGDS的輸入只與芯片的專用全局時(shí)鐘輸入引腳有物理連接,與普通的I/O和其他內(nèi)部CLB沒有物理連接蝶缀,所以后面要加BUFG丹喻。LOGIC + BUFG
BUFG不僅可以驅(qū)動(dòng)IBUFG的輸出,還可以驅(qū)動(dòng)普通信號(hào)(非時(shí)鐘信號(hào))的輸出翁都。當(dāng)某個(gè)信號(hào)(時(shí)鐘碍论、使能、快速路徑)的扇出非常大柄慰,要求抖動(dòng)延遲最小時(shí)鳍悠,可以使用BUFG驅(qū)動(dòng)該信號(hào),使該信號(hào)利用全局時(shí)鐘資源坐搔。注意:普通I/O信號(hào)或片內(nèi)信號(hào)進(jìn)入BUFG到從BUFG輸出藏研,有大約10ns的固定時(shí)延,但是BUFG到片內(nèi)所有單元的延時(shí)可以忽略為0ns概行。IBUFG / IBUFGDS + DCM + BUFG
更加靈活的控制時(shí)鐘信號(hào)蠢挡。通過DCM可以對時(shí)鐘進(jìn)行同步、移相凳忙、分頻和倍頻业踏,而且可以使全局時(shí)鐘的輸出沒有抖動(dòng)延遲。
使用全局時(shí)鐘資源可以直接用原語例化涧卵,也可以使用IP核勤家。仔細(xì)觀察了一下IP核產(chǎn)生的源文件,發(fā)現(xiàn) IP核生成的就是這3個(gè)原語的組合:
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
時(shí)鐘從CLKIN_IN輸入柳恐,經(jīng)過IBUFG伐脖,輸出為CLKIN_IBUFG,然后輸入到DCM_ADV胎撤,輸出為CLK0_BUF和 CLK2X_BUF晓殊,CLK0_BUF經(jīng)過BUFG得到CLKFB_IN,一方面反饋到DCM的伤提,另一方面也從CLK0_OUT輸出巫俺;CLK2X_BUF 則經(jīng)過BUFG后直接輸出為CLK2X_OUT。
-
LOGIC + DCM + BUFG
和前一種的區(qū)別在于DCM的輸入是從內(nèi)部輸入還是外部輸入肿男。從外部輸入則用IBUFG介汹,保證時(shí)鐘信號(hào)由芯片引腳輸入却嗡;從內(nèi)部輸入則可以選擇內(nèi)部邏輯的任意信號(hào),在FPGA內(nèi)部是沒有差分信號(hào)的,所有內(nèi)部時(shí)鐘信號(hào)都是單端信號(hào)窍荧。
二栖袋、第二全局時(shí)鐘資源
第二全局時(shí)鐘資源屬于長線資源,長度和驅(qū)動(dòng)能力僅次于全局時(shí)鐘資源撼港,也可以驅(qū)動(dòng)芯片內(nèi)部的任何一個(gè)邏輯,抖動(dòng)和延時(shí)僅次于全局時(shí)鐘骤竹。在設(shè)計(jì)中帝牡,一般將高頻率、高扇出的時(shí)鐘使能信號(hào)以及高速路徑上的關(guān)鍵信號(hào)指定為全局第二時(shí)鐘信號(hào)蒙揣。使用全局時(shí)鐘資源并不占用邏輯資源靶溜,也不影響其他布線資源;第二時(shí)鐘資源占用的是芯片內(nèi)部的資源懒震,占用部分邏輯資源罩息,各個(gè)部分的布線會(huì)相互影響,所以建議在設(shè)計(jì)中邏輯占用資源不超過70%時(shí)使用个扰。
使用第二時(shí)鐘資源:
可以在約束編輯器中的專用約束Misc選項(xiàng)中瓷炮,指定所選信號(hào)使用低抖動(dòng)延遲資源“Low Skew”來指定,也可以在ucf文件中添加“USELOWSKEWLINES"約束命令锨匆。比如:
NET "s1" USELOWSKEWLINES;