1. 程式人生 > >Verilog組合邏輯和時序邏輯的比較

Verilog組合邏輯和時序邏輯的比較

VerilogHDL語言分為面向綜合和麵向模擬兩大類語句,且可綜合語句遠少於模擬語句,讀者可能會有可綜合設計相對簡單的感覺。然而事實剛好與此相反,這是因為:首先,可綜合設計是用來構建硬體平臺的,因此對設計的指標要求很高,包括資源、頻率和功耗,這都需要通過程式碼來體現;其次,在實際開發中要利用基本VerilogHDL語句完成種類繁多的硬體開發,給設計人員帶來了很大的挑戰。所有的模擬語句只是為了可綜合設計的驗證而存在。為了讓讀者深入地理解可綜合設計、靈活運用已學內容,本章將可綜合設計中的基本知識點和難點提取出來,融入VerilogHDL語法以及開發工具等諸多方面,以深入淺出的方式向讀者說明設計中的難點本質。

8.1 組合邏輯和時序邏輯
數位電路根據邏輯功能的不同特點,可以分成兩大類,一類叫組合邏輯電路(簡稱組合電路),另一類叫做時序邏輯電路(簡稱時序電路)。掌握組合邏輯和時序邏輯的區分手段與實現方法是數字系統設計的基本要求。
8.1.1 組合邏輯設計
1.組合邏輯概念
組合邏輯是VerilogHDL設計中的一個重要組成部分。從電路本質上講,組合邏輯電路的特點是輸出訊號只是當前時刻輸入訊號的函式,與其他時刻的輸入狀態無關。無儲存電路,也沒有反饋電路,其典型結構如圖8-1所示。從電路行為上看,其特徵就是輸出訊號的變化僅僅與輸入訊號的電平有關,不涉及對訊號跳變沿的處理。



儘管組合電路在功能上千差萬別,可是其分析方法卻有很多相似之處。給定邏輯電路後,得到其輸入與輸出的直接表示式,將輸入組合全部帶入表示式中計算得到輸出結果,並以真值表的形式表達出來,最後根據真值表說明電路功能。
組合邏輯電路的設計就是在給定邏輯功能的前提下,通過某種設計渠道,得到滿足功能要求且最簡單的邏輯電路。基於HDL 語言和EDA工具的組合邏輯電路的設計流程如圖8-2 所示。



其中邏輯抽象和HDL程式設計是重點環節。在很多情況下,邏輯問題都是通過文字描述的,邏輯抽象就是對設計物件的輸入與輸出訊號間的因果關係,用邏輯函式的方法表示出來。HDL語言程式設計就是直接通過語句來實現抽象結果。
2.組合邏輯的Verilog HDL 描述
根據組合邏輯的電路行為,可以得到兩種常用的RTL 級描述方式。第一種是always模組的觸發事件為電平敏感訊號列表;第二種就是用assign 關鍵字描述的資料流賦值語句。
(1)always 模組的敏感表為電平敏感訊號的電路
這種方式的組合電路應用非常廣泛,幾乎可以完成對所有組合邏輯電路的建模。always模組的敏感列表為所有判斷條件訊號和輸入訊號,但一定要注意敏感列表的完整性。在always模組中可以使用if、case 和for 等各種RTL關鍵字結構。由於賦值語句有阻塞賦值和非阻塞賦值兩類,建議讀者使用阻塞賦值語句“=”,詳細原因將在8.3.1 節進行說明。
always 模組中的訊號必須定義為reg 型,不過最終的實現結果中並沒有暫存器。這是由於在組合邏輯電路描述中,將訊號定義為reg型,只是為了滿足語法要求。下面給出一個組合邏輯例項。
【例8-1】通過Verilog HDL 語言實現一個2 輸入比較器,輸入分別為d1、d2,輸出分別為f1(d1>d2時為高電平)、f2(d1 = d2 時為高電平)、f3(d1



可以看出,組合邏輯就對應著電平觸發事件電路。上述程式在ISE中綜合後的RTL級結構圖如圖8-3所示,可以看出,雖然將輸出訊號f1、f2以及f3宣告為暫存器變數,並且在always模組中進行賦值操作,但在組合邏輯設計中,並沒有綜合成D觸發器。



上述程式在ISESimulator中的模擬結果如圖8-4所示,只要敏感訊號電平發生變化,always語句塊中所有語句都會被重新執行一次。
(2)assign語句描述的電路
利用條件符“?”可以描述一些相對簡單的組合邏輯電路,訊號只能被定義為wire型。當組合邏輯比較複雜時,需要很多條assign語句或者多重巢狀“?”,使得程式碼可讀性極差,因此此時推薦第一種組合邏輯建模方式。下面給出一個由assign關鍵字描述的組合邏輯例項。



【例8-2】通過assign語句實現例8-1的比較器。



在ISE中檢視其綜合後的RTL級結構示意圖,可以發現和圖8-3一樣,其模擬結果也和例8-1的一致。
3.組合邏輯電路的注意事項
(1)敏感訊號列表
在組合邏輯設計中,讀者必須重點對待敏感訊號列表。敏感訊號列表出現在always塊中,其典型行為級的含義為:只要敏感訊號列表內的訊號發生電平變化,則always模組中的語句就執行一次,因此設計人員必須將所有的輸入訊號和條件判斷訊號都列在訊號列表中。有時,
不完整的訊號列表會造成不同的模擬和綜合結果,因此需要保證敏感訊號的完備性。在實際的PLD 器件開發中,EDA工具都會預設將所有的輸入訊號和條件判斷語句作為觸發訊號,增減敏感訊號列表中的訊號不會對最終的執行結果產生影響,因此讀者如果期望在設計中通過修改敏感訊號來得到不同的邏輯,那就大錯特錯了。當敏感訊號不完備時,會使得模擬結果不一樣,這是因為模擬器在工作時不會自動補充敏感訊號表。如果缺少訊號,則無法觸發和該訊號相關的模擬程序,也就得不到正確的模擬結果。
因此,為了確保模擬和最終實現結果一致,必須要保證組合邏輯電路always敏感訊號列表的完備性。如果設計人員在設計中,認為列舉訊號麻煩,則採用下面的語句。



此時,綜合工具和模擬工具會自動將所有的敏感訊號自動加入敏感訊號列表。ISE 也支援這一用法。
(2)不要在組合邏輯中引入環路
在組合邏輯中引入環路會導致電路產生振盪、毛刺以及衝突等問題,從而降低設計的穩定性和可靠性,因此要徹底避免環路。



圖8-5給出一個簡單的環路設計,把一個暫存器輸出通過組合邏輯後,再次通過兩級組合邏輯處理反饋給該組合邏輯的引腳時,就會產生組合環路,要避免該組合環路,可以採用圖8-6所示的邏輯設計示意圖,不僅功能結構一致,還取消了組合邏輯環路。



之所以稱邏輯環路是一種高風險設計,其原因如下:
首先,環回邏輯的延時完全依靠組合邏輯閘延遲和佈線延遲。一旦這些傳播時延有所變化,則環路的整體邏輯將徹底失效。
其次,環路的時序分析是個死迴圈過程。目前的EDA開發工具為了計算環路的時序邏輯都會主動割斷時序路徑,引入許多不確定的因素。
目前的綜合工具都會給出邏輯環路的警告(CombinationalLoops),因此設計人員必須對軟體工具的此類報告特別在意。如果一定要實現環路,則需要通過時序邏輯的暫存器來完成。

8.1.2 時序邏輯設計
1.時序邏輯電路的基本知識
時序邏輯是Verilog HDL設計中另一類重要應用。從電路特徵上看來,其特點為任意時刻的輸出不僅取決於該時刻的輸入,而且還和電路原來的狀態有關。電路里面有儲存元件(各類觸發器,在FPGA晶片結構中只有D 觸發器)用於記憶資訊,如圖8-7所示。從電路行為上講,不管輸入如何變化,僅當時鐘的沿(上升沿或下降沿)到達時,才有可能使輸出發生變化。
從圖8-7 可以看出,時序邏輯電路由組合邏輯電路和儲存電路這兩部分組成,其中儲存電路由各類觸發器(JK 觸發器、D 觸發器以及T觸發器等型別)構成,並將組合邏輯的部分輸出反饋到輸入邏輯的輸入埠。
時序電路可通過表示式(電路輸出端的輸出邏輯表示式、儲存電路觸發器輸出端的驅動或激勵表示式,以及表示觸發器狀態的狀態方程)、狀態轉移表、狀態轉移圖、時序圖以及HDL行為描述語言等來描述。若將輸入變數和各級觸發器狀態的全部組合列出,分別代入各級觸發器的狀態方程和電路的輸出方程,則可以計算出各級觸發器的次態值和當前輸出值,把相應的計算結果列成真值表就可得到狀態轉移表。對於讀者最關心的HDL行為描述程式碼,可在時序圖的基礎上快速得到。
分析一個時序電路,就是要找出給定時序電路的邏輯功能。具體地說,就是要求找出電路的狀態和輸出狀態(一般指進位輸出、借位輸出等)在輸入變數和時鐘訊號作用下的變化規律。為了直觀地說明上述方法,下面給出一個簡單的時序邏輯電路,通過分析得到其常用的描述形式。
【例8-3】完成圖8-8 所示的簡單時序邏輯電路的分析。



(1)首先,列出輸出方程、驅動方程,即



由於電路採用T 型觸發器,因此其特徵方程為:



將驅動方程代入特徵方程,可以得到式(8-4)所示的狀態方程。



(2)計算並列出狀態轉移表
圖示電路有一個輸入X和1級觸發器,因此輸入與觸發器初態的取值組合只有4組,即00、01、10和11。把這些取值帶入式(8-4)和式(8-1),可計算出觸發器的次態和電路的輸出值,其相應的狀態轉移表如表8-1所列。



(3)畫出狀態轉移圖和時序圖
狀態轉移圖直觀、形象地顯示出了時序邏輯電路的特點和邏輯功能,本例的狀態轉移圖如圖8-9所示。其中,圓圈內的數字表示電路的狀態,箭頭表示狀態轉換的方向,箭頭旁註明瞭狀態轉換的輸入條件和輸出結果,輸入條件位為斜線上方,而輸出結果位於斜線下方。



時序圖就是通過數字訊號波形直觀表示時序邏輯電路的特點和邏輯功能,可根據狀態方程、狀態轉移表等多方面得到,用於判斷設計結果的正確性。圖8-10(a)、(b)分別給出了觸發器初始狀態為0和1的時序圖。



從圖8-10中可以看出以下兩點:首先,時序電路的輸出訊號不僅取決於電路當時的輸入,還取決於電路原來的狀態,體現了“記憶”特性。其次,在同步時序邏輯電路中,觸發器由時鐘訊號CP來觸發,控制其翻轉時刻,而對觸發器翻轉到何種狀態並無影響。
2.時序邏輯的Verilog HDL描述
時序電路的行為決定了其只能通過always塊語句實現,通過關鍵詞“posedge”和“negedge”來捕獲時鐘訊號的上升沿和下降沿。在always語句塊中可以使用任何可綜合的標誌符。下面首先以D觸發器為例,給出基本單元觸發器的VerilogHDL例項,讀者可自行完成其餘常用觸發器(RS觸發器、JK觸發器以及T觸發器等)的Verilog HDL實現。
【例8-4】通過Verilog HDL實現D觸發器。
同步D觸發器的功能為:輸入D只能在時序訊號clk的沿變化時才能被寫入到儲存器中,替換以前的值,常用於資料延遲以及資料儲存模組中。由於D觸發器只有一個輸入端,在許多情況下,可使觸發器之間的連線變得非常簡單,因此使用十分廣泛。



上述程式在ISE中綜合後的RTL級結構圖如圖8-11所示。
上述程式的模擬結果如圖8-12所示。從中可以看出,在時鐘上升沿,D觸發器都將輸入資料接收並寄存。



在給出時序邏輯設計最基本的電路後,下面給出圖8-8所示電路的Verilog HDL實現,和例8-3的描述方法進行比較。
【例8-5】通過Verilog HDL語言實現例8-3所示電路。



程式在ISE綜合後的RTL級結構圖如圖8-13所示,可以看出,其和圖8-8是一致的,達到了設計的目的。



上述程式的模擬結果如圖8-14所示,驗證了程式的正確性。



在利用Verilog HDL描述時序電路時有以下幾個問題需要注意。
(1)在描述時序電路的always塊中的reg型訊號都會被綜合成暫存器,這是和組合邏輯電路所不同的。
(2)時序邏輯中推薦使用非阻塞賦值“<=”,原因將在8.3節詳細說明。
(3)時序邏輯的敏感訊號列表只需要加入所用的時鐘觸發沿即可,其餘所有的輸入和條件判斷訊號都不用加入,這是因為時序邏輯是通過時鐘訊號的跳變沿來控制的。

8.1.3 組合邏輯電路中的競爭與冒險
1.什麼是競爭與冒險
訊號在組合邏輯電路內部通過連線和邏輯單元時,都有一定的延時。延時的大小與連線的長短和邏輯單元的數目有關,同時還受器件的製造工藝、工作電壓、溫度等條件的影響。此外,訊號的高低電平轉換也需要一定的過渡時間。由於存在這兩方面因素,多路訊號的電平值發生變化時,在訊號變化的瞬間,組合邏輯的輸出有先後順序,並不是同時變化,往往會出現一些不正確的尖峰訊號,這些尖峰訊號稱為“毛刺”,如圖8-15所示。如果一個組合邏輯電路中有“毛刺”出現,就說明該電路存在“冒險”。
需要注意的是,冒險訊號的脈衝寬度很小,常常只有數納秒或數十納秒,其頻帶頻寬可達數百兆赫茲或更寬。在板級除錯時,如果示波器的上限頻率較低,會將幅度較大的毛刺顯示為幅度較小的毛刺,甚至不易被察覺。這都是在實際開發中捕獲毛刺應該注意的問題。
冒險按產生形式的不同可以分為靜態冒險和動態冒險兩大類。靜態冒險是指輸入有變化,而輸出不應變化時產生的單個窄脈衝;動態冒險則指的是輸入變化時,輸出也應變化時產生的冒險。參考文獻[4]指出,動態冒險是由靜態冒險引起的,因此存在動態冒險的電路也存在靜態冒險。
靜態冒險根據產生條件的不同,分為功能冒險和邏輯冒險兩大類。當有兩個或兩個以上輸入訊號同時產生變化時,在輸出端產生毛刺,這種冒險稱為功能冒險。如果只有一個變數產生變化時出現的冒險則是邏輯冒險。
冒險往往會影響到邏輯電路的穩定性。清零和置位埠對毛刺訊號十分敏感,任何一點毛刺都可能會使系統出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設計人員必須要考慮的問題。



2.冒險產生的原因
由於動態冒險主要是由靜態冒險引起的,消除了靜態冒險,動態冒險也就自然消除了,因此下面介紹靜態冒險的檢查和消除。
判斷一個邏輯電路在某些輸入訊號發生變化時是否會產生冒險,首先要判斷訊號是否會同時變化,然後判斷在訊號同時變化的時候,是否會產生冒險,這可以通過邏輯函式的卡諾圖或邏輯函式表示式來進行判斷。
(1)功能冒險的檢查
功能冒險是由電路的邏輯功能引起的,只要輸入訊號不是按照迴圈碼的規律變化,組合邏輯就可能產生功能冒險,且不能通過修改設計加以消除,只能通過對輸出採用時鐘取樣來消除。
(2)邏輯冒險的檢查
檢查電路是否產生邏輯冒險的方法有兩種,即代數法和卡諾圖法。
① 代數法。如果一個組合邏輯函式表示式F,在某些條件下能化簡成或的形式,在A產生變化時,就可能產生靜態邏輯冒險。
② 卡諾圖法。在組合邏輯的卡諾圖中,若存在素項圈相切,則可能會產生邏輯冒險。如圖8-16 所示的卡諾圖,AC 和兩個素項環相切,在B= C =1時,A 由1 變為0時,將產生邏輯冒險。
3.競爭與冒險在Verilog HDL 設計中的體現
【例8-6】詳細分析Verilog HDL 程式內在的邏輯冒險現象。
首先,給出一段示例程式碼。



程式在ISE中綜合後的RTL級結構圖如圖8-17所示。



上述程式在ISESimulator中的模擬結果如圖8-18所示。從圖8-18所示的模擬波形可以看出,由於“A、B、C、D”4個輸入訊號高低電平變換不是同時發生的,這導致輸出訊號“Out”出現了毛刺。由於無法保證所有連線的長度一致,所以即使4個輸入訊號在輸入端同時變化,但經過可程式設計邏輯器件內部的走線,到達或門的時間也是不一樣的,毛刺必然產生。簡單地說,只要輸入訊號同時變化,組合邏輯必將產生毛刺。將它們的輸出直接連線到時鐘輸入端、清零或置位埠的設計方法是錯誤的,這可能會導致嚴重的後果。所以必須檢查設計中所有時鐘、清零和置位等對毛刺敏感的輸入埠,確保輸入不會含有任何毛刺。



4.毛刺的消除
毛刺並不是對所有的輸入都有危害,例如D觸發器的D輸入端,只要毛刺不出現在時鐘的上升沿並且不滿足資料的建立和保持時間,就不會對系統造成危害,我們可以說D觸發器的D輸入端對毛刺不敏感。根據這個特性,應當在系統中儘可能採用同步電路,這是因為同步電路訊號的變化都發生在時鐘沿,只要毛刺不出現在時鐘的沿口並且不滿足資料的建立和保持時間,就不會對系統造成危害(由於毛刺很短,多為幾納秒,基本上都不可能滿足資料的建立和保持時間)。
因此可以通過改變設計,破壞毛刺產生的條件,來減少毛刺的發生。例如,在數位電路設計中,常常採用格雷碼計數器取代普通的二進位制計數器,這是因為格雷碼計數器的輸出每次只有一位跳變,消除了競爭冒險的發生條件,避免了毛刺的產生。目前,主要有兩種基本的取樣方法,即脈衝選擇法和時序邏輯保持法。
(1)脈衝選擇法
該方法在輸出訊號的保持時間內,用一定寬度的高電平脈衝與輸出訊號做邏輯“與”運算,由此獲取輸出訊號的電平值。例8-7說明了這種方法,取樣脈衝訊號從輸入引腳“Sample”引入。
【例8-7】通過脈衝選擇法修改例8-6電路中的毛刺。



程式的綜合結果如圖8-19所示,其中“Tout_bmp”模組封裝了除脈衝選擇以外的全部電路,脈衝選擇通過與門來實現。
程式的模擬結果如圖8-20所示,從其模擬波形上可以看出,毛刺訊號出現在“Tout”引腳上,而“Out”引腳上的毛刺已被消除了。



以上方法可以大大減少毛刺,但它並不能完全消除毛刺,有時,必須手工修改電路來去除毛刺。通常使用“取樣”的方法。一般說來,冒險出現在訊號發生電平轉換的時刻,也就是說在輸出訊號的建立時間內會發生冒險,而在輸出訊號的保持時間內是不會有毛刺訊號出現的。如果在輸出訊號的保持時間內對其進行“取樣”,就可以消除毛刺訊號的影響。
(2)時序邏輯保持法
脈衝選擇法最大的缺點是必須人為地保證sample訊號在合適的時間產生,另一種更常見的方法即為時序邏輯保持法,其利用D觸發器的D輸入端對毛刺訊號不敏感的特點,在輸出訊號的保持時間內,用觸發器讀取組合邏輯的輸出訊號,這種方法類似於將非同步電路轉化為同步電路。下面給出一個應用例項。
【例8-8】通過D觸發器來消除例8-6所示電路的冒險現象。



上述程式綜合後的RTL級結構圖如圖8-21所示,同樣其中“Tout_bmp”模組封裝了除脈衝選擇以外的全部電路,時序邏輯保持通過D觸發器來實現。
程式的模擬結果如圖8-22所示,從其模擬波形上可以看出,毛刺訊號出現在“Tout”引腳上,而“Out”引腳上的毛刺已被消除了,無需外部輸入取樣控制訊號。



8.1.4 時序邏輯的時鐘選擇策略
從8.1.2節可知,時鐘對於時序邏輯是至關重要的,時鐘的任何一個隨機的抖動都會導致電路重新執行一次,使得邏輯時序發生錯誤跳轉,因此時鐘的質量對時序邏輯是至關重要的。設計時序電路的第一步就是選擇效能優良的時鐘訊號。
1.Xilinx FPGA時鐘資源說明
全域性時鐘和第二全域性時鐘資源是FPGA晶片的重要資源之一,合理地利用該資源可以改善設計的綜合和實現效果;如果使用不當,不但會影響設計的工作頻率和穩定性等,甚至會導致設計的綜合、實現過程出錯。
(1)全域性時鐘
在Xilinx系列FPGA產品中,全域性時鐘網路是一種全域性佈線資源,它可以保證時鐘訊號到達各個目標邏輯單元的時延基本相同。其時鐘分配樹結構如圖8-23所示。



針對不同型別的器件,Xilinx公司提供的全域性時鐘網路在數量、效能等方面略有區別。但一般以全銅工藝實現,差分全域性時鐘控制技術將歪斜與抖動降至最低;再加上專用時鐘緩衝與驅動結構,從而可使全域性時鐘到達晶片內部所有的邏輯可配置單元,且I/O單元以及塊RAM的時延和抖動最小,以滿足高速同步電路對時鐘觸發沿的苛刻需求。
在FPGA設計中,FPGA全域性時鐘路徑需要專用的時鐘緩衝和驅動,具有最小偏移和最大扇出能力,因此最好的時鐘方案是由專用的全域性時鐘輸入引腳驅動的單個主時鐘,去控制設計專案中的每一個觸發器。只要可能就應儘量在設計專案中採用全域性時鐘,因為對於一個設計專案來說,全域性時鐘是最簡單和最可預測的時鐘。
(2)第二全域性時鐘
第二全域性時鐘屬於長線資源,分佈於晶片內部的行、列柵欄(Bank)上,其長度和驅動能力僅次於全域性時鐘資源,也可驅動晶片內部任何一個邏輯資源,其抖動和時延指標僅次於全域性時鐘訊號。在設計中,一般將高頻率、高扇出的時鐘使能訊號以及高速路徑上的關鍵訊號指定為全域性第二時鐘訊號。需要注意的是,第二全域性時鐘資源和全域性時鐘資源的區別:使用全域性時鐘資源並不佔用邏輯資源,也不會影響其他佈線資源;而第二全域性時鐘資源佔用的是晶片內部的資源,需要佔用部分邏輯資源,各個部分的佈線會相互影響,因此建議在邏輯設計佔用資源不超過晶片資源70%時使用。2.全域性時鐘的使用
XilinxFPGA中的全域性時鐘採用全銅工藝實現,並設計了專用時鐘緩衝與驅動結構,可到達晶片內部任何一個邏輯單元,包括可配置邏輯單元(CLB)、I/O管腳、內嵌的塊RAM以及硬核乘法器等模組,且時延和抖動都最小。因此,對於FPGA設計而言,全域性時鐘是最簡單和最可預測的時鐘。最好的時鐘方案就是:由專用的全域性時鐘輸入引腳驅動單個全域性時鐘,並用後者去控制設計中的每一個觸發器,如圖8-24所示。



目前的主流晶片都集成了專用時鐘資源與數字延遲鎖相環,且數目眾多。如面向中低端應用的Spartan3E系列FPGA,最多可提供16個全域性時鐘輸入埠和8個數字時鐘管理模組(DCM);面向高階的Virtex4/5系列晶片,可以提供多達數十個全域性時鐘輸入埠和DCM模組。全域性時鐘主要有以下兩種組合。
(1)IBUFG/ IBUFGDS +BUFG的方法
IBUFG後面連線BUFG的方法是最基本的全域性時鐘資源使用方法,由於IBUFG組合BUFG相當於BUFGP,因此這種使用方法也稱為BUFGP方法。其相應的語法格式如下:
IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN),
.O(CLKIN_IBUFG));
呼叫BUFG原語,將CLKIN_IBUFGDS轉成最終輸出,其典型使用方法如下:
BUFG CLK_BUFG_INST (.I(CLKIN_IBUFGDS),
.O(CLK_OUT));
當輸入時鐘訊號為差分訊號時,需要使用IBUFGDS代替IBUFG,相應的語法格式如下:
//呼叫IBUFGDS原語,將差分時鐘轉換成單端輸出CLKIN_IBUFGDS
IBUFGDS CLKIN_IBUFGDS_INST (.I(CLKIN_P_IN),
.IB(CLKIN_N_IN),
.O(CLKIN_IBUFGDS));
//呼叫BUFG原語,將CLKIN_IBUFGDS轉成最終輸出
BUFG CLK_BUFG_INST (.I(CLKIN_IBUFGDS),
.O(CLK_OUT));
//示例結束
需要注意的是,當訊號從全域性時鐘管腳輸入,不論其是否為時鐘訊號,都必須使用IBUFG或IBUFGDS;反之,如果對訊號使用了IBUFG或IBUFGDS硬體原語,則該訊號一定要從全域性時鐘管腳輸入,否則在佈局佈線時會報錯。IBUFG和IBUFGDS的輸入端僅僅與晶片的專用全域性時鐘輸入管腳有物理連線,與普通IO和其他內部CLB等沒有物理連線。
(2)LOGIC+BUFG的方法
BUFG不但可以驅動IBUFG的輸出,還可以驅動其他普通訊號的輸出。當某個訊號(時鐘、使能、快速路徑)的扇出非常大,並且要求抖動延遲最小時,可以使用BUFG驅動該訊號,使該訊號利用全域性時鐘資源。但需要注意的是,普通IO的輸入或普通片內訊號進入全域性時鐘佈線層需要一個固有的延時,一般在10ns左右,即普通IO和普通片內訊號從輸入到BUFG輸出有一個約10ns左右的固有延時,但是BUFG的輸出到片內所有單元(IOB、CLB、選擇性塊RAM)的延時可以忽略不計,認為其為“0”ns[5]。
相應的呼叫語法如下:
//呼叫BUFG原語,將內部輸入CLK_IN轉成最終輸出CLK_OUT
BUFG CLK_BUFG_INST (.I(CLK_IN),
.O(CLK_OUT));
//示例結束
在軟體程式碼中,可通過呼叫原語IBUFGP來使用全域性時鐘。IBUFGP的基本用法如下:
IBUFGP U1(.I(clk_in), .O(clk_out));
全域性時鐘網路對FPGA設計效能的影響很大,所以建議設計中的主時鐘全部走全域性時鐘網路。
3.第二全域性時鐘的使用
第二全域性時鐘訊號的驅動能力和時鐘抖動延遲等指標僅次於全域性時鐘訊號。Xilinx的FPGA中一般有比較豐富的第二全域性時鐘資源(很多器件有24個第二全域性時鐘資源),以滿足高速、複雜時序邏輯設計的需要。在設計中,一般將頻率較高,扇出數目較多的時鐘、使能、高速路徑訊號指定為第二全域性時鐘訊號[5]。
第二全域性時鐘資源的使用方法比較簡單,可通過在約束編輯器的專用約束(Misc)選項卡中,指定所選訊號使用低抖動延遲資源“LowSkew”來制定。但最直接的方法是直接在指導Xilinx實現步驟的使用者約束檔案(UCF)中新增“USELOWSKEWLINES”約束命令。在約束編輯器中的操作等效於在使用者約束檔案中新增如下內容。
NET "s1" USELOWSKEWLINES;
NET "s2" USELOWSKEWLINES;
NET "s3" USELOWSKEWLINES;