EsteemPCB Academy 是一個(gè)專注于 FPGA、嵌入式系統(tǒng)與硬件開發(fā)的技術(shù)學(xué)習(xí)平臺(tái),致力于通過(guò)通俗易懂的課程內(nèi)容,幫助工程師和學(xué)習(xí)者快速掌握前沿技術(shù)。
	
	
在他們的一支教學(xué)視頻中,使用了ALINX AX7020 FPGA 開發(fā)板,演示了如何在 Vivado 中調(diào)用 PLL(Phase-Locked Loop,相位鎖定環(huán))IP 核,實(shí)現(xiàn)不同頻率的時(shí)鐘信號(hào)生成。本圖文教程基于該視頻的完整過(guò)程整理而來(lái),將介紹如何在 Verilog 代碼中例化 PLL IP 核,編寫 Verilog 仿真測(cè)試平臺(tái)(Testbench),最后通過(guò) 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è)問(wèn)題。我們知道,目前使用的 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 核。
	
	
接下來(lái),我們會(huì)通過(guò)仿真展示如何利用 PLL IP 核實(shí)現(xiàn)時(shí)鐘倍頻,然后把程序燒錄到實(shí)際的 AX7020 開發(fā)板,并觀察輸出波形。

(ALINX 基于 AMD Zynq 7000 SoC 開發(fā)板 AX7020)
	
	
Part 1:理解 FPGA 內(nèi)部的 PLL
	
	
如果只想了解如何使用請(qǐng)直接滑到Part2~
	
	
首先我們來(lái)看看 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í)鐘信號(hào),而這些功能都必須依靠 PLL 來(lái)實(shí)現(xiàn)。因此,一個(gè) FPGA SoC 中 PLL 的數(shù)量,往往可以作為衡量其能力的一個(gè)重要指標(biāo)。
回到 AX7020 開發(fā)板
	
	
在 AX7020 Zynq 7000 開發(fā)板上,有一個(gè)引腳與 PLL 相連。你可以在屏幕上的示意圖看到,我標(biāo)注的部分是J11 接口的第 3 腳,它直接輸出來(lái)自 PLL 的時(shí)鐘信號(hào)。這個(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í)鐘資源,用來(lái)處理各種時(shí)鐘需求。這些資源被稱為時(shí)鐘管理單元(Clock Management Tile, CMT),它們提供:
時(shí)鐘頻率合成(frequency synthesis)
時(shí)鐘偏移校正(de-skew)
抖動(dòng)抑制(jitter removal)
	
	
從下面的模塊框圖中可以看到:
從區(qū)域緩沖器(Buffer R)到本地布線的部分,都是時(shí)鐘緩沖器;
這些緩沖器通過(guò) FPGA 內(nèi)部的時(shí)鐘專用引腳相互連接;
PLL 和 MMCM 共用這些緩沖資源。
	
	

	
	
此外,從框圖還能看到,如果要使用 PLL 的輸出引腳,必須接入 Buffer G(全局時(shí)鐘緩沖器) 或 Buffer H(水平時(shí)鐘緩沖器),否則時(shí)鐘信號(hào)無(wú)法被正確分發(fā)。
	
	
還記得我剛才提到的 J11 接口的第 3 腳嗎?這個(gè)引腳實(shí)際上就是 Buffer G 或 Buffer H 的輸出引腳之一,我們稍后會(huì)在實(shí)測(cè)中看到它的作用。
	
	
接下來(lái),我們會(huì)先配置 PLL IP 核。通過(guò)它,我們可以對(duì)參考時(shí)鐘(在本例中是 50 MHz)進(jìn)行倍頻或分頻。隨后,我們會(huì)在 J11 接口的第 3 腳上探測(cè)到對(duì)應(yīng)的輸出時(shí)鐘。
	
	
簡(jiǎn)單來(lái)說(shuō),這里需要強(qiáng)調(diào)的一點(diǎn)是:
你可以根據(jù)應(yīng)用對(duì)頻率和相位的需求選擇 MMCM 或 PLL。
在我們的案例中,輸入時(shí)鐘就是 50 MHz。
	
	
如果你使用 MMCM 來(lái)生成不同的時(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 的框圖可以看到,它也包含了上述主要模塊。不過(guò),如果你問(wèn)我 PLL 和 MMCM 的區(qū)別,答案是:
MMCM 具備分?jǐn)?shù)倍頻/分頻功能,可以靈活生成輸入時(shí)鐘與輸出時(shí)鐘之間的分?jǐn)?shù)關(guān)系;
而 PLL 更適合用于頻率合成,主要用來(lái)生成多路整數(shù)倍頻的時(shí)鐘信號(hào)。
	
	
因此,如果你需要精確的分?jǐn)?shù)倍頻,推薦使用MMCM;如果只是做常規(guī)倍頻或分頻,PLL就足夠了。
	
	
Part 2:在 Vivado 中調(diào)用 PLL IP 核
	
	
接下來(lái),我會(huì)演示如何在 Vivado 中調(diào)用Xilinx提供的 PLL IP 核,來(lái)生成不同的時(shí)鐘頻率。隨后我們會(huì)把 FPGA 的某個(gè)外部引腳配置為時(shí)鐘輸出。
	
	
先創(chuàng)建一個(gè) Vivado 工程,然后從 IP Catalog(IP 庫(kù)) 中搜索并添加 PLL IP 核,這里IP核的名稱是Clocking Wizard。雙擊它,就會(huì)打開 IP 自定義窗口,進(jìn)入?yún)?shù)配置環(huán)節(jié)。
	
	

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

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

	
	
接下來(lái)設(shè)置輸出時(shí)鐘
進(jìn)入輸出時(shí)鐘(Output Clocks)標(biāo)簽頁(yè),生成四路輸出,設(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 信號(hào),它表示PLL 是否已經(jīng)鎖定。如果該信號(hào)為高電平,則說(shuō)明 PLL 鎖定成功。PLL 的輸入包括一個(gè) 50 MHz 時(shí)鐘輸入和一個(gè)復(fù)位信號(hào),這里的復(fù)位(rst_n)就是常用的低電平有效復(fù)位。
	
	
點(diǎn)擊 OK 后,會(huì)提示選擇生成任務(wù)數(shù),選擇 4 個(gè),然后點(diǎn)擊生成。這樣,PLL IP 核就會(huì)自動(dòng)加入工程,接下來(lái)我們就能在設(shè)計(jì)中調(diào)用它。
	
	

	
	
Part 3:在 Verilog 中實(shí)例化 PLL IP 核
	
	
下一步,我們需要編寫一個(gè)頂層設(shè)計(jì)文件來(lái)實(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ù)位信號(hào)(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
鎖定信號(hào)(locked):定義一個(gè)額外的輸出線網(wǎng)(wire),用于表示 PLL 模塊是否已完成 “鎖相”(locked)
	
	

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


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

	
	
保存后,就能在工程層次結(jié)構(gòu)(Hierarchy)中看到 PLL IP 已成為設(shè)計(jì)的一部分。
	
	
Part 4:約束文件(XDC)配置
	
	
接下來(lái)要添加輸入輸出約束:
1. 打開 Window → 點(diǎn)擊 I/O Ports 窗口,展開所有輸入輸出端口。
2. 分配引腳:
rst_n → N15
sys_clk → U18
clk_out_200 → J11 接口的第 3 腳(對(duì)應(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)建的約束文件,雙擊打開,里面能看到所有引腳分配及對(duì)應(yīng)的 IO 電壓標(biāo)準(zhǔn)都已正確配置。
	
	
然后我們還需要添加時(shí)序約束:使用 create_clock 語(yǔ)句創(chuàng)建系統(tǒng)時(shí)鐘。
create_clock-period20[get_portssys_clk]
	
	
這里 20ns 對(duì)應(yīng) 50 MHz 輸入時(shí)鐘。
	
	
Part 5:仿真驗(yàn)證
	
	
在燒錄硬件之前,先通過(guò)仿真驗(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)前無(wú)需添加 IO 端口,直接點(diǎn)擊“確定”。
3. 雙擊打開“pll_test_bench”文件,編寫測(cè)試代碼:
定義輸入:sys_clk、rst_n
定義輸出:四路時(shí)鐘clock_out_200、clock_out_100、clock_out_25、clock_out_50
	
	

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

	
	
信號(hào)初始化:初始時(shí)保持復(fù)位,rst=0,clk=0。100ns 后釋放復(fù)位,rst=1。
用 always 語(yǔ)句生成 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(與輸入同步)
	
	
通過(guò)波形周期測(cè)量,可驗(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)行了。
	
	
用示波器探測(cè) J11 接口第 3 腳,就可觀察到對(duì)應(yīng)的 200 MHz 輸出波形,和仿真結(jié)果一致,說(shuō)明 PLL IP 正確配置,功能正常。
	
	

	
	
本教程基于 ALINX AX7020 開發(fā)板完成。作為國(guó)內(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)注
1652文章
22231瀏覽量
628556 - 
                                pll
                                +關(guān)注
關(guān)注
6文章
971瀏覽量
137424 - 
                                FPGA開發(fā)
                                +關(guān)注
關(guān)注
1文章
47瀏覽量
15691 - 
                                Vivado
                                +關(guān)注
關(guān)注
19文章
844瀏覽量
70348 
發(fā)布評(píng)論請(qǐng)先 登錄
          
        
        
【FPGA 開發(fā)分享】如何在 Vivado 中使用 PLL IP 核生成多路時(shí)鐘
                
 
    
           
            
            
                
            
評(píng)論