當我剛開始我的FPGA設計生涯時,我對明顯更小、更不靈活的 FPGA(想想 XC4000XL / Clcyone3/4和 Spartan)和工具的非常簡單的時鐘規則之一是盡可能只使用單個時鐘。當然,這并不總是可能的,但即便如此,時鐘的數量仍然有限。
多年來,當我們轉向功能更強大的設備和工具后,我們經常能發現自己的設計具有復雜的時鐘結構,其中包括有源同步設備,如連接到處理器的 AXI 時鐘、信號鏈時鐘,并且需要處理跨時鐘域問題(在視頻應用中尤其常見)。
這意味著我們有一個復雜的時鐘環境——一個很容易出現時鐘錯誤的環境。這將導致時序很難收斂或更產生糟糕的情況,例如引入無意的時鐘域交叉錯誤,從而導致數據或控制信號跟隨損壞。
我們將從 7 系列FPGA開始我們的旅程。當我們考慮時鐘規劃時,我們需要確保使用設備內最合適的資源并了解其內部時鐘架構。我們只需要簡單的確保時鐘信號連接到 IO 上適當的時鐘引腳的日子已經一去不復返了。
時鐘規劃有兩個方面。第一個來自設計本身的架構。在這里,在這個架構中,我們決定設計有多少時鐘以及它們之間的關系。理想情況下,除了盡量減少使用的時鐘數量外,我們還希望盡可能少地執行跨時鐘域。
正是在這個時鐘規劃期間,我們可以繪制我們的初始時鐘架構和相關的復位架構。時鐘架構也是我們展示時鐘域之間交互的地方,這是我們在編寫第一行 HDL 或打開 Vivado 之前應該創建的東西。我們可以從一個簡單的圖表開始,如下圖所示,它顯示了主要時鐘元素,然后隨著設計的發展而進一步細化這個圖。

一旦我們有了時鐘架構,我們就可以將這些時鐘映射到目標設備的資源中。7 系列器件具有以下范圍的時鐘資源。
在內部,FPGA本身被分成幾個時鐘區域,其中包含 CLB、BRAM、DSP、GT、I/O 和其他功能。每個區域還包含多個時鐘資源,包括支持以下內容的功能:
要訪問這些,我們使用以下幾種緩沖區類型:BUFG、BUFR、BUFIO、BUFMR。還有一個BUFH,它是水平時鐘(horizontal clock)。全局時鐘包含在垂直運行的時鐘主干中,水平時鐘為時鐘區域提供 BUFG 和 BUFH。BUFG 不必位于時鐘區域內。
下面的圖表可視化的展示了FPGA和區域內的時鐘資源。





更過可以查看《UG472》~
我們可以通過時鐘架構和對可用資源的充分了解,來確保我們的項目可以得到最佳設計,但是這會對引腳規劃產生影響。有一個這樣的例子是,如果我們使用 DDR 和 MIG,我們應該確保時鐘輸入和 CMT 在我們實現 MIG 時位于同一區域。
與所有設計一樣,我們需要知道工具是如何實現設計以及使用了哪些資源。
我們可以使用 Vivado 時鐘報告(TCL 窗口中的report_clocks)來分析 Vivado 檢測到的時鐘。將會生成定義時鐘。

我們還可以做的一件事是運行時鐘利用率報告 (report_clock_utilization),它將顯示時鐘分配給可用資源的情況。
在 SpaceWire 設計示例中,可以看到設計中只使用了幾個 BUFG。

我們可以在報告的下方看到全局時鐘資源的詳細使用情況。

該報告將使我們能夠確定我們是否以我們初始架構的方式植入了時鐘架構。如果沒有,我們需要確定目前工具實現的方式和我們設計的時鐘樹有什么區別,并分析哪種方式更優。
我們可以運行時鐘交互報告和 CDC 報告來幫助了解時鐘網絡中可能出現的問題。這些報告還可用于確保我們的約束是否生效,尤其是在與設計分析報告和結果質量報告一起運行時。
關于時鐘設計后續我們繼續以專題方式分享,請持續關注~
END
往期精選?
?
?

FPGA技術江湖廣發江湖帖
無廣告純凈模式,給技術交流一片凈土,從初學小白到行業精英業界大佬等,從軍工領域到民用企業等,從通信、圖像處理到人工智能等各個方向應有盡有,QQ微信雙選,FPGA技術江湖打造最純凈最專業的技術交流學習平臺。
FPGA技術江湖微信交流群

加群主微信,備注姓名+公司/學校+崗位/專業進群
FPGA技術江湖QQ交流群

備注姓名+公司/學校+崗位/專業進群
