PLL的英文全稱是Phase Locked Loop,即鎖相環,是一種反饋控制電路。
PLL對時鍾網絡進行系統級的時鍾管理和偏移控制,具有時鍾倍頻、分頻、相位偏移和可編程占空比的功能。
對於一個簡單的設計來說,FPGA整個系統使用一個時鍾或者通過編寫代碼的方式對時鍾進行分頻是可以完成的,但是對於稍微復雜一點的系統來說,系統中往往需要使用多個時鍾和時鍾相位的偏移,且通過編寫代碼輸出的時鍾無法實現時鍾的倍頻,因此學習Altera PLL IP核的使用方法是我們學習FPGA的一個重要內容。
本實驗我們將通過一個簡單的例程來向大家介紹一下PLL IP核的使用方法。
1. PLL IP核簡介
鎖相環作為一種反饋控制電路,其特點是利用外部輸入的參考信號控制環路內部震盪信號的頻率和相位。
因為鎖相環可以實現輸出信號頻率對輸入信號頻率的自動跟蹤,所以鎖相環通常用於閉環跟蹤電路。
鎖相環在工作的過程中,當輸出信號的頻率與輸入信號的頻率相等時,輸出電壓與輸入電壓保持固定的相位差值,即輸出電壓與輸入電壓的相位被鎖住,這就是鎖相環名稱的由來。
PLL的結構圖如下圖所示。
PLL結構圖
PLL由以下幾部分組成:
前置分頻計數器(N計數器)、相位-頻率檢測器(PFD,Phase-Frequency Detector)電路,電荷泵(Charge Pump)、環路濾波器(Loop Filter)、壓控振盪器(VCO,Voltage Controlled Oscillator)、反饋乘法器計數器(M計數器)和后置分頻計數器(K和V計數器)。
在工作時,PFD檢測其參考頻率(FREF)和反饋信號(Feedback)之間的相位差和頻率差,控制電荷泵和環路濾波器將相位差轉換為控制電壓;
VCO根據不同的控制電壓產生不同的震盪頻率,從而影響Feedback信號的相位和頻率。
在FREF和Feedback信號具有相同的相位和頻率之后,就認為PLL處於鎖相的狀態。
在反饋路徑中插入M計數器會使VCO的震盪頻率是FREF信號頻率的M倍,FREF信號等於輸入時鍾(FIN)除以預縮放計數器(N)。
參考頻率用以下方程描述:FREF=FIN/N,VCO輸出頻率為FVCO=FIN*M/N,PLL的輸出頻率為FOUT=(FIN*M)/(N*K)。
我們開發板上的FPGA芯片型號為EP4CE6,內部含有2個PLL,為設備提供強大的系統時鍾管理以及高速I/0通信的能力。
外部時鍾經過鎖相環,產生不同頻率和不同相位的時鍾信號供系統使用。
需要注意的是,PLL的時鍾輸入可以來自於時鍾專用輸入引腳,FPGA內部產生的信號不能驅動PLL。
Altera提供了用於實現PLL功能的IP核ALTPLL,在這里我們需要說明的是,有關ALTPLL的工作原理和ALTPLL的組成結構,我們就不在進一步進行講解了,我們主要講解的是如何使用ALTPLL IP核,對ALTPLL的工作原理和ALTPLL的組成結構感興趣的朋友,可
以參考A1tera提供的ALTPLL IP核的用戶手冊。
2. 實驗任務
本實驗任務是使用FPGA開發板輸出4個不同時鍾頻率或相位的時鍾,並通過Modelsim軟件對ALTPLL IP核進行仿真,來向大家詳細介紹一下ALTPLL IP核的使用方法。
3. 硬件設計
本實驗將ALTPLL IP核產生的四個時鍾輸出到FPGA的擴展口IO上,也就是開發板J15擴展口的第31、32、33和第34腳。
擴展口原理圖如下圖所示:
擴展口原理圖
本實驗中,各端口信號的管腳分配如下表所示。
4. 程序設計
首先創建一個名為ip_p11的工程,在這里我們就不再給出Quartus Prime Standard Edition軟件創建工程的詳細過程,如果大家對QuartusII軟件的創建過程還不熟悉的話,可以百度。新建后的工程如下圖所示:
創建好了工程以后,接下來我們創建PLL IP核。
我們在QuartusII軟件的菜單欄中找到【Tools】->【MegaWizard Plug-In Manager】按鈕並點擊打開,Too1工具欄打開頁面及打開后彈出的頁面如下圖所示。
工具欄打開IP核頁面
代碼
1 /*********************************************************************** 2 Filename : ip_pll.v 3 Author : 4 Company : 5 Mail : 6 Device : Altera 7 Enviroment : Win10,Quartus16.1,modelsim 10.4 8 Created date : 9 Version : V1.0 10 Description : 11 Sim : 12 Modified by : 13 Modified date: 14 Version : 15 Description : 16 ************************************************************************/ 17 module ip_pll ( 18 input i_sys_clk, /* 系統時鍾信號50MHz */ 19 input i_sys_rst_n, /* 系統復位信號 */ 20 output o_clk_100m, /* 100Mhz時鍾頻率 */ 21 output o_clk_100m_180deg,/* 100Mhz時鍾頻率,相位偏移180度 */ 22 output o_clk_50m, /* 50Mhz時鍾頻率 */ 23 output o_clk_25m /* 25Mhz時鍾頻率 */ 24 ); 25 wire w_rst_n;/* 復位信號 */ 26 wire w_locked;/* locked信號拉高,鎖相環開始穩定輸出時鍾 */ 27 assign w_rst_n = i_sys_rst_n & w_locked;/* 系統復位與鎖相環locked相與,作為其他模塊的復位信號 */ 28 /* 例化鎖相環模塊 */ 29 pll_clk u_pll_clk ( 30 .areset (~i_sys_rst_n)/* 鎖相環高電平復位,所以復位信號取反 */ 31 .inclk0 (i_sys_clk), 32 .c0 (o_clk_100m), 33 .c1 (o_clk_100m_180deg), 34 .c2 (o_clk_50m), 35 .c3 (o_clk_25m), 36 .locked (w_locked) 37 ); 38 endmodule