時鐘及時鐘域

前言

本文節選自《FPGA之道》,通過作者的講解,一起看看時鐘和時鐘域的相關問題,下一篇博客再看看作者如何來解釋跨時鐘域問題。

時鐘及時鐘域

時鐘,時序邏輯的心跳

在時序邏輯中,正是時鐘信號將各個存儲單元中的數據一級、一級的推動下去,如果時鐘信號突然停止,那麼整個時序邏輯也將陷入癱瘓,因此,時鐘就好像時序邏輯的心跳一樣,那麼重要、卻又那麼平常地存在着。
幾乎所有的FPGA設計都是時序邏輯,因此幾乎所有的FPGA設計都離不開時鐘信號,但是正因爲時鐘信號是時序邏輯最基本的必須,就好比空氣之於衆生一樣,也許有些時候,你並不能意識到它的重要性,而這種潛意識裏對時鐘信號的不重視,則早已爲FPGA設計的最終失敗埋下了深深地伏筆。因此,要想確保FPGA設計最終的成功,先要確保時鐘信號的成功!如果有人讓你評判在FPGA上實現某一個功能的可行性,第一步,看時鐘,判斷該功能對時鐘信號的要求是否超越了FPGA的能力範圍;如果讓你着手開始一個FPGA設計,第一步,還是先看時鐘,選取合適的時鐘方案作爲整個項目的支撐。
時鐘的重要性遠非區區一個章節所能介紹的完的,可以說,本書的大部分內容都在圍繞着時鐘信號展開,不過在本章節,我們將目光更加集中於時鐘信號本身,來對其進行一些基本介紹,好讓大家更加清楚的認識時鐘。

時鐘信號基本特徵

時鐘信號基本特徵參數介紹

時鐘信號具有什麼樣的基本特徵呢?本小節將爲大家慢慢道來。請看下圖:
在這裏插入圖片描述
對於一個時鐘信號來說,最重要的三個參數非週期、頻率和佔空比莫屬了。
週期一般用大寫的英文字符T表示,其的數學定義爲:對於一個函數f(x),如果存在一個非零常數T,使得當x取定義域內的每一個值時,都有f(x+T) = f(x),那麼f(x)就叫做周期函數,而非零常數T則叫做這個函數的週期。由此可見,一個函數可以有很多個週期,通常,我們取其中最小的非零常數T,即最小週期做爲該周期函數的週期。由此可見,連續兩次上升沿或下降沿之間的時間間隔即爲時鐘信號的週期,如上圖所示,當然了,時鐘信號週期的認定並不侷限於此。
頻率一般用小寫的英文字符f表示,它和週期互爲倒數,即f = 1 / T。例如,如果時鐘信號的週期爲0.1秒,那麼其頻率就爲10赫茲,表示一秒鐘的時間內共包含了時鐘信號的10個週期。由此可見,相比於週期參數,頻率參數在描述時鐘信號變化的快慢程度上更加直觀。
佔空比等於時鐘信號一個週期內邏輯1持續的時間與週期時間的比值。對於數字波形來說,波形圖上幾乎除了邏輯1就是邏輯0,而上圖中的“高電平”、“低電平”即分別對應一個時鐘週期內邏輯1和邏輯0的持續時間。通常來說,50%是最常見的時鐘信號佔空比,即“高電平”寬度等於“低電平”寬度。
除了週期、頻率、佔空比之外,上升時間和下降時間也是時鐘信號中比較重要的特徵參數。由於現實世界中,電容的充、放電等等都需要一定的時間程,因此不同邏輯電平之間的過度總是需要一個過程,而上升時間就是指時鐘信號從邏輯0變化到邏輯1所需要的時間,下降時間則是指時鐘信號從邏輯1變化到邏輯0所需要的時間,分別如上圖所示。對於理想的時鐘信號,我們說時鐘的上升沿就是從邏輯0跳變到邏輯1的這個瞬間,時鐘的下降沿則是從邏輯1跳變到邏輯0的這個瞬間。而對於實際的時鐘信號來說,由於電平之間的變化需要消耗時間,因此,上升沿和下降沿發生的具體時刻就不太好確定,而要根據接收時鐘信號的數字器件對於邏輯電平的判決門限來推算了,不過可以肯定的是上升沿、下降沿一定位於上升時間、下降時間之內。對於時序邏輯來說,其內部的絕大部分存儲單元都是邊沿敏感的,例如寄存器、BLOCK RAM等等,因此一定要對時鐘信號的上升沿、下降沿有一個清楚的認識。

如何區分時鐘和數據

在數字的世界中,所有的信號都是在邏輯0與邏輯1之間不斷切換的,而不僅僅限於時鐘信號。因此,數據信號也完全可以具有時鐘信號的所有基本特徵,那麼此時,我們該如何分辨該信號是時鐘信號還是數據信號呢?
如果僅僅通過觀察信號的數字波形,是無法分辨一個信號到底是時鐘信號還是數據信號的。要想做出準確分辨,必須去查看該信號在數字電路中的連接關係,舉個例子,如果一個信號連接到一個寄存器的時鐘端,那麼它就是一個時鐘信號;如果該信號連接到一個寄存器的數據輸入端,那麼它就是一個數據信號;如果一個信號連接到一個寄存器的時鐘端的同時又連接到另一個寄存器的數據輸入端,那麼它也就具有了時鐘信號與數據信號的雙重身份。
由此可見,時鐘信號的本質,是在於其是否爲時序邏輯提供“心跳”機制,而不在於其具體的表現形式。

時鐘信號的分類

按來源分

時鐘信號按照其來源分,可分爲外部時鐘和內部時鐘,而內部時鐘又可分爲再生時鐘、門控時鐘、行波時鐘,分別介紹如下:

外部時鐘

外部時鐘,指時鐘信號的來源是在FPGA芯片的外部。通常來說,外部時鐘源對FPGA設計來說是必須的,因爲一般FPGA芯片內部沒有能夠產生供內部邏輯使用的時鐘信號的選頻和激勵電路。所以通常來說,我們需要在FPGA芯片的外部使用晶振以及恰當的電阻、電容、電感、三極管等器件,來搭建用於產生時鐘信號的電路,並將其通過FPGA芯片的恰當物理管腳引入到FPGA內部供時序邏輯使用。
順便說一句,當我們用示波器觀察外部時鐘信號時,可以發現其波形很可能不是一個規則的方波,而一個正弦波。這是由於方波信號實際上是一個頻帶非常寬的信號,因爲其有着尖銳的上升沿與下降沿,而晶振的選頻迴路只能對針對某一個頻率的信號進行放大,而對其他頻率的信號都會衰減,再加上任何信道其實都相當於一個濾波器,所以導致時鐘信號的帶寬非常的有限,因此都類似表現爲正弦波,這也是時鐘信號中爲什麼會有“上升時間”和“下降時間”的一個原因。不過模擬的時鐘信號經過邏輯門的驅動後,由於MOS電路的陡峭導通特性,會對時鐘信號的“上升時間”和“下降時間”起到積極的縮減作用。

再生時鐘

再生時鐘,指FPGA內部產生的新時鐘,當然了,這並不是憑空產生的時鐘(因爲FPGA芯片內部一般不具有產生時鐘信號的電路結構),而是以一個輸入的時鐘信號作爲參考,然後在此基礎之上通過調整其頻率和相位而產生出來的新時鐘。
目前來說,FPGA芯片內部能夠產生再生時鐘信號的模塊主要有DCM和PLL兩個,在【本篇->編程思路->DCM與PLL】章節中,我們將爲大家詳細介紹。順便說一下,FPGA芯片內部僅有DCM和PLL可以對時鐘信號進行升頻操作。

門控時鐘

門控時鐘,指的是由組合邏輯產生的時鐘,其中,組合邏輯的輸入可以全部是數據信號,也可以包含原始時鐘信號。由於組合邏輯中的基本單元就是與、或、非等門電路,而與門和非門又具有“開關性”,固該類時鐘又稱爲門控時鐘。例如,下面的電路圖中的門控時鐘是由與門產生的,當en信號爲1時,與門打開,原始時鐘信號可以通過並作用到觸發器;而當en信號爲0時,與門關閉,觸發器由於沒有時鐘信號驅動,將會處於休眠狀態,不會有任何動作:
在這裏插入圖片描述
通常情況下,不建議大家在FPGA設計的內部引入門控時鐘,因爲門控時鐘由組合邏輯產生,那麼它身上就潛伏了組合邏輯的最大隱患——競爭與險象,所以門控時鐘信號容易產生毛刺,而寄存器等存儲單元對時鐘信號的邊沿都非常的敏感,因此具有毛刺的時鐘會造成時序邏輯的不穩定。
事實上,控制時鐘信號的目的是爲了控制觸發器的行爲,這點我們也可以通過控制觸發器的使能端來做到,因此,上例中的電路完全可以修改如下:
在這裏插入圖片描述
這樣一來,這個系統將會免受競爭與險象的困擾。

行波時鐘

行波時鐘,指的是由時序邏輯產生的時鐘。例如,A寄存器的輸出如果作爲B寄存器的時鐘,則A寄存器的輸出稱爲行波時鐘。例如,如下電路中,驅動右邊那個觸發器的時鐘即爲行波時鐘:
在這裏插入圖片描述
通常情況下,也不建議大家在FPGA設計的內部引入行波時鐘,因爲這樣會在FPGA設計中引入新的時鐘域(後續小節將會介紹),增加時序分析的難度,並且由於行波時鐘的相位通常會滯後於原始時鐘,因此後續觸發器的保持時間(關於保持時間的概念參見【時序分析篇->基本概念介紹->常用時間參數介紹】小節)不一定能夠得到滿足。
事實上,採用行波時鐘的目的無非是爲後續時序電路的處理速度進行降頻,而要實現降頻的功能,除了通過降低時鐘信號的頻率外,仍然可以通過控制後續時序電路存儲單元的使能端來實現,因此,上例中的電路完全可以修改如下:
在這裏插入圖片描述
這樣一來,整個時序邏輯將只被一個時鐘信號所驅動,變得清晰又易控。

按波形分

時鐘信號按波形分,可分爲連續時鐘、間歇時鐘、不規則時鐘,分別介紹如下:

連續時鐘

連續時鐘,指從波形圖上來看,時鐘波形呈連續的、週期的,例如下圖所示:
在這裏插入圖片描述
FPGA內部的時鐘通常來說都是連續時鐘。

間歇時鐘

間歇時鐘,指從波形圖上來看,時鐘波形存在間斷,時有時無,例如下圖所示:
在這裏插入圖片描述
間歇時鐘常見於FPGA的數據輸入或輸出接口,這是因爲有些外圍器件的同步接口不包括使能端,因此當沒有需要傳輸的數據時只能通過關閉時鐘來暫停通信,並且這樣也可以在一定程度上減少功耗。

不規則時鐘

不規則時鐘,指從波形圖上來看,時鐘的波形無固定規律可循,沒有固定的週期、頻率,也沒有固定的佔空比,並且還時有時無,例如下圖所示:
在這裏插入圖片描述
不規則時鐘也常見於FPGA的數據輸入或輸出接口,與間歇時鐘產生的原因類似,只不過間歇式時鐘往往針對成包或成幀傳輸數據的接口,因此每次都會輸出一連串規則的波形信號,而不規則時鐘針對的接口數據量往往比較小,也沒有固定的數據結構,因此有一個數據就會傳一個數據。

時鐘域

時鐘域的概念

時序邏輯離不開時鐘,有時鐘的地方也必然存在着時序邏輯,而隨着FPGA芯片所承載功能的日漸複雜與多樣化,單個時鐘信號已經往往不能滿足FPGA設計的需求。就拿一個最簡單的串並轉換接口來說吧,要實現它就至少需要兩個時鐘信號,因此,通常情況下,一個FPGA設計中往往要用到多個時鐘信號。都說“一個和尚挑水喝,兩個和尚擡水喝,三個和尚沒水喝”,當FPGA設計中的時鐘增多了之後,會不會也存在一些問題呢?答案是肯定的!多時鐘並存,最嚴重的就是會導致跨時鐘域問題,這個我們將會在下一小節詳細介紹,而現在,讓我們將目光集中於時鐘域上,只有先搞清楚什麼是時鐘域,後續的討論纔會變得有意義。
簡而言之,時鐘域就是時鐘信號的“勢力範圍”,用來昭告天下,“哪一片歸我管”,“這裏我最大”等等。一個時鐘域中只能存在一個時鐘信號,典型的“一山不容二虎”,但一個時鐘信號最多可以對應兩個時鐘域,當其上升沿和下降沿分別都被一部分資源敏感的時候。而被時鐘域所瓜分的資源,正是具有存儲功能的各個單元,而其中最典型的就是寄存器。要想判斷一個寄存器是屬於哪一個時鐘域的,方法很簡單,只要看它的時鐘輸入端口接的是哪個時鐘信號以及敏感哪個邊沿即可。時鐘信號直接掌控着屬於其時鐘域內的寄存器們,同時也間接的掌控着一些組合邏輯資源,因爲FPGA內部組合邏輯的輸入往往是寄存器的輸出。不過,要想判斷某一塊組合邏輯到底是屬於哪個時鐘域的,就沒那麼容易了,因爲組合邏輯本身並不直接受時鐘信號的控制。因此,要想判斷組合邏輯的歸屬,需要分析它的所有輸入:如果一個組合邏輯的所有輸入都來自同一個時鐘域內的寄存器的輸出,那麼該組合邏輯輸出的變化頻率必然也會跟隨該時鐘的脈搏跳動,所以可以確定該組合邏輯屬於該時鐘域;反之,則該組合邏輯中存在異步或者跨時鐘域問題,它不屬於任何一個時鐘域。

時鐘樹簡介

既然是“勢力範圍”,那麼不同時鐘信號的時鐘域大小就有可能不同,這就好比世界上有很多個國家,可每個國家的領土大小、人口數量卻各不相同。如果一個國家只有一個人,那麼執政者只用嚴於律己就好,因爲一人吃飽全家不餓;如果一個國家只有10個人,那麼執政者只需要管理好自己以及其餘9個人即可;如果人再多些,例如一個國家有10億人,那麼執政者就沒有那個精力來挨個管了,於是就需要有省一級、市一級、區一級、鄉一級等等的領導班子來組成所謂的公務員團體,來協助其進行管理。因此,對於“勢力範圍”大小不同的各個時鐘域,時鐘的管理方法也必然不同,只不過這次的幫手不是公務員,而是時鐘樹!(時鐘樹其實就是FPGA內部的時鐘網絡資源。)
那麼,時鐘樹是怎麼幫助時鐘來“管理”時鐘域的呢?
首先,如果一個時鐘域包含了10000個觸發器,那麼該時鐘信號必須要能夠同時連接到這10000個觸發器的時鐘輸入端,而如此大的信號扇出要怎麼實現呢?不用擔心,時鐘樹可以做到這麼大的扇出。
其次,爲了達到更好的時序指標,我們總希望時鐘信號儘可能同時的到達其時鐘域內各個觸發器的時鐘輸入端,那麼如此苛刻的要求又要怎麼實現呢?不用擔心,時鐘樹可以保證時鐘信號到達時鐘域內不同觸發器的時間差最小。
由此可見,時鐘樹資源對時鐘信號的重要性,我們可以形象的通過如下圖示來理解時鐘樹的工作原理:
在這裏插入圖片描述
上圖即爲一個時鐘樹的原理結構圖,時鐘信號由最中間的樹根引入時鐘樹,並經由第一級緩存扇出若干個分別送往不同的區域;在各個區域中,再採用同樣的方式繼續扇出並送往不同的子區域;如此往復,直到時鐘信號到達最基本的觸發器等資源。由此可見,時鐘樹主要利用多級扇出的形式來達到最終的高扇出結果;而通過控制每級扇出後的佈線長度儘量一致來保證時鐘信號能夠儘可能同時的到達各個觸發器,這就是時鐘樹的基本工作原理。注意,如果兩個時鐘域分別對應一個時鐘信號的上升沿和下降沿,則它們可以共用一個時鐘樹。
最後,需要澄清一個概念,那就是時鐘樹是保證時鐘信號到達時鐘域內不同觸發器的時間差儘可能小的資源,而不是保證時鐘信號到達觸發器所消耗時間最短的資源。例如,時鐘域內有3個觸發器,如果利用時鐘樹資源,並假設0時刻是時鐘信號的初始時刻,那麼時鐘信號到達這三個觸發器的時刻可能爲8ns、9ns、8.5ns,而如果不應用時鐘樹,時鐘信號到達這三個觸發器的時刻可能爲2ns、6ns、11ns。

時鐘樹的分類

既然時鐘樹是幫助時鐘來管理時鐘域的,那麼由於時鐘域可能很大、也可能很小,因此時鐘樹也會有大有小。由於時鐘樹資源在FPGA芯片中屬於比較稀有的資源,那麼爲FPGA設計的每個時鐘信號選擇合適的時鐘樹就顯得十分重要。那麼,按照時鐘樹的作用範圍來看,FPGA內部的時鐘樹資源共有三種,即:全局時鐘樹、區域時鐘樹、IO時鐘樹,相關的具體說明可以回顧本書【知己知彼篇->FPGA內部資源介紹->時鐘網絡資源】小節。

正確的時鐘使用方式

瞭解了時鐘域的相關內容,那麼在平時的FPGA設計工作當中,該怎樣正確運用呢?這一小節,將爲大家介紹一些正確的時鐘使用方式。

什麼情況下時鐘應該“上樹”?

如果一個時鐘信號是爲FPGA內部的一些邏輯資源提供“脈搏”的,那麼強烈建議讓該時鐘上樹;如果時鐘信號的時鐘域實在太小,例如僅控制若干個觸發器的話,那麼也許不利用時鐘樹,FPGA設計也可能通過時序分析,但是仍然建議使用時鐘樹;如果時鐘信號的時鐘域只包括一個觸發器的話,那麼也就不存在所謂的時間差了,此時就完全不需要時鐘樹;如果一個時鐘信號僅僅是爲FPGA外圍的硬件電路提供時鐘激勵的,那麼無論外部有多少個存儲單元需要使用該時鐘,都沒有必要使用時鐘樹,因爲FPGA內部的時鐘樹無法延伸到FPGA芯片外部,就好比美國公民不受中國法律約束一樣。

如何選擇時鐘樹?

如果需要使用時鐘樹,那麼該爲時鐘選擇哪一類時鐘樹呢?
也許你會想當然的覺得,時鐘域大的,選擇全局時鐘樹;時鐘域較小的,選擇區域時鐘樹;時鐘域特別小的,選擇IO時鐘樹。那麼在這裏,我只能告訴你,完全錯誤!
首先來看IO時鐘樹,IO時鐘樹只分布在FPGA的接口資源中,由於它們離IO管腳最近,所以可以協助FPGA完成一些較高速率的串行數據接收,在經過簡單的串並轉換之後,以比較低的速率將並行數據丟進FPGA芯片的內部,供其他資源使用。一般來說,每個IO BANK內部會有若干個IO時鐘樹的資源,因此,IO時鐘樹雖然覆蓋範圍小,但並不是爲小規模的時鐘域量身定做的,因此FPGA內部的資源也無法使用該時鐘樹。
再來看全局時鐘樹,由於全局時鐘樹可以覆蓋到整個FPGA芯片,因此全局時鐘樹的個數也十分有限,因此使用的時候一定要謹慎,不可太過濫用。但是“人死了,錢沒花了”是一件很痛苦的事情,如果你硬着頭皮省下來一堆全局時鐘樹,結果卻閒置在一邊,不派上用場,那簡直是浪費時間、白花心思。因此,全局時鐘樹這樣的“黃金地段”,不能不用,不能濫用,而要充分利用!因此,在全局時鐘樹資源不緊缺的情況下,無論時鐘域的大小,統一建議使用全局時鐘樹,因爲這樣也能夠給編譯器提供最大的佈局佈線自由度,從而讓時序約束更容易實現。
最後來看區域時鐘樹,老實說,區域時鐘樹的覆蓋範圍也是相當大的,最大可能能到FPGA芯片的幾分之一,因此如果時鐘域不是特別大的話,到底使用全局時鐘樹還是區域時鐘樹,其實沒有一個確定的結論。不過如果不是全局時鐘樹資源不夠用的話,一般不建議使用區域時鐘樹。當然了,使用區域時鐘樹可以讓時鐘域中資源的分佈在物理上更加緊湊一些,並且有些功能是必須使用區域時鐘樹和IO時鐘樹配合來完成的,因此請注意相關功能的說明。

時鐘信號怎麼“上樹”?

明確了該爲時鐘信號使用的時鐘樹種類,那麼接下來就來看看具體的做法吧。

使用全局時鐘樹資源

方法一,通過正確的物理連接。

如果時鐘信號是由FPGA芯片的外部產生,那麼我們可以不通過編程就實現時鐘樹資源的分配。因爲在FPGA芯片的外圍管腳中,有一些專門爲全局時鐘設計的管腳,這點我們可以通過相應FPGA芯片的數據手冊來確認,如果在製作電路板時,直接將外部時鐘信號通過這些管腳接入FPGA內部,那麼它將自動佔有全局時鐘樹資源。當然了,這些管腳也可以接入普通的數據信號,編譯器會對該管腳引入的信號在FPGA設計內部扮演的角色進行分析,如果發現其並沒有作爲時鐘信號來使用,那麼將不會爲其分配時鐘樹資源。

方法二,通過恰當的代碼描述。

如果很不巧,外部的時鐘信號沒有通過專用的全局時鐘管腳連接到FPGA內部,又或者某一個時鐘信號本身就是在FPGA內部產生的,例如FPGA內部PLL的輸出,那麼此時就需要通過編寫程序來完成時鐘的“上樹”工作了。有些時候,即使不使用代碼顯式指定,編譯器也會根據代碼的分析結果,來爲時鐘信號分配全局時鐘樹資源,不過這種“靠天吃飯”的思想不可取,FPGA工程師一定要讓FPGA芯片儘可能的處於自己的掌控之下,而不是編譯器,因此強烈建議大家通過自己的代碼來指明時鐘樹的使用。那麼具體要怎麼通過HDL代碼來實現時鐘樹資源的分配呢?使用原語。更多關於原語的介紹請參閱【本篇->編程思路->原語的使用】章節,在這裏,我們只簡單介紹一下如何使用原語來完成時鐘信號的“上樹”。
由於原語是跟FPGA芯片的生產廠商息息相關的,因此同一個功能的原語在不同的編譯器中的名稱很可能大相徑庭,例如,用於全局時鐘樹分配的最主要的原語,Xilinx公司叫它BUFG,而Altera公司卻稱其爲global。在這裏,我們將以Xilinx公司的FPGA產品爲例,來介紹代碼的描述方法,其他公司的FPGA產品方法類似,只不過需要替換原語的名稱罷了。
如果FPGA內部有一個名爲innerClk的時鐘信號,我們想爲它分配一個全局時鐘樹,該怎麼辦呢?可以使用如下HDL描述:

-- VHDL example
signal globalClk : std_logic; 
onTree: BUFG port map(O => globalClk, I => innerClk);

// Verilog example
wire globalClk;
BUFG onTree(.O(globalClk), .I(innerClk));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

按照上述HDL代碼處理後,我們就可以在後續的邏輯功能中放心使用“上樹”後的innerClk——globalClk了。
實際上,直接從外部全局時鐘管腳引入的時鐘信號,相當於在HDL代碼中使用了IBUFG+BUFG原語。除此以外,如果希望多個時鐘信號分享一個時鐘樹,也可以使用BUGMUX這個原語,相當於MUX+BUFG,例如,希望當前FPGA設計的某一部分邏輯其時鐘是可以在40MHz和60MHz之間切換的。

使用區域時鐘樹、IO時鐘樹資源

與全局時鐘管腳類似,FPGA芯片的外圍管腳中也有專門爲區域時鐘和IO時鐘設計的專有管腳,但是,光將時鐘信號連接到這些管腳上,還並不一定能完成相應時鐘樹的使用,還必須要在代碼中顯式的進行描述才行。以Xilinx公司爲例,使用原語BUFIO,將會爲這些專用管腳上的信號分配IO時鐘樹資源,使用原語BUFR,將會爲這些專用管腳上的信號分配區域時鐘樹資源。由於區域時鐘常配合IO時鐘完成串並轉換,因此BUFR通常還具有神奇的分頻功能。最後,由於這兩個時鐘樹的覆蓋範圍並不是整個FPGA芯片,所以在進行HDL代碼編寫時,也請注意資源的使用。

被“拉下樹”的時鐘信號

已經“上樹”的時鐘信號,如果不加小心,也可能被“拉下樹”,因此在進行HDL代碼編寫的時候,一定要避免出現這種情況。那麼是什麼導致時鐘信號脫離了時鐘樹呢?原因是這樣的:通過前面小節的介紹,我們知道時鐘樹是由若干級緩衝器再加一些近似等長的連線組成的,這也就是說時鐘樹僅能對時鐘信號起到一個基本的傳遞作用,除此以外別無它用。因此,凡是想對時鐘樹上的時鐘信號進行任何邏輯操作,來生成一個新的信號,那麼新的信號就已經不再位於時鐘樹上了(注意,原始的時鐘信號仍然在樹上)。如果希望新的信號仍然作爲時鐘來驅動一些邏輯,那麼必須重新調用相應原語來讓新的時鐘信號獲得空閒的時鐘樹資源,所以,之前介紹的FPGA內部的再生時鐘、門控時鐘、行波時鐘,如果需要使用的話,一定要先使用原語爲它們分配好時鐘樹資源。
下例中,更加形象的說明了原始時鐘信號被“拉下樹”和再次“上樹”的過程:

	-- VHDL example
	-- gClkOnTreeA is on the clock tree
	midClk0 <= not gClkOnTreeA; -- midClk0 is not on the clock tree;
	midClk1 <= en and gClkOnTreeA; -- midClk1 is not on the clock tree;
-- gClkOnTreeB is on the clock tree
	reOnTree0: BUFG port map (O => gClkOnTreeB, I => midClk0);
-- gClkOnTreeC is on the clock tree
	reOnTree1: BUFG port map (O => gClkOnTreec, I => midClk1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章