PLL的英文全稱是Phase Locked Loop,即鎖相環,是一種反饋控制電路。編程
PLL對時鐘網絡進行系統級的時鐘管理和偏移控制,具備時鐘倍頻、分頻、相位偏移和可編程佔空比的功能。
對於一個簡單的設計來講,FPGA整個系統使用一個時鐘或者經過編寫代碼的方式對時鐘進行分頻是能夠完成的,可是對於稍微複雜一點的系統來講,系統中每每須要使用多個時鐘和時鐘相位的偏移,且經過編寫代碼輸出的時鐘沒法實現時鐘的倍頻,所以學習Altera PLL IP核的使用方法是咱們學習FPGA的一個重要內容。網絡
本實驗咱們將經過一個簡單的例程來向你們介紹一下PLL IP核的使用方法。工具
鎖相環做爲一種反饋控制電路,其特色是利用外部輸入的參考信號控制環路內部震盪信號的頻率和相位。oop
由於鎖相環能夠實現輸出信號頻率對輸入信號頻率的自動跟蹤,因此鎖相環一般用於閉環跟蹤電路。學習
鎖相環在工做的過程當中,當輸出信號的頻率與輸入信號的頻率相等時,輸出電壓與輸入電壓保持固定的相位差值,即輸出電壓與輸入電壓的相位被鎖住,這就是鎖相環名稱的由來。spa
PLL的結構圖以下圖所示。設計
PLL結構圖3d
PLL由如下幾部分組成:code
前置分頻計數器(N計數器)、相位-頻率檢測器(PFD,Phase-Frequency Detector)電路,電荷泵(Charge Pump)、環路濾波器(Loop Filter)、壓控振盪器(VCO,Voltage Controlled Oscillator)、反饋乘法器計數器(M計數器)和後置分頻計數器(K和V計數器)。blog
在工做時,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核的用戶手冊。
本實驗任務是使用FPGA開發板輸出4個不一樣時鐘頻率或相位的時鐘,並經過Modelsim軟件對ALTPLL IP核進行仿真,來向你們詳細介紹一下ALTPLL IP核的使用方法。
本實驗將ALTPLL IP核產生的四個時鐘輸出到FPGA的擴展口IO上,也就是開發板J15擴展口的第3一、3二、33和第34腳。
擴展口原理圖以下圖所示:
擴展口原理圖
本實驗中,各端口信號的管腳分配以下表所示。
首先建立一個名爲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