時鐘是每個 FPGA 設計的核心。如果我們正確地設計時鐘架構、沒有 CDC 問題并正確進行約束設計,就可以減少與工具斗爭的時間。
但對于某些應用,我們希望能夠更改某些IP中的時鐘頻率。其中一個例子是在圖像處理管道中,輸出分辨率可以動態變化,從而需要改變像素時鐘。
眾所周知,我們可以在 Zynq SoC 和 Zynq MPSoC 中使用結構時鐘并在運行時更改結構時鐘的頻率。但是,如果我們在 Zynq 或 ZYNQ MPSoC 中使用 FPGA 或 PL,我們仍然可以使用動態配置的時鐘向導在運行時更改頻率。
動態配置時鐘允許我們使用 AXI 接口在運行時更改時鐘頻率。
為了創建一個簡單的示例,我們將實例化PS并將動態配置時鐘IP連接到主 AXI 接口。我們將輸出時鐘連接到 IO 引腳,以便我們可以對其進行觀察并查看頻率的變化。
上面的時鐘是我們打算使用的最大頻率,這樣可以確保時序約束和時序性能正確。下圖是我們這次demo的最終設計。
接下來我們將在 Vitis 中開發軟件,并且將在設計中的 IP 下看到相關驅動及文檔。
開發這個IP的驅動和其他 AXI Lite 接口一樣,需要對IP寄存器空間進行寫入和讀取。
要更改時鐘頻率輸出,我們有兩種選擇。如果只生成一個時鐘,我們可以使用名為 SetRate 的函數。該函數將通過AXI Lite總線傳遞到IP中,IP會給出我們所需的頻率輸出,并計算必要的分頻器、乘法器和相位參數實現所需的輸出頻率。
然而,如果我們有多個時鐘,那么我們需要分別計算這些寄存器的值并單獨更新時鐘寄存器(每個時鐘有兩個寄存器)。
這里有個注意點就是在進行時鐘更改前最好等待IP鎖定到之前的頻率后再進行新操作。
更改頻率的代碼還是比較簡單的,如下:
#include#include"platform.h" #include"xil_printf.h" #include"xclk_wiz.h" XClk_WizClkWiz_Dynamic; XClk_Wiz_Config*CfgPtr_Dynamic; #defineXCLK_WIZARD_DEVICE_IDXPAR_CLK_WIZ_0_DEVICE_ID #defineXCLK_US_WIZ_RECONFIG_OFFSET0x0000025C #defineCLK_LOCK1 intmain() { init_platform(); intStatus; print("HelloWorld "); CfgPtr_Dynamic=XClk_Wiz_LookupConfig(XCLK_WIZARD_DEVICE_ID); XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic,CfgPtr_Dynamic, CfgPtr_Dynamic->BaseAddr); while(1){ XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET,0); XClk_Wiz_SetRate(&ClkWiz_Dynamic,10); XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_US_WIZ_RECONFIG_OFFSET, (XCLK_WIZ_RECONFIG_LOAD| XCLK_WIZ_RECONFIG_SADDR)); Status=XClk_Wiz_WaitForLock(&ClkWiz_Dynamic); usleep(10000000); XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_WIZ_REG25_OFFSET,0); XClk_Wiz_SetRate(&ClkWiz_Dynamic,14); XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, XCLK_US_WIZ_RECONFIG_OFFSET, (XCLK_WIZ_RECONFIG_LOAD| XCLK_WIZ_RECONFIG_SADDR)); Status=XClk_Wiz_WaitForLock(&ClkWiz_Dynamic); usleep(10000000); } cleanup_platform(); return0; }
當然,我們也可以使用類似的方法,通過將時鐘頻率降低來實現不同功耗模式下 FPGA 的功耗,從而實現降低功耗的功能。
審核編輯:劉清
-
FPGA設計
+關注
關注
9文章
428瀏覽量
26585 -
寄存器
+關注
關注
31文章
5363瀏覽量
120954 -
CDC
+關注
關注
0文章
57瀏覽量
17838 -
AXI總線
+關注
關注
0文章
66瀏覽量
14297 -
動態時鐘
+關注
關注
0文章
5瀏覽量
6969
原文標題:【Vivado那些事兒】動態時鐘的使用
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論