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