時鐘是每個 FPGA 設(shè)計的核心。如果我們正確地設(shè)計時鐘架構(gòu)、沒有 CDC 問題并正確進行約束設(shè)計,就可以減少與工具斗爭的時間。
但對于某些應(yīng)用,我們希望能夠更改某些IP中的時鐘頻率。其中一個例子是在圖像處理管道中,輸出分辨率可以動態(tài)變化,從而需要改變像素時鐘。
眾所周知,我們可以在 Zynq SoC 和 Zynq MPSoC 中使用結(jié)構(gòu)時鐘并在運行時更改結(jié)構(gòu)時鐘的頻率。但是,如果我們在 Zynq 或 ZYNQ MPSoC 中使用 FPGA 或 PL,我們?nèi)匀豢梢允褂脛討B(tài)配置的時鐘向?qū)г谶\行時更改頻率。
動態(tài)配置時鐘允許我們使用 AXI 接口在運行時更改時鐘頻率。
為了創(chuàng)建一個簡單的示例,我們將實例化PS并將動態(tài)配置時鐘IP連接到主 AXI 接口。我們將輸出時鐘連接到 IO 引腳,以便我們可以對其進行觀察并查看頻率的變化。
上面的時鐘是我們打算使用的最大頻率,這樣可以確保時序約束和時序性能正確。下圖是我們這次demo的最終設(shè)計。
接下來我們將在 Vitis 中開發(fā)軟件,并且將在設(shè)計中的 IP 下看到相關(guān)驅(qū)動及文檔。
開發(fā)這個IP的驅(qū)動和其他 AXI Lite 接口一樣,需要對IP寄存器空間進行寫入和讀取。
要更改時鐘頻率輸出,我們有兩種選擇。如果只生成一個時鐘,我們可以使用名為 SetRate 的函數(shù)。該函數(shù)將通過AXI Lite總線傳遞到IP中,IP會給出我們所需的頻率輸出,并計算必要的分頻器、乘法器和相位參數(shù)實現(xiàn)所需的輸出頻率。
然而,如果我們有多個時鐘,那么我們需要分別計算這些寄存器的值并單獨更新時鐘寄存器(每個時鐘有兩個寄存器)。
這里有個注意點就是在進行時鐘更改前最好等待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; }
當(dāng)然,我們也可以使用類似的方法,通過將時鐘頻率降低來實現(xiàn)不同功耗模式下 FPGA 的功耗,從而實現(xiàn)降低功耗的功能。
審核編輯:劉清
-
FPGA設(shè)計
+關(guān)注
關(guān)注
9文章
428瀏覽量
26528 -
寄存器
+關(guān)注
關(guān)注
31文章
5346瀏覽量
120491 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
17821 -
AXI總線
+關(guān)注
關(guān)注
0文章
66瀏覽量
14264 -
動態(tài)時鐘
+關(guān)注
關(guān)注
0文章
5瀏覽量
6958
原文標(biāo)題:【Vivado那些事兒】動態(tài)時鐘的使用
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論