關于一款芯片,最權威、最新的資料當然是廠家的官方文件。很多大牛都推薦直接閱讀原廠的 datasheet 和 user guide。根據我的體驗,這確實是最好的途徑。原因有兩個:
- 首先,市面上的書一般都落后業界的步伐,我們看到的很多書上的資料都是過時的。
- 其次,市面上書(尤其是國內)很多都是簡單的翻譯手冊而來的,而且雖然作者標的是某某大學的教授,事實上都是教授手下的研究生替老師干活翻譯的,不能保證翻譯的正確性。
實驗室有的芯片是 Xilinx 的 Virtex-5 系列,Virtex-5 的 User Guide 是 UG190,以下內容都是從中摘抄的筆記。
Three Types of clock resource(三種時鐘資源)
1、Global Clocks(全局時鐘)
- 為了時鐘目的,每個 Virtex-5 系列的器件內部都被分成不同的區域(regions),隨著器件的尺寸不同,最小的有 8 個區域,最大的有 24 個區域。
- 全局時鐘資源(Global I/O)和局部時鐘資源可以完成所有的復雜的 / 簡單的時鐘要求。
- 不推薦使用其他的非時鐘資源(比如局部布線資源)來完成時鐘功能。
- 每個 Virtex-5 系列的器件都有 32 條全局時鐘線 (global clock line),可以驅動片上的所有時序資源(CLB、BRAM、CMTs、I/O),也可以驅動其他的邏輯信號。
- 這些全局時鐘線可以用在任何一個區域中。
- 全局時鐘線只能由全局時鐘緩沖器(global clock buffer)驅動。
- 全局時鐘緩沖器一般由時鐘管理塊(Clock Management Tile, CMT)驅動,以減少時鐘布線延時或者調整和另外一個時鐘的相對延時。
- 全局時鐘的個數比 CMTs 多,但是一個 CMT 可以驅動多個全局時鐘。
2、Regional Clocks(區域時鐘)
- 每個區域(region)含有 2 個局部時鐘緩沖器(regional clock buffer)和 4 個局部時鐘樹(regional clock tree)。
- 除了處于芯片中心列的組(bank)外,一個 Virtex -5 I/O bank 恰好橫跨一個區域。大小和區域完全相同的每個組含有 4 個 clock-capable 的時鐘輸入。
- 每個輸入可以差分驅動或單端驅動同一組或區域中的四個 I/O 時 鐘(I/O clocks)和兩個區域時鐘(regional clock)。
3、I/O clocks(I/O時鐘)
- 第三種時鐘資源是 I/O clocks,可以達到非常高的速度,用于局部的 I/O 串行器/解串器。
Global Clocking Resources(全局時鐘資源)
- 全局時鐘(global clocks)是個專用網絡,是專為覆蓋對 FPGA 中各種資源的所有時鐘輸入設計的。
- 全局時鐘資源包括
- Global Clock Inputs
- Global Clock Buffers
- Clock Tree and Nets-GCLK
- Clock Regions
Global Clock Inputs
Virtex-5 FPGA 包含專用的全局時鐘輸入位置,這些輸入位置即使不用作時鐘輸入,也可用作常規用戶 I/O。
每個器件有 20 個全局時鐘輸入。
時鐘輸入可以按任意 I/O 標準配置,包括差分 I/O 標準。每個時鐘輸入可以是單端輸入,也可以是差分輸入。
Global Clock Input Buffer Primitives(全局時鐘輸入緩沖原語)
IBUFG,單端輸入全局緩沖
IBUFGDS,差分輸入全局緩沖
Global Clock Buffers
- 每個 Virtex-5 器件有 32 個全局時鐘緩沖器。
- 每半個晶片 (上半 / 下半)包含 16 個全局時鐘緩沖器。
- 全局時鐘緩沖器允許各種時鐘源 / 信號源接入全局時鐘樹和網。可以輸入全局時鐘緩沖器的源包括:
- Global clock inputs
- Clock Management Tile (CMT) outputs including:
- Digital Clock Managers (DCMs)
- Phase-Locked Loops (PLLs)
- Other global clock buffer outputs
- General interconnect
- 全局時鐘緩沖器只能由同半個晶片 (上半 / 下半)中的源驅動。
- 但是,在一個時鐘區域中僅能驅動十個不同的時鐘。
- 一個時鐘區域 (20 個 CLB)是由上十個 CLB 行和下十個 CLB 行組成的時鐘樹的一個 枝。
- 一個時鐘區域僅橫跨器件的一半。、
- Global Clock Buffer Primitives
- BUFGCTRL、BUFG、BUFGCE、BUFGCE_1、BUFGMUX、BUFGMUX_1、BUFGMUX_CTRL
- 其他所有原語均出自 BUFGCTRL 的軟件預設置。
- BUFG 全局緩沖
- BUFGCE 帶有時鐘使能(CE)的全局緩沖(BUFG)
- BUFGMUX 全局時鐘選擇緩沖
- BUFGP = IBUFG + BUFG
- BUFGDLL 全局緩沖延遲鎖相環(舍,被 DCM 代替)
Clock Tree and Nets - GCLK
- Virtex-5 時鐘樹是為低歪斜和低功耗操作設計的。
- 任何未用分枝都不連接。
- 當所有邏輯資源都使用時,時鐘樹還管理負載 / 扇出。
- 所有全局時鐘線和緩沖器都以差分形式實現,這有助于大大改善占空比和共模噪聲抑制能力
- 在 Virtex-5 架構中,全局時鐘線的引腳接入不僅限于邏輯資源的時鐘引腳。全局時鐘線不用局部互連即可接入 CLB 中的其他引腳。
Clock Regions
- Virtex-5 器件通過使用時鐘區域改善時鐘控制分配。
- 每個時鐘區域最多可有十個全局時鐘域。
- 這十個全局時鐘可以由 32 個全局時鐘緩沖器的任意組合驅動。
How to use global clock
Xilinx 芯片全局時鐘資源的使用方法主要有 5 種:
-
IBUFG + BUFG
最基本的全局時鐘資源使用方法,也稱為 “ BUFGP 法 ” -
IBUFGDS + BUFG
當時鐘信號為差分形式時,需要用 IBUFGDS 代替 IBUFG -
IBUFG + DCM + BUFG
最靈活的使用方法(一般外部提供的時鐘都需要倍頻、分頻、移相等操作以后才可以使用,所以中間需要 DCM) -
Logic + BUFG
BUFG 的輸入可以是普通信號,當某個信號(時鐘、使能、快速路徑)的扇出非常大、要求抖動延遲最小時,可以使用 BUFG 來驅動這個信號,使這個信號利用全局時鐘資源。 -
Logic + DCM + BUFG
DCM 的輸入也可以是普通信號,所以上面的例子中的信號需要倍頻、分頻等操作時,需要在中間添加 DCM 。
在具體使用這些組合方式時,有兩種例化方式:
- 在設計中直接例化全局時鐘資源
比較簡單,按照需求例化上面 5 種組合方式即可。 - 在綜合階段/實現階段通過約束文件的方式實現
隨著綜合工具/布局布線工具的不同而變化,大多數綜合工具會自動分析時鐘信號的扇出數目,在全局時鐘資源富裕的情況下,使扇出數目最大的信號自動指定使用全局時鐘資源。這時候我們必須保證滿足下面的原則,否則會報錯。如果不能滿足,則必須在約束文件中明確聲明該信號不使用全局時鐘資源。
NET "CLK" CLOCK_DEDICATED_ROUTE = FALSE;
Principle in Using global clock
原則: 使用 IBUFG / IBUFGDS 的必要條件是信號從全局時鐘引腳輸入。
也就是說,如果某個信號從全局時鐘引腳輸入,不管它是否為時鐘信號,必須使用 IBUFG/IBUFGDS;如果對某個信號使用了 IBUFG/IBUFGDS,則這個信號必須從全局時鐘引腳輸入。
原因: 由 Xilinx FPGA 內部結構決定的,IBUFG/IBUFGDS 的輸入端僅和芯片的全局時鐘引腳有物理連接,與普通的 I/O 和其他內部 CLB 等沒有物理連接。
P.S. 第二全局時鐘資源
在看其他資料時,看到一種新的時鐘資源 —— 第二全局時鐘資源。官方的文檔我還沒有找到,所以就直接摘抄書上的筆記了 =.=
- 第二全局時鐘資源屬于長線資源,長度和驅動能力僅次于全局時鐘資源,也可以驅動芯片內部的任何一個邏輯,抖動和延時僅次于全局時鐘。
- 在設計中,一般將高頻率、高扇出的時鐘使能信號以及高速路徑上的關鍵信號指定為全局第二時鐘信號。
- 使用全局時鐘資源并不占用邏輯資源,也不影響其他布線資源;第二時鐘資源占用的是芯片內部的資源,占用部分邏輯資源,各個部分的布線會相互影響,所以建議在設計中邏輯占用資源不超過70%時使用。
使用方法
可以在約束編輯器中的專用約束Misc選項中,指定所選信號使用低抖動延遲資源“Low Skew”來指定,也可以在ucf文件中添加“USELOWSKEWLINES"約束命令。
NET “s1" USELOWSKEWLINES;
NET “s2" USELOWSKEWLINES;
NET “s3" USELOWSKEWLINES;
Regional Clocking Resources(區域時鐘資源)
- 區域時鐘網絡是一組獨立于全局時鐘網絡的時鐘網絡。
- 與全局時鐘不同,區域時鐘信號 (BUFR) 的跨度限于三個時鐘區域,而 I/O 時鐘信號只驅動一個區域。
- Virtex-5 時鐘控制資源和網絡由以下通路和組件構成:
- Clock Capable I/O
- I/O Clock Buffer (BUFIO)
- Regional Clock Buffer (BUFR)
- Regional Clock Nets
Clock Capable I/O
- 典型時鐘區域中有四個 clock-capable I/O 引腳對 (中心列有例外)。
- 有些全局時鐘輸入也是 clock capable I/O。
- 每個組中有四個專用 clock capable I/O 區。
- 當用作時鐘輸入時,clock-capable 引腳可以驅動 BUFIO 和 BUFR。
- 這些引腳不能直接連接到全局時鐘緩沖器。
I/O Clock Buffer - BUFIO
- I/O 時鐘緩沖器 (BUFIO) 是可以在 Virtex-5 器件中使用的一種時鐘緩沖器。
- BUFIO 驅動 I/O 列內一個獨立于全局時鐘資源的專用時鐘網。
- BUFIO 只能由位于同一時鐘區域的 clock capable I/O 驅動。
- 典型的時鐘區域中有四個 BUFIO。
- BUFIO 不能驅動邏輯資源 (CLB、Block RAM 等),因為 I/O 時鐘網絡只能覆蓋同一組或時鐘區域內的 I/O 列。
-
BUFIO Primitive
BUFIO 其實就是一個時鐘輸入和時鐘輸出緩沖器。輸入與輸出之間有一個相位延遲。
Regional Clock Buffer - BUFR
- 區域時鐘緩沖器 (BUFR) 是可以在 Virtex-5 器件中使用的另一種時鐘緩沖器。
- BUFR 將時鐘信號驅動到時鐘區域內一個獨立于全局時鐘樹的專用時鐘網。
- 每個 BUFR 可以驅動其所在區域中的四個區域時鐘和相鄰區域 (最多三個時鐘區域)中的四個時鐘網。
- 與 BUFIO 不同,BUFR 不僅可以驅動其所在時鐘區域和相鄰時鐘區域中的 I/O 邏輯,還可以驅動其中的邏輯資源 (CLB、Block RAM 等)。
- 典型的時鐘區域 (四個區域時鐘網絡)中有兩個 BUFR。中心列沒有 BUFR。
-
BUFR Primitive
BUFR 是一個具有輸入時鐘分頻功能的時鐘輸入 / 時鐘輸出緩沖器。
Regional Clock Nets
- 除了全局時鐘樹和網(global clock trees and nets),Virtex-5 器件還包含區域時鐘網(Regional Clock Nets)。
- 這些時鐘樹也是為低歪斜和低功耗操作設計的。
- 未用分枝都不連接。
- 當所有邏輯資源都使用時,時鐘樹還管理負載 / 扇出。
- 區域時鐘網的傳播并非遍及整個 Virtex-5 器件,而是僅限于一個時鐘區域。
- 一個時鐘區域包含四個獨立的區域時鐘網。
- 要接入區域時鐘網,BUFR 必須例化。
- 一個 BUFR 最多可以驅動兩個相鄰時鐘區域中的區域時鐘。
Clock Management Technology(時鐘管理技術)
- Virtex-5 系列的芯片內部含有的時鐘管理模塊(Clock Management Tiles,CMTs)可以提供靈活的、高性能的時鐘信號。
- 每個 CMT 由 2 個 DCM 和 1 個 PLL 組成。
DCM
- DCM 原語有兩個:DCM_BASE、DCM_ADV
- DCM_BASE 提供基本的功能,比如去歪斜、頻率合成、固定相移;
- DCM_ADV 提供更高級的功能,比如動態重配置。
- 兩個原語都有各自的輸入輸出端口、屬性設置和狀態標識
- DCM 可以連接到芯片上的其他時鐘資源,包括專用時鐘 I/O,時鐘緩沖器和PLL
PLL
- Virtex-5 芯片最多包含了 6 個 CMT 模塊,每個 CMT 模塊包含一個 PLL,PLL 主要用來廣譜頻率的合成,并且與 DCM 配合最為外部/內部時鐘的抖動濾波器。
- PLL 也有兩個原語:PLL_BASE、PLL_ADV
- PLL_BASE 提供基本的功能,比如時鐘去歪斜、頻率合成、精確相移、占空比調整;PLL_ADV 提供更高級的功能,比如時鐘切換、動態重配置等。
MMCM
- 不同系列的芯片內部的時鐘管理模塊是不同的,比如在 Virtex-5 系列后的芯片就含有了 混合模式時鐘管理器 MMCM 。
- 具體實現時該如何選擇 DCM、DLL、PLL、MMCM ?找到一篇介紹 Xilinx 時鐘資源的文章:
如何正確使用FPGA的時鐘資源
Other Tips
- 一般來說,外部提供的時鐘信號都需要進行倍頻/分頻才可以使用,這時候需要組合各種時鐘緩沖器和 DCM、PLL 等模塊,我們有兩種方法:
- 代碼中例化原語,手動組合各種時鐘緩沖器和 DCM、PLL
- 使用 IP core 向導,創建時鐘管理器(可以發現 IP core 生成的代碼就是上面 5 種組合方式)
- 個人感覺使用第二種方法應該更加簡潔、方便,不容易出錯吧。(如果在代碼中沒有明確聲明使用buffer,ISE 綜合屬性、IP core 屬性設置里面默認會給所有的輸入輸出自動加上緩沖器)
- 對 FPGA 設計而言,全局時鐘是最簡單最可預測的時鐘,最好的時鐘方案是:由專用的全局時鐘輸入引腳驅動單個全局時鐘,并用后者去控制設計中的每個觸發器。全局時鐘資源是專用布線資源,存在與全銅布線層上,使用全局時鐘資源不影響芯片的其他布線資源,因此在可以使用全局時鐘的時候盡可能使用。
Summary
- 雖然各個芯片都不盡相同,但是了解相關的基本知識有利于我們快速掌握芯片的時鐘資源、快速上手。
- Xilinx 的所有器件上的時鐘資源可以分為前面說的 3 類:全局時鐘(global clock)、局部時鐘(regional clock)、I/O 時鐘(I/O clock),但是不同的器件內部含有的時鐘管理模塊是不同的,具體到每一款芯片,應該以對應的 User Guide 為準。