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

原視頻鏈接:
https://www.youtube.com/watch?v=B1T0t3xpvxM
ALINX AX7020 開發(fā)板:
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
在開始今天的主題之前,我先拋出一個(gè)問題。我們知道,目前使用的 AX7020 開發(fā)板自帶一顆 50 MHz 的 PLSysRef 時(shí)鐘。
那么,如果某個(gè)應(yīng)用需要 100 MHz、250 MHz 甚至更高頻率的時(shí)鐘,該怎么實(shí)現(xiàn)呢?這時(shí)就需要用到 PLL(鎖相環(huán))。今天的視頻主要講解:
1. 什么是 PLL;
2. 如何在 Vivado 中使用 PLL IP 核。
接下來,我們會(huì)通過仿真展示如何利用 PLL IP 核實(shí)現(xiàn)時(shí)鐘倍頻,然后把程序燒錄到實(shí)際的 AX7020 開發(fā)板,并觀察輸出波形。

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

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

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

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

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

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

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

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

雙擊打開該文件,會(huì)看到文件中自動(dòng)生成了時(shí)間精度指令(timescale 1ns/1ps)和一個(gè)空模塊(module pll)。
在這個(gè)空模塊中,我們需要先定義輸入輸出:
輸入:
系統(tǒng)時(shí)鐘(sys_clk)
復(fù)位信號(rst_n),低電平有效,當(dāng) rst_n 引腳變?yōu)榈碗娖綍r(shí),開發(fā)板就會(huì)進(jìn)入復(fù)位狀態(tài)。
輸出:
四路時(shí)鐘輸出(clk_out_200、clk_out_100、clk_out_25、clk_out_50):分別代表200 MHz、100 MHz、25 MHz、50 MHz
鎖定信號(locked):定義一個(gè)額外的輸出線網(wǎng)(wire),用于表示 PLL 模塊是否已完成 “鎖相”(locked)

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


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

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

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

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

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

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

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

本教程基于 ALINX AX7020 開發(fā)板完成。作為國內(nèi)領(lǐng)先的 FPGA 開發(fā)平臺(tái)和解決方案提供商,ALINX 提供 AMD Zynq/Versal/Virtex/Kintex 等系列、紫光同創(chuàng) Kosmo/Titan 等系列的多款高性能開發(fā)板與配套資料,廣泛應(yīng)用于智能汽車、工業(yè)控制、通信工程、醫(yī)療電子等領(lǐng)域。
選擇 ALINX,不僅能獲得性能優(yōu)異、接口豐富的硬件平臺(tái),還能享受到完善的技術(shù)支持與學(xué)習(xí)資源,助力工程師與開發(fā)者快速上手、加速項(xiàng)目落地。
審核編輯 黃宇
-
FPGA
+關(guān)注
關(guān)注
1650文章
22203瀏覽量
626640 -
pll
+關(guān)注
關(guān)注
6文章
966瀏覽量
137224 -
FPGA開發(fā)
+關(guān)注
關(guān)注
1文章
46瀏覽量
15640 -
Vivado
+關(guān)注
關(guān)注
19文章
844瀏覽量
70037
發(fā)布評論請先 登錄
評論