目前,大型設計一般推薦使用同步時序電路。同步時序電路基於時鐘觸發沿設計,對時鐘的週期、佔空比、延時和抖動提出了更高的要求。爲了滿足同步時序設計的要求,一般在FPGA設計中採用全局時鐘資源驅動設計的主時鐘,以達到最低的時鐘抖動和延遲。 FPGA 全局時鐘資源一般使用全銅層工藝實現,並設計了專用時鐘緩衝與驅動結構,從而使全局時鐘到達芯片內部的所有可配置單元(CLB)、I/O單元(IOB)和選擇性塊RAM(Block Select RAM)的時延和抖動都爲最小。爲了適應複雜設計的需要,Xilinx的FPGA中集成的專用時鐘資源與數字延遲鎖相環(DLL)的數目不斷增加,最新的 Virtex II器件最多可以提供16個全局時鐘輸入端口和8個數字時鐘管理模塊(DCM)。
1.緩衝和驅動
FPGA全局時鐘資源一般使用全銅層工藝實現,並設計了專用時鐘緩衝與驅動結構,從而使全局時鐘到達芯片內部的所有可配置單元(CLB)、I/O單元(IOB)和選擇性塊RAM(Block Select RAM)的時延和抖動都爲最小。然後將那些原語分爲兩類:1,緩衝。2,驅動。
緩衝:就是輸入緩衝或者輸出緩衝,這些緩衝主要用來片外輸入時鐘或者片外差分輸入的信號處理,因爲FPGA有對時鐘的專門資源,同時也要保證時鐘的精準,有效解決顫抖、延遲等問題,另外就是差分信號(包括差分時鐘)進入片內之後不經過IBUFGDS、IBUFDS緩衝無法直接處理。另外對於時鐘來說,時鐘引腳的輸入只能接IBUGDS緩衝器,IBUFG和IBUFGDS的輸入端僅僅與芯片的專用全局時鐘輸入管腳有物理連接,與普通IO和其它內部CLB等沒有物理連接。如果不用原語鏈接這兩部分時鐘信號無法到達芯片內部的CLB等資源,也就是無法使用。(補充:IBUGDS和時鐘輸入引腳爲對應的,也就是IBUGDS的輸入必須爲時鐘引腳,時鐘引腳必須鏈接IBUFGDS。這段中IBUFGDS 也可以換成IBUFG) 對了還有一個OBUFDS就是差分輸出緩衝。
驅動:驅動在時鐘約束部分說過,當信號扇出過大是可以通過加BUFG來增加穩定性,這裏的BUFG就是全局緩衝,以BUFG爲例,該原語的輸入信號可以是IBUFGDS的輸出也可以是邏輯信號的輸出(內部信號),但是過一次BUFG有大約10ns的延時,但是通過BUFG之後輸出到片內所有單元的延時可以忽略不計,另外一個典型的TTL邏輯門最多有10個扇出信號,而緩衝器可以驅動20到30個扇出信號,在這裏可以理解爲反相器,反相器一般情況下扇出較大。
一般情況下IBUFGDS+BUFG或者IBUFG+BUFG可配套使用,當全局時鐘扇出較少的時候可以不加BUFG。
2.BUF類別和作用
與全局時鐘資源相關的原語常用的與全局時鐘資源相關的Xilinx器件原語包括:IBUFG、IBUFGDS、BUFG、BUFGP、BUFGCE、BUFGMUX、BUFGDLL和DCM等
- IBUFG即輸入全局緩衝,是與專用全局時鐘輸入管腳相連接的首級全局緩衝。所有從全局時鐘管腳輸入的信號必須經過IBUFG 單元,否則在佈局佈線時會報錯。 IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVPECL、LVTTL、PCI、PCIX和 SSTL等多種格式的IO標準。
- IBUFGDS是IBUFG的差分形式,當信號從一對差分全局時鐘管腳輸入時,必須使用IBUFGDS作爲全局時鐘輸入緩衝。IBUFG支持BLVDS、LDT、LVDSEXT、LVDS、LVPECL和ULVDS等多種格式的IO標準。
-
BUFG是全局緩衝,它的輸入是IBUFG的輸出,BUFG的輸出到達FPGA內部的IOB、CLB、選擇性塊RAM的時鐘延遲和抖動最小。
-
BUFGCE是帶有時鐘使能端的全局緩衝。它有一個輸入I、一個使能端CE和一個輸出端O。只有當BUFGCE的使能端CE有效(高電平)時,BUFGCE纔有輸出。
-
BUFGMUX是全局時鐘選擇緩衝,它有I0和I1兩個輸入,一個控制端S,一個輸出端O。當S爲低電平時輸出時鐘爲I0,反之爲I1。需要指出的是BUFGMUX的應用十分靈活,I0和I1兩個輸入時鐘甚至可以爲異步關係。
-
BUFGP相當於IBUG加上BUFG。
-
BUFGDLL是全局緩衝延遲鎖相環,相當於BUFG與DLL的結合。BUFGDLL在早期設計中經常使用,用以完成全局時鐘的同步和驅動等功能。隨着數字時鐘管理單元(DCM)的日益完善,目前BUFGDLL的應用已經逐漸被DCM所取代。
-
DCM即數字時鐘管理單元,主要完成時鐘的同步、移相、分頻、倍頻和去抖動等。DCM與全局時鐘有着密不可分的聯繫,爲了達到最小的延遲和抖動,幾乎所有的DCM應用都要使用全局緩衝資源。DCM可以用Xilinx ISE軟件中的Architecture Wizard直接生成。
輸出緩衝器,用於將輸出信號驅動到FPGA器件引腳,這些引腳不需要是三態的(恆定驅動)。 必須將OBUF,OBUFT,OBUFDS或OBUFTDS連接到設計中的每個輸出端口。該元件隔離內部電路併爲離開芯片的信號提供驅動電流。 它存在於輸入/輸出塊(IOB)中。 其輸出(O)連接到OPAD或IOPAD。
- OBUF是一個簡單的輸出緩衝器。
- OBUFDS是差分信號輸出緩衝。
- OBUFT單個3態輸出緩衝器,具有輸入I,輸出O和低電平有效輸出使能(T)。該元件使用LVTTL標準。 默認值爲DRIVE = 12 mA和SLOW轉換。當T爲低時,緩衝器輸入的數據被傳送到相應的輸出。 當T爲高電平時,輸出爲高阻抗(關閉或Z狀態)。 OBUFT通常在需要具有3態功能的單端輸出時使用,例如構建雙向I / O時的情況。
- OBUFTDS單個3態輸出緩衝器,具有差分輸入I,輸出O和低電平有效輸出使能(T)。
3.全局時鐘資源的使用方法(五種)
(1)IBUFG + BUFG的使用方法:
IBUFG後面連接BUFG的方法是最基本的全局時鐘資源使用方法,由於IBUFG組合BUFG相當於BUFGP,所以在這種使用方法也稱爲BUFGP方法。
(2)IBUFGDS + BUFG的使用方法:
當輸入時鐘信號爲差分信號時,需要使用IBUFGDS代替IBUFG。
(3)IBUFG + DCM + BUFG的使用方法:
這種使用方法最靈活,對全局時鐘的控制更加有效。通過DCM模塊不僅僅能對時鐘進行同步、移相、分頻和倍頻等變換,而且可以使全局時鐘的輸出達到無抖動延遲。
(4)Logic + BUFG的使用方法:
BUFG不但可以驅動IBUFG的輸出,還可以驅動其它普通信號的輸出。當某個信號(時鐘、使能、快速路徑)的扇出非常大,並且要求抖動延遲最小時,可以使用BUFG驅動該信號,使該信號利用全局時鐘資源。但需要注意的是,普通IO的輸入或普通片內信號進入全局時鐘佈線層需要一個固有的延時,一般在 10ns左右,即普通IO和普通片內信號從輸入到BUFG輸出有一個約10ns左右的固有延時,但是BUFG的輸出到片內所有單元(IOB、CLB、選擇性塊RAM)的延時可以忽略不計爲“0”ns。
(5) Logic + DCM + BUFG的使用方法:
DCM同樣也可以控制並變換普通時鐘信號,即DCM的輸入也可以是普通片內信號。使用全局時鐘資源的注意事項全局時鐘資源必須滿足的重要原則是:使用 IBUFG或IBUFGDS的充分必要條件是信號從專用全局時鐘管腳輸入。換言之,當某個信號從全局時鐘管腳輸入,不論它是否爲時鐘信號,都必須使用 IBUFG或IBUFGDS;如果對某個信號使用了IBUFG或IBUFGDS硬件原語,則這個信號必定是從全局時鐘管腳輸入的。如果違反了這條原則,那麼在佈局佈線時會報錯。這條規則的使用是由FPGA的內部結構決定的:IBUFG和IBUFGDS的輸入端僅僅與芯片的專用全局時鐘輸入管腳有物理連接,與普通IO和其它內部CLB等沒有物理連接。另外,由於BUFGP相當於IBUFG和BUFG的組合,所以BUFGP的使用也必須遵循上述的原則。
4.全局時鐘資源的例化方法
全局時鐘資源的例化方法大致可分爲兩種:
(1)在程序中使用原語直接例化全局時鐘資源;
(2)通過綜合階段約束或者實現階段約束實現對全局時鐘資源的使用;
第一種方法比較簡單,用戶只需按照前面講述的5種全局時鐘資源的基本使用方法編寫代碼或者繪製原理圖即可。
第二方法是通過綜合階段約束或實現階段的約束完成對全局時鐘資源的調用,這種方法根據綜合工具和佈局佈線工具的不同而異。
下面詳細說明:
IBUFDS:Differential Signaling Input Buffer with Selectable I/O Interface //差分輸入時鐘緩衝器
IBUFDS是一個輸入緩衝器,支持低壓差分信號(如LVCMOS、LVDS等)。在IBUFDS中,一個電平接口用兩個獨特的電平接口(I和IB)表示。一個可以認爲是主信號,另一個可以認爲是從信號。主信號和從信號是同一個邏輯信號,但是相位相反。
IBUFDS instance_name (.O (user_O),
.I (user_I),
.IB (user_IB));
IBUFGDS
Dedicated(專用的) Differential Signaling Input Buffer with Selectable I/O Interface //專用差分輸入時鐘緩衝器
IBUFGDS是一個連接時鐘信號BUFG或DCM的專用的差分信號輸入緩衝器。在IBUFGDS中,一個電平接口用兩個獨立的電平接口(I和IB)表示。一個可以認爲是主信號,另一個可以認爲是從信號。主信號和從信號是同一個邏輯信號,但是相位相反。
IBUFGDS instance_name (.O (user_O),
.I (user_I),
.IB (user_IB));
OBUFDS
Differential Signaling Output Buffer with Selectable I/O Interface//差分輸出時鐘緩衝器
OBUFDS是一個輸出緩衝器,支持低壓差分信號。OBUFDS隔離出了內電路並向芯片上的信號提供驅動電流。它的輸出用O和OB兩個獨立接口表示。一個可以認爲是主信號,另一個可以認爲是從信號。主信號和從信號是同一個邏輯信號,但是,相位相反。
OBUFDS instance_name (.O (user_O),
.OB (user_OB),
.I (user_I));
5.應用方案
例如FPGA的時鐘有外部晶振提供,我內部處理需要多個頻率的時鐘,這時候也許需要使用多個分頻器(PLL,或MMCM等),外部晶振進來的時鐘不能驅動多個PLL(兩個都不能),我們需要使用IBUFG或IBUFGDS原語,外部時鐘是單端的就用IBUFG,如果是差分的,就用IBUFGDS之後在驅動各個PLL,(也就是作爲PLL的輸入),就沒有問題。
上面所說的也就是一個時鐘上樹問題,上全局時鐘樹,讓輸入時鐘信號變得驅動能力強,產生的時鐘偏斜小,抖動小。IBUFG,IBUFGDS
BUFG叫 Global Clock Simple Buffer,自然和時鐘有關,它的作用是使經過這個Buffer的信號能夠具有高扇出,驅動能力強的能力,使信號接入全局佈線資源,使得信號具有低偏斜的特性;既然是一個時鐘buffer,當然時鐘信號首當其衝,但不僅僅侷限於此,還可以是復位,置位以及時鐘使能等需要具有高扇出的信號。
但這個buffer必須需要組合使用,不需要你在Verilog設計中去例化。
一般情況下IBUFGDS+BUFG或者IBUFG+BUFG可配套使用,當全局時鐘扇出較少的時候可以不加BUFG。
一般FPGA的輸入時鐘(一般來自晶振)先經過IBUFGDS,之後的BUFG可以根據綜合工具進行推斷是否組合使用。IBUFGDS需要自己例化,例如:
IBUFG #(
.IBUF_LOW_PWR("TRUE"), // Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
.IOSTANDARD("LVCMOS18") // Specify the input I/O standard
) IBUFG_inst (
.O(fpga_clk), // Clock buffer output
.I(fpga_clk1) // Clock buffer input (connect directly to top-level port)
);
上面都是講的時鐘信號,那非時鐘信號呢?有時候也會有一些需求,例如AD採樣出來的數據是差分數據,我需要轉換爲單端信號在FPGA內部進行數據處理,我就需要差分轉單端的Buffer,例如:
generate
genvar j;
for(j=0;j<10;j=j+1): ibufds10
begin
IBUFDS ibufds_inst1
(
.I(ad1_bp[j]),
.IB(ad1_bn[j]),
.O(ad_data_b[j])
);
end
endgenerate
IBUFDS這個原語是針對信號的,能夠改善信號完整性,使用這個原語的原因在於差分信號在片內不經過這個原語不能直接處理。我們平時使用的selectIO IP核的信號輸入也可以是差分的,其實內部也用到了這些原語