EsteemPCB Academy 是一個專注于 FPGA、嵌入式系統與硬件開發的技術學習平臺,致力于通過通俗易懂的課程內容,幫助工程師和學習者快速掌握前沿技術。
在他們的一支教學視頻中,使用了ALINX AX7020 FPGA 開發板,演示了如何在 Vivado 中調用 PLL(Phase-Locked Loop,相位鎖定環)IP 核,實現不同頻率的時鐘信號生成。本圖文教程基于該視頻的完整過程整理而來,將介紹如何在 Verilog 代碼中例化 PLL IP 核,編寫 Verilog 仿真測試平臺(Testbench),最后通過 JTAG 將設計燒錄到實際的開發板。

原視頻鏈接:
https://www.youtube.com/watch?v=B1T0t3xpvxM
ALINX AX7020 開發板:
https://alinx.com/en/detail/273
Zynq 7000 資料詳情:
https://www.amd.com/en/products/adaptive-socs-and-fpgas/soc/zynq-7000.html#documentation
Vivado 下載安裝:
https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/archive.html
在開始今天的主題之前,我先拋出一個問題。我們知道,目前使用的 AX7020 開發板自帶一顆 50 MHz 的 PLSysRef 時鐘。
那么,如果某個應用需要 100 MHz、250 MHz 甚至更高頻率的時鐘,該怎么實現呢?這時就需要用到 PLL(鎖相環)。今天的視頻主要講解:
1. 什么是 PLL;
2. 如何在 Vivado 中使用 PLL IP 核。
接下來,我們會通過仿真展示如何利用 PLL IP 核實現時鐘倍頻,然后把程序燒錄到實際的 AX7020 開發板,并觀察輸出波形。

(ALINX 基于 AMD Zynq 7000 SoC 開發板 AX7020)
Part 1:理解 FPGA 內部的 PLL
如果只想了解如何使用請直接滑到Part2~
首先我們來看看 PLL 在 FPGA 內部是如何集成的。除了 PLL,FPGA 里還有其他的時鐘管理資源,比如MMCM(混合模式時鐘管理器),它可以實現更高性能的相位同步和時鐘合成。
PLL 在 FPGA 中是非常重要的資源。因為一個復雜的 FPGA 系統通常需要多個不同頻率、不同相位的時鐘信號,而這些功能都必須依靠 PLL 來實現。因此,一個 FPGA SoC 中 PLL 的數量,往往可以作為衡量其能力的一個重要指標。
回到 AX7020 開發板
在 AX7020 Zynq 7000 開發板上,有一個引腳與 PLL 相連。你可以在屏幕上的示意圖看到,我標注的部分是J11 接口的第 3 腳,它直接輸出來自 PLL 的時鐘信號。這個引腳可以被用作外部應用的時鐘源。除此之外,PLL 還有多個輸出通道,可以在 Verilog 代碼中調用。
在正式使用 PLL IP 核之前,我們先要理解它在 FPGA 內部的結構。
時鐘管理單元
(Clock Management Tile, CMT)
在 Xilinx 7 系列 FPGA 中,芯片內部設計了專用的全局(Global)和區域(Regional)時鐘資源,用來處理各種時鐘需求。這些資源被稱為時鐘管理單元(Clock Management Tile, CMT),它們提供:
時鐘頻率合成(frequency synthesis)
時鐘偏移校正(de-skew)
抖動抑制(jitter removal)
從下面的模塊框圖中可以看到:
從區域緩沖器(Buffer R)到本地布線的部分,都是時鐘緩沖器;
這些緩沖器通過 FPGA 內部的時鐘專用引腳相互連接;
PLL 和 MMCM 共用這些緩沖資源。

此外,從框圖還能看到,如果要使用 PLL 的輸出引腳,必須接入 Buffer G(全局時鐘緩沖器) 或 Buffer H(水平時鐘緩沖器),否則時鐘信號無法被正確分發。
還記得我剛才提到的 J11 接口的第 3 腳嗎?這個引腳實際上就是 Buffer G 或 Buffer H 的輸出引腳之一,我們稍后會在實測中看到它的作用。
接下來,我們會先配置 PLL IP 核。通過它,我們可以對參考時鐘(在本例中是 50 MHz)進行倍頻或分頻。隨后,我們會在 J11 接口的第 3 腳上探測到對應的輸出時鐘。
簡單來說,這里需要強調的一點是:
你可以根據應用對頻率和相位的需求選擇 MMCM 或 PLL。
在我們的案例中,輸入時鐘就是 50 MHz。
如果你使用 MMCM 來生成不同的時鐘頻率和相位,MMCM 提供了非常強大的時鐘管理功能。下圖所示的模塊框圖中:
D表示可編程分頻計數器(programmable counter divider);
PFD表示鑒頻鑒相器(phase frequency detector);
CP表示電荷泵(charge pump);
LF表示環路濾波器(loop filter);
VCO表示壓控振蕩器(voltage control oscillator);
最終可以得到 8 路 MMCM 時鐘輸出,用于頻率合成。

至于 PLL,它實際上是 MMCM 的一個子集。從 PLL 的框圖可以看到,它也包含了上述主要模塊。不過,如果你問我 PLL 和 MMCM 的區別,答案是:
MMCM 具備分數倍頻/分頻功能,可以靈活生成輸入時鐘與輸出時鐘之間的分數關系;
而 PLL 更適合用于頻率合成,主要用來生成多路整數倍頻的時鐘信號。
因此,如果你需要精確的分數倍頻,推薦使用MMCM;如果只是做常規倍頻或分頻,PLL就足夠了。
Part 2:在 Vivado 中調用 PLL IP 核
接下來,我會演示如何在 Vivado 中調用Xilinx提供的 PLL IP 核,來生成不同的時鐘頻率。隨后我們會把 FPGA 的某個外部引腳配置為時鐘輸出。
先創建一個 Vivado 工程,然后從 IP Catalog(IP 庫) 中搜索并添加 PLL IP 核,這里IP核的名稱是Clocking Wizard。雙擊它,就會打開 IP 自定義窗口,進入參數配置環節。

在 Clocking Wizard 配置界面中,選擇 PLL 作為時鐘生成方式。
勾選頻率合成(frequency synthesis)和相位對齊(phase alignment)。
將抖動優化(jitter optimization)設置為Balanced(平衡模式)。

往下拉,可以看到主時鐘輸入(Primary Clock Input)和輔助時鐘輸入(Secondary Clock Input)的選項。本例中只有一個輸入時鐘,也就是 50 MHz,沒有輔助時鐘,所以直接選擇 50 MHz 即可。

接下來設置輸出時鐘
進入輸出時鐘(Output Clocks)標簽頁,生成四路輸出,設定為:
輸出1:200 MHz(輸入的 4 倍)
輸出2:100 MHz(輸入的 2 倍)
輸出3:25 MHz(輸入的 1/2)
輸出4:50 MHz(與輸入相同,用于驗證)

設置好后點擊 OK,在框圖中會看到locked 信號,它表示PLL 是否已經鎖定。如果該信號為高電平,則說明 PLL 鎖定成功。PLL 的輸入包括一個 50 MHz 時鐘輸入和一個復位信號,這里的復位(rst_n)就是常用的低電平有效復位。
點擊 OK 后,會提示選擇生成任務數,選擇 4 個,然后點擊生成。這樣,PLL IP 核就會自動加入工程,接下來我們就能在設計中調用它。

Part 3:在 Verilog 中實例化 PLL IP 核
下一步,我們需要編寫一個頂層設計文件來實例化 PLL IP 核,并進行仿真。
1. Project Manager → Add Sources → Add or Create Design Sources → Next。
2. 點擊 Create File,新建一個名為 PLL 的源文件(pll.v)。
3. 新建完成后,點擊 Finish 即可,當前階段暫不添加任何 IOPorts,直接點擊 OK。

雙擊打開該文件,會看到文件中自動生成了時間精度指令(timescale 1ns/1ps)和一個空模塊(module pll)。
在這個空模塊中,我們需要先定義輸入輸出:
輸入:
系統時鐘(sys_clk)
復位信號(rst_n),低電平有效,當 rst_n 引腳變為低電平時,開發板就會進入復位狀態。
輸出:
四路時鐘輸出(clk_out_200、clk_out_100、clk_out_25、clk_out_50):分別代表200 MHz、100 MHz、25 MHz、50 MHz
鎖定信號(locked):定義一個額外的輸出線網(wire),用于表示 PLL 模塊是否已完成 “鎖相”(locked)

接下來去 IP Sources,打開 PLL IP 核的實例化模板(Instantiation Template),復制模板代碼粘貼到頂層文件 ppl.v 中,并把前面定義好的輸入輸出信號映射進去。


映射完成后,可以將該例程命名為 clk_0_ins,點擊保存。

保存后,就能在工程層次結構(Hierarchy)中看到 PLL IP 已成為設計的一部分。
Part 4:約束文件(XDC)配置
接下來要添加輸入輸出約束:
1. 打開 Window → 點擊 I/O Ports 窗口,展開所有輸入輸出端口。
2. 分配引腳:
rst_n → N15
sys_clk → U18
clk_out_200 → J11 接口的第 3 腳(對應 FPGA 引腳 F17)
3. 設置電壓標準:原本默認 1.8V,查閱開發板原理圖后可知實際應使用 3.3V LVCMOS,所以改為 LVCMOS33。
保存為 pll.xdc 文件

此時回到 Sources 界面,就能看到新創建的約束文件,雙擊打開,里面能看到所有引腳分配及對應的 IO 電壓標準都已正確配置。
然后我們還需要添加時序約束:使用 create_clock 語句創建系統時鐘。
create_clock-period20[get_portssys_clk]
這里 20ns 對應 50 MHz 輸入時鐘。
Part 5:仿真驗證
在燒錄硬件之前,先通過仿真驗證功能,步驟如下:
打開 Simulation Settings,將仿真時間設置為 50 ms。

2. 創建仿真文件:Add Sources → Add or create simulation sources → Create,將仿真文件命名為“pll_test_bench”,確認后點擊“完成”。當前無需添加 IO 端口,直接點擊“確定”。
3. 雙擊打開“pll_test_bench”文件,編寫測試代碼:
定義輸入:sys_clk、rst_n
定義輸出:四路時鐘clock_out_200、clock_out_100、clock_out_25、clock_out_50

在 testbench 中例化 pll.v,并將輸入輸出正確連接。

信號初始化:初始時保持復位,rst=0,clk=0。100ns 后釋放復位,rst=1。
用 always 語句生成 50 MHz 的輸入時鐘,即讓時鐘每 10 納秒翻轉一次,得到周期 20ns 的輸入時鐘,即 50 MHz。

保存后運行行為仿真(Run Behavioral Simulation)。
在波形窗口中,可觀察到四路時鐘輸出:
200 MHz
100 MHz
25 MHz
50 MHz(與輸入同步)
通過波形周期測量,可驗證頻率正確性。
Part 6:硬件驗證
點擊 Generate Bitstream,生成 Bitstream 文件,然后點擊 Program Device,選擇剛才生成的 Bitstream 文件,點擊 Program,現在 FPGA 已經燒錄完成,PLL IP 核也在 FPGA 上運行了。
用示波器探測 J11 接口第 3 腳,就可觀察到對應的 200 MHz 輸出波形,和仿真結果一致,說明 PLL IP 正確配置,功能正常。

本教程基于 ALINX AX7020 開發板完成。作為國內領先的 FPGA 開發平臺和解決方案提供商,ALINX 提供 AMD Zynq/Versal/Virtex/Kintex 等系列、紫光同創 Kosmo/Titan 等系列的多款高性能開發板與配套資料,廣泛應用于智能汽車、工業控制、通信工程、醫療電子等領域。
選擇 ALINX,不僅能獲得性能優異、接口豐富的硬件平臺,還能享受到完善的技術支持與學習資源,助力工程師與開發者快速上手、加速項目落地。
審核編輯 黃宇
-
FPGA
+關注
關注
1656文章
22317瀏覽量
631084 -
pll
+關注
關注
6文章
976瀏覽量
137636 -
FPGA開發
+關注
關注
1文章
48瀏覽量
15763 -
Vivado
+關注
關注
19文章
848瀏覽量
70553
發布評論請先 登錄

【FPGA 開發分享】如何在 Vivado 中使用 PLL IP 核生成多路時鐘
評論