Xilinx FPGA內部資源之時鐘篇1
以下時鐘介紹以Virtex5系列晶片作為參考晶片
從時鐘的角度可以將Xilinx FPGA劃分為若干個時鐘域(Clock Region),不同的FPGA晶片具有不同數量的時鐘域,XC5VLX30有8個時鐘域,XC5VLX330有24個時鐘域。事實上每個時鐘域的大小都是固定的,在Virtex5系列晶片中,每個時鐘域的大小固定為20個CLB,這就導致了晶片越大,時鐘域就越多。
Xilinx FPGA的時鐘包括全域性時鐘、區域性時鐘和I/O時鐘;下面將一一介紹。 **
全域性時鐘
** 首先放一張Xilinx FPGA Virtex 5器件時鐘域的整體佈局圖: 圖中以中間灰色條塊為界將FPGA分為了左右兩個對稱部分。全域性時鐘位於中間灰色條塊中,區域性時鐘分佈在左右兩個對稱區域。 灰色條塊中包含以下各個部分,如下圖所示:
全域性時鐘資源和網路包括以下幾個部分: 1、 全域性時鐘輸入(Global Clock Inputs) 2、 全域性時鐘緩衝器(Global Clock Buffers) 3、 時鐘樹和網路(Clock Tree and Nets-GCLK) 4、 時鐘域(Clock Regions)
全域性時鐘輸入 V5器件具有20個特殊的全域性時鐘輸入位置(20條時鐘輸入線,它們位於灰色條塊的Clock I/O),這些時鐘從I/O口輸入,這些I/O口在不用於時鐘輸入的時候還可以當做普通I/O口使用,輸入的時鐘可以是單端或差分。在實際工程中如果要用到這些全域性時鐘輸入,我們可以在模組中直接例化時鐘原語(Primitives) 其中IBUFG表示輸入時鐘為單端時鐘,IBUFGDS為差分時鐘輸入。Verilog語言表示如下:
IBUFG #( .IOSTANDARD("DEFAULT") ) IBUFG_inst ( .O(O), // Clock buffer output .I(I) // Clock buffer input (connect directly to top-level port) ); IBUFGDS #( .DIFF_TERM("FALSE"), // Differential Termination .IOSTANDARD("DEFAULT") // Specifies the I/O standard for this buffer ) IBUFGDS_inst ( .O(O), // Clock buffer output .I(I), // Diff_p clock buffer input .IB(IB) // Diff_n clock buffer input );
V5器件還有時鐘門原語(BUFGCE,後面將會介紹),用來對輸入時鐘進行使能控制,從而達到降低功耗的目的。
全域性時鐘緩衝器
每一個V5器件包含32個全域性時鐘緩衝器。 可以作為全域性時鐘緩衝器輸入的訊號源包括: 1、 全域性時鐘輸入(不同的全域性時鐘緩衝器的輸入可以共享) 2、 CMT輸出(DCMs時鐘輸出和PLLs時鐘輸出) 3、 其他全域性時鐘緩衝器輸出 4、 通用互連網路 全域性時鐘緩衝器原語表示如下表: 表格中所有的原語都來源於BUFGCTRL原語。BUFGCTRL原語的原理圖如下所示: 實際就是根據控制端來選擇輸出的時鐘是I0還是I1;真值表如下所示: BUFG : BUFG是一個簡單的全域性時鐘緩衝器,BUFG和BUFGCTRL的關係如圖所示: 時鐘緩衝器可以用作時鐘的相位移動,在做輸出時鐘緩衝器使用時可以增強時鐘的驅動能力防止負載對時鐘源的干擾等等作用。在做相位移動時的輸入輸出時序圖如下所示: BUFGCE和BUFGCE_1 不同於BUFG,BUFGCE是一個帶有時鐘輸入、時鐘輸出和時鐘使能端的時鐘緩衝器。使能端CE是高電平有效的,BUFGCE和BUFGCTRL的關係如下圖所示: 這裡注意使能端CE的使用:如果CE在輸入時鐘的上升沿之前變為低,那麼輸入時鐘將不能通過BUFGCE,從而輸出時鐘保持為低電平。而如果CE在時鐘的上升沿之後(高電平期間)變為低,將不會對輸出有影響,直到上升沿到來。時序圖如下所示: BUFGCE_1和BUFGCE類似,這裡不再贅述。 還有其他一些的全域性時鐘緩衝器,這裡不再詳細介紹,有需要的可以檢視Xilinx官方手冊。 此處需要注意的是,在實際使用中往往需要用到各個時鐘緩衝器的級聯使用。例如你可能會把全域性時鐘輸入緩衝器(IBUFG和IBUFGDS)和全域性時鐘緩衝器(BUFG等等)級聯使用,這時一定要確保IBUFG和IBUFGDS處於級聯線路的最前端,否則會報錯。 對差分時鐘緩衝器而言,它同時也可以當做單端來使用,此時一定要確保連線的埠是P埠而不是N埠,N埠應該保持懸空。
時鐘樹和網路
V5時鐘樹是專為低抖動、低功耗而設計的。所有的全域性時鐘線和緩衝器都是差分互補的,這樣可以得到一個更好的佔空比和共模噪聲抑制。
時鐘域
前面對時鐘域進行了簡單的介紹,這裡說明以下,單獨看每一個時鐘域,它是屬於區域性時鐘,但是從整體上看,每一個時鐘域同時也是全域性時鐘的組成部分; 劃分時鐘域的主要目的就是為了使時鐘在FPGA內部能夠均勻的分佈,儘量減少因為距離而導致的時鐘延遲從而產生時鐘抖動。其中,XC5VLX30有8個時鐘域,XC5VLX330有24個時鐘域,如下圖所示:
區域性時鐘
區域性時鐘網路包括區域性時鐘和I/O時鐘,它是一組獨立於全域性時鐘網路的時鐘網路。不同於全域性時鐘訊號,區域性時鐘訊號(BUFR)只能跨越3個時鐘域,其中,I/O時鐘訊號僅能驅動一個時鐘域的訊號。這些區域性時鐘網路對於源同步介面的設計是非常有用的。在V5器件中,區域性時鐘源和網路由以下四個路徑和部分組成: 1、 Clock Capable I/O 2、 I/O時鐘緩衝器(BUFIO) 3、 區域性時鐘緩衝器(BUFR) 4、 區域性時鐘網路
Clock Capable I/O
通常一個時鐘域中含有4個clock-capable I/O管腳對(中間列除外)。Clock-capable I/O對是一種在和周圍時鐘資源具有特殊硬體連線位置上的常規I/O對,一些全域性時鐘輸入也是clock-capable I/O。當這些I/O被用作時鐘輸入,它能夠驅動BUFIO和BUFR,但是它不能直接和全域性時鐘緩衝器相連。需要注意的是,處於中間列位置的clock-capable I/Os 不能夠驅動BUFRs。當clock-capable I/O管腳對只用單端引腳時,和前述global clock buffers一樣,輸入訊號應該和P端相連而不是N端(只有P端是和輸出直接相連的)。
BUFIO
BUFIO(I/O Clock Buffer)獨立於全域性時鐘,它被用來驅動位於I/O列裡面的專用時鐘網路。因此,BUFIOs特別適合源同步資料捕獲類的應用。BUFIOs僅能由位於相同時鐘域的clock-capable I/Os來驅動,一個時鐘域裡面包含4個BUFIO;同BUFR一樣,每一個BUFIO可以驅動相同時鐘域或bank中的一條I/O時鐘網路,但是, BUFIO不能夠驅動邏輯資源如:CLB,block RAM,IODELAY等;如下圖所示: BUFIO的原語特別簡單,僅包含一個時鐘輸入和一個時鐘輸出: 圖中我們可以看到,clock-capable I/O是和普通I/O相類似的I/O,且是以一對的形式存在的。clock-capable I/O的輸入接外部時鐘,輸出接BUFIO或BUFR,通過這兩種緩衝器將時鐘送入專用時鐘網路。
BUFR
BUFR是另一種在V5器件中存在的區域性時鐘緩衝器,BUFR用來驅動一個時鐘域中的專用時鐘訊號,它獨立於全域性時鐘樹。每一個BUFR可以驅動它所在時鐘域裡面的4條時鐘網路,以及和當前時鐘域相鄰的兩個時鐘域裡面的時鐘網路。不同於BUFIO,BUFR除了可以驅動I/O邏輯之外,還可以驅動其他邏輯資源(CLB,blockRAM等)。此外,BUFR還可以用作時鐘分頻器,分頻值在1到8之間的整數,它的原語如下: 以下是BUFR的使用者使用模型: 圖中可以看到,BUFR的輸入同樣來自clock-capable I/O的輸出,不同於BUFIO的輸出僅能指向其他I/O,BUFR的輸出可以指向當前時鐘區域和I/O以及各種邏輯資源,向上To Region Above,向下To Region Below;包含當前域最多時鐘跨度為三個時鐘域。
區域性時鐘網路
區域性時鐘網路和全域性時鐘網路驅動能力和設計意圖相同,不同的是作用域。區域性時鐘網路作用域僅限於一個時鐘域,不會在整個器件中傳播,一個時鐘域裡面有四個獨立的區域性時鐘網路: 圖中大方框裡面包含四個小的矩形方框,這四個矩形方框就是時鐘域,在時鐘域裡面的四條黑線就是四條獨立的區域性時鐘網路。 例化BUFR是使用區域性時鐘網路的前提,一個BUFR可以最多驅動兩個相鄰時鐘域的區域性時鐘網路(共三個),而處於頂部和底部的BUFR則只能驅動頂部的下面和底部的上面相鄰的時鐘域。
以上的資料大部分來自於官方的資料手冊,如果想要了解更多的時鐘方面的內容,可以查閱官方手冊UG190.