1. Xilinx 時(shí)鐘資源
xilinx 時(shí)鐘資源分為兩種:全局時(shí)鐘和第二全局時(shí)鐘。
1. 全局時(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)都很小。對(duì)FPGA設(shè)計(jì)而言,全局時(shí)鐘是最簡(jiǎn)單最可預(yù)測(cè)的時(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í)鐘資源需要通過(guò)原語(yǔ)(Primitives)調(diào)用,常見的時(shí)鐘原語(yǔ)有:
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
這些原語(yǔ)的使用在Language Templates都有示例,在user guide(v5對(duì)應(yīng)為UG190)里也有詳細(xì)說(shuō)明。常用組合:
IBUFG / IBUFGDS + BUFG
最基本的時(shí)鐘使用方法。當(dāng)信號(hào)從全局時(shí)鐘引腳輸入時(shí),無(wú)論是否為時(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)。通過(guò)DCM可以對(duì)時(shí)鐘進(jìn)行同步、移相、分頻和倍頻,而且可以使全局時(shí)鐘的輸出沒有抖動(dòng)延遲。
使用全局時(shí)鐘資源可以直接用原語(yǔ)例化,也可以使用IP核。仔細(xì)觀察了一下IP核產(chǎn)生的源文件,發(fā)現(xiàn) IP核生成的就是這3個(gè)原語(yǔ)的組合:
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)過(guò)IBUFG,輸出為CLKIN_IBUFG,然后輸入到DCM_ADV,輸出為CLK0_BUF和CLK2X_BUF,CLK0_BUF經(jīng)過(guò)BUFG得到CLKFB_IN,一方面反饋到DCM的,另一方面也從CLK0_OUT輸出;CLK2X_BUF則經(jīng)過(guò)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)。
Google到一篇不錯(cuò)的博客:如何正確使用FPGA的時(shí)鐘資源
2. 第二全局時(shí)鐘資源
第二全局時(shí)鐘資源屬于長(zhǎng)線資源,長(zhǎng)度和驅(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ì)中邏輯占用資源不超過(guò)70%時(shí)使用。
使用第二時(shí)鐘資源:可以在約束編輯器中的專用約束Misc選項(xiàng)中,指定所選信號(hào)使用低抖動(dòng)延遲資源“Low Skew”來(lái)指定,也可以在ucf文件中添加“USELOWSKEWLINES"約束命令。比如:
NET "s1" USELOWSKEWLINES;
2. ISE時(shí)序分析器
單擊Design Summary中的Static Timing就可以啟動(dòng)時(shí)序分析器(Timing Analyzer)。在綜合、布局布線階段ISE就會(huì)估算時(shí)延,給出大概的時(shí)延和所能達(dá)到的最大時(shí)鐘頻率,經(jīng)過(guò)PAR后,在Static Timing中給出的是準(zhǔn)確的時(shí)延,給出的時(shí)序報(bào)告可以幫助我們找到關(guān)鍵路徑,然后針對(duì)其進(jìn)行優(yōu)化,提高系統(tǒng)的時(shí)鐘頻率。
造成時(shí)序性能差的原因很多,主要分為3種:
1. 布局太差
一般和代碼本身沒有關(guān)系。解決方案:只能從軟件自身的布局算法考慮(調(diào)整布局的努力程度)或者使用高端芯片
2. 邏輯級(jí)數(shù)太多
邏輯級(jí)數(shù)越多,資源的利用率越高,但是對(duì)工作頻率的影響也越大。解決方案:1.使用流水線技術(shù);2.如果是多周期路徑,添加多周期約束;3.良好的編碼習(xí)慣,不要過(guò)多嵌套if-else,盡量使用case代替if語(yǔ)句。
3. 信號(hào)扇出過(guò)高
高扇出會(huì)造成信號(hào)傳輸路徑過(guò)長(zhǎng),從而降低時(shí)序性能。解決方案:1.邏輯復(fù)制;2.區(qū)域約束,想過(guò)邏輯放置在一起。
4. 不要同時(shí)使用雙邊沿觸發(fā)
FPGA的底層工藝都是單向的同步電路,所以本身不支持統(tǒng)一信號(hào)的爽邊沿觸發(fā),ISE在實(shí)際處理的時(shí)候,會(huì)自動(dòng)將該信號(hào)2倍頻,然后利用第一個(gè)沿處理上升沿,第二個(gè)沿處理下降沿。這樣在分析時(shí)序時(shí),自動(dòng)把約束升級(jí)為ucf文件中的兩倍。
5. Xilinx最優(yōu)時(shí)序解決方案
I/O約束
根據(jù)Xilinx器件的特點(diǎn),控制信號(hào)置于器件的頂部或底部,且垂直布置;數(shù)據(jù)總線的I/O置于器件的左右兩側(cè),且水平布置,這樣可以最大程度的利用芯片底層結(jié)構(gòu)。
ISE實(shí)現(xiàn)工具
ISE中的工具具備不同的努力程度,直接使用最高級(jí)別的可以提高時(shí)序性能,但是會(huì)耗費(fèi)很多時(shí)間,所以應(yīng)該逐步調(diào)整努力程度。第一遍使用默認(rèn)的參數(shù)選項(xiàng),如果不滿足再調(diào)整綜合、映射、布局布線的參數(shù)。
參考資料:
1. 《Xilinx FPGA開發(fā)使用教程》 田耘 徐文波
2. 如何正確使用FPGA的時(shí)鐘資源
3. FPGA IP核和硬件原語(yǔ)的關(guān)系!
評(píng)論