時鐘樹不僅可以做到高扇出,還可以做到讓時鐘信號到達(dá)各個觸發(fā)器的時刻盡可能一致,也即保證時鐘信號到達(dá)時鐘域內(nèi)不同觸發(fā)器的時間差最小。
這篇博文進(jìn)一步說時鐘樹的問題,我們知道了時鐘樹的這么強(qiáng)大的功能,好處這么多,那么怎么使用時鐘樹,我什么時候使用到了時鐘樹呢?
一、什么情況下,時鐘應(yīng)該“上樹”?
如果一個時鐘信號是為FPGA內(nèi)部的一些邏輯資源提供“脈搏”的,那么強(qiáng)烈建議該時鐘“上樹”;
如果時鐘信號的時鐘域?qū)嵲谔。鐑H控制若干個觸發(fā)器,那么也許不利用時鐘樹,F(xiàn)PGA設(shè)計也可能通過時序分析,但是仍然建議使用時鐘樹;
如果時鐘信號的時鐘域只包括一個觸發(fā)器,那么也就不存在所謂的時間差了,此時就完全不需要時鐘樹;
如果一個時鐘信號僅僅是為FPGA外部的硬件電路提供時鐘激勵的,那么外部無論有多少個存儲單元需要使用該時鐘,都沒必要使用時鐘樹,因為FPGA內(nèi)部的時鐘樹無法延伸到FPGA芯片外部。
二、如何選擇時鐘樹?
上篇博文提到了時鐘樹的類型,分為全局時鐘樹、局部時鐘樹和IO時鐘樹。那么具體來說,如果需要使用時鐘樹,該為時鐘選擇哪一類時鐘樹呢?
也許自覺會這么告訴自己,時鐘域大的,選擇全局時鐘樹;時鐘域小的,選擇區(qū)域時鐘樹;時鐘域特別小,選擇IO時鐘樹。
事實告訴你,自覺是完全錯誤的。
IO時鐘樹分布在FPGA的接口資源中,由于它們離IO管腳最近,所以可以協(xié)助FPGA完成一些較高速率的串行數(shù)據(jù)接收,再經(jīng)過簡單地串并轉(zhuǎn)換之后,以比較低的速率將并行數(shù)據(jù)丟進(jìn)FPGA芯片的內(nèi)部,供其他資源使用。一般來說,每個IO BANK內(nèi)部會有若干個IO時鐘樹的資源,因此IO時鐘樹雖然覆蓋范圍小,但并不是為小規(guī)模的時鐘域量身定做的,因此FPGA內(nèi)部的資源也無法使用該時鐘樹。
再看全局時鐘樹,由于全局時鐘樹可以覆蓋到整個FPGA芯片,因此全局時鐘樹的個數(shù)也十分有限,因此使用一定要謹(jǐn)慎,不可濫用。但是如果你硬著頭皮省下來一堆全局時鐘樹,結(jié)果卻閑置在一邊,不派上用場,那簡直就是浪費時間,白花心思。因此,全局時鐘樹這樣的資源,不可濫用,也不可不用,要充分利用。
因此,在全局時鐘樹不緊缺的情況下,無論時鐘域的大小,統(tǒng)一建議使用全局時鐘樹,因此這樣也能給編譯器提供最大的布局布線自由度,從而讓時序約束更容易實現(xiàn)。
最后來看區(qū)域時鐘樹。老實說,區(qū)域時鐘樹覆蓋范圍也是相當(dāng)?shù)拇螅畲罂赡苣艿紽PGA芯片的幾分之一,因此如果時鐘域不是特別大,到底使用全局時鐘樹還是區(qū)域時鐘樹,其實沒有一個確定的結(jié)論。不過如果不是全局時鐘樹資源不夠用,一般不建議使用區(qū)域時鐘樹。當(dāng)然了,使用區(qū)域時鐘樹可以讓時鐘域中資源的分布在物理上更緊湊一些,并且有些功能是必須使用區(qū)域時鐘樹和IO時鐘樹配合來完成的,因此請注意相關(guān)功能的說明。
最后總結(jié)下,IO時鐘樹用于IO接口的串并轉(zhuǎn)換,不可用于FPGA內(nèi)部時鐘域。
全局時鐘樹,可以覆蓋到整個FPGA芯片,在全局時鐘樹不緊缺的情況下,盡量使用全局時鐘樹,可以給編譯器提供最大的布局布線自由度,讓時序約束更容易實現(xiàn)。
局部時鐘樹,特定情況下可能又用途,但全局時鐘樹不緊缺的情況下,建議使用全局時鐘樹。
三、時鐘信號如何“上樹”?
1)使用全局時鐘樹資源
方法一,通過正確的物理連接。
如果時鐘信號是由FPGA芯片外部產(chǎn)生的,那么我們可以不通過編程就可以實現(xiàn)時鐘樹資源的分配。
因為在FPGA芯片的外圍管腳中,有一些專門為全局時鐘設(shè)計的管腳,這點我們可以通過相應(yīng)的FPGA芯片的數(shù)據(jù)手冊來確認(rèn),如果在制作電路板時,直接將外部時鐘信號通過這些管腳接入FPGA內(nèi)部,那么它將自動占據(jù)全局時鐘樹資源。當(dāng)然了,這些管腳也可以接入普通的數(shù)據(jù)信號,編譯器會對該管腳引入的信號在FPGA設(shè)計內(nèi)部扮演的角色進(jìn)行分析,如果發(fā)現(xiàn)其并沒有作為時鐘信號來使用,那么將不會為其分配時鐘樹資源。
方法二,通過恰當(dāng)?shù)拇a描述。
如果很不巧,外部的時鐘信號(外部時鐘)沒有通過專用的全局時鐘管腳連接到FPGA內(nèi)部,又或者某一個時鐘信號是FPGA內(nèi)部產(chǎn)生(再生時鐘)的,例如FPGA內(nèi)部PLL的輸出,那么此時就需要通過編寫程序來完成時鐘的“上樹”工作了。有些時候,即使不使用代碼顯示指定,編譯器也會根據(jù)代碼的分析結(jié)果,來為時鐘信號分配全局時鐘資源。不過這種靠“天”吃飯的思想不可取,F(xiàn)PGA工程師一定要讓FPGA芯片盡可能的處于自己,而不是編譯器的掌控之下,因此強(qiáng)烈建議通過自己的代碼來指明時鐘樹的使用。
那么具體要怎么通過HDL代碼來實現(xiàn)時鐘樹資源的分配呢?答案就是使用原語。
由于原語是跟FPGA芯片的生產(chǎn)廠商息息相關(guān)的,因此同一個功能的原語在不同的編譯器中的名稱很可能大相徑庭,例如用于全局時鐘樹分配的最主要的原語,Xilinx公司叫它BUFG,而Altera公司卻稱其為global。
這里,以Xilinx公司的FPGA產(chǎn)品為例,來介紹代碼的描述方法,其他公司的FPGA產(chǎn)品方法類似,只不過需要替換原語的名稱罷了。
如果FPGA內(nèi)部有一個名為innerClk的時鐘信號,我們想為它分配一個全局時鐘樹,Verilog HDL描述為:
wire globalClk;
BUFG onTree(.O(globalClk), .I(innerClk));
按照上述HDL代碼描述以后,我們就可以在后續(xù)的邏輯功能中放心使用上樹后的innerClk——globalClk了。
實際上,直接從外部全局時鐘管腳引入的時鐘信號,相當(dāng)于在HDL代碼中使用了IBUFG + BUFG原語。
除此之外,如果希望多個時鐘信號分享一個時鐘樹,也可以使用BUGMUX這個原語,相當(dāng)于MUX +BUFG,例如,希望當(dāng)前FPGA設(shè)計中的某一部分邏輯其時鐘是可以在40Hz和60Hz之間切換的。
2)使用區(qū)域時鐘樹、IO時鐘樹資源
與全局時鐘管腳類似,F(xiàn)GPA芯片的外圍管腳中也有專門為區(qū)域時鐘和IO時鐘設(shè)計的專有管腳,但是,光將時鐘信號連接到這些管腳上,還并不一定能完成相應(yīng)時鐘樹的使用,還必須要在代碼中顯式地進(jìn)行描述才行。
以Xilinx公司為例,使用原語BUFIO,將會為這些專用管腳上的信號分配IO時鐘樹資源,使用BUFR,將會為這些專用管腳上的信號分配區(qū)域時鐘樹資源。由于區(qū)域時鐘常配合IO時鐘完成串并轉(zhuǎn)換,因此,BUFR還具有神奇的分頻功能。最后,由于這兩個時鐘樹的覆蓋范圍并不是整個FPGA芯片,所以在進(jìn)行HDL代碼編寫時,也請注意資源的使用。
四、被“拉下樹”的時鐘信號
已經(jīng)上樹的時鐘信號,若不小心,也可能被拉下樹,因此,在HDL代碼編寫的時候,一定要避免這種情況。
是什么導(dǎo)致時鐘信號脫離了時鐘樹了呢?
通過前面的介紹,我們知道時鐘樹是由若干級緩沖器再加上一些近似等長的連線組成的,這也就是說,時鐘樹僅能對時鐘信號起到一個基本的傳遞作用,除此以外,別無它用。
因此,凡是相對時鐘樹上的時鐘信號進(jìn)行任何邏輯操作,來生成一個新的信號,那么新的信號已經(jīng)不再位于時鐘樹上了(注意,原來的時鐘信號仍在時鐘樹上)。如果希望新的信號仍然作為時鐘來驅(qū)動一些邏輯,那么必須重新調(diào)用相應(yīng)原語來讓新的時鐘信號獲得空閑的時鐘樹資源,所以,之前介紹的FPGA內(nèi)部生成的再生時鐘,門控時鐘,行波時鐘,如果需要使用,一定要先使用原語為它們分配好時鐘樹資源。
下面舉例說明,原始時鐘信號被拉下樹以及在此上樹的過程:
// gClkOnTreeA is on the clock tree assign midClk0 = ~gClkOnTreeA; // midClk0 is not on the clock tree assign midClk1 = en & gClkOnTreeA; // midClk1 is not on the clock tree BUFG reOnTree0(.O(gClkOnTreeB),.I(midClk0)); //gClkOnTreeB is on the clock tree BUFG reOnTree1(.O(gClkOnTreeC),.I(midClk1)); //gClkOnTreeC is on the clock tree
-
FPGA
+關(guān)注
關(guān)注
1630文章
21794瀏覽量
605132 -
時鐘
+關(guān)注
關(guān)注
11文章
1746瀏覽量
131673
發(fā)布評論請先 登錄
相關(guān)推薦
評論