理論學習
IP理論學習
IP(Intellectual Property)是知識產權的意思,半導體行業(yè)的IP是“用于ASIC或FPGA中的預先設計好的電路功能模塊”。一些常用的復雜的功能模塊(如FIFO、RAM、FIR濾波器、SDRAM控制器、PCIE接口等),不可能每次使用都要用戶自行設計,所以可以將其設計成 參數可修改的模塊 ,其他用戶可以直接調用。具有復雜功能和商業(yè)價值的IP核一般具有知識產權。
IP核有三種不同的存在形式: HDL語言形式,網表形式、版圖形式 。分別對應三類IP內核: 軟核、固核和硬核 。
軟核:通常是以硬件描述語言HDL源文件的形式出現,大多數應用于FPGA的IP內核均為軟核。軟核通常以加密形式提供,RTL對用戶不可見,但布局和布線靈活。在這些加密的軟核中,如果對內核進行了參數化,那么用戶就可通過頭文件或圖形用戶接口(GUI)方便地對參數進行操作。
固核:完成了綜合的功能塊,以網表的形式交給客戶使用。對于那些對時序要求嚴格的內核(如PCIE接口內核),可預布線特定信號或分配特定的布線資源,以滿足時序要求。內核是預先設計的,可能會影響整體設計,例如:由于內核的建立時間、保持時間和握手信號都可能是固定的,因此其它電路的設計時都必須考慮與該內核進行正確地接口。如果內核具有固定布局或部分固定的布局,那么這還將影響其它電路的布局。
硬核:最終階段產品——掩膜(Mask),以經過完全的布局布線的網表形式提供。硬核缺乏靈活性且可移植性差,但由于無須提供RTL文件,更易于實現IP保護。比如一些FPGA芯片內置的ARM核就是硬核。
IP核也有缺點:1、不同的廠商會有自己的IP且一般不通用,不好移植,如果之前用的一個廠商的某個IP核,改用另一個廠商就需要將整個IP核替換。2、IP核實質是個加密的 黑匣子 ,如果出現問題或者想優(yōu)化都不好修改。3、有些定制的IP核會很貴。
Altera公司提供兩類功能模塊:免費的LPM宏功能模塊(Megafunction/LPM)和需要授權使用的IP知識產權(MegaCore),兩者的實現功能上有區(qū)別,使用方法相同。Altera IP核有邏輯運算IP核,數學運算IP核,存儲器類IP核,數字信號處理IP核,數字通信IP核,圖像處理IP核,輸入/輸出IP核,芯片接口IP核,設計調試IP核等等。
這里通過Quartus II中MegaWizard插件管理器去例化IP核。(非Altera的第三方IP核以網表文件方式提供)。在MegaWizard插件管理中可以創(chuàng)建、定制和例化Altera IP核。
PLL理論知識
PLL(Phase Locked Loop,即鎖相環(huán))是最常用的IP核之一,可以對輸入到FPGA的時鐘信號進行任意 分頻、倍頻、相位調整、占空比調整 ,輸出期望時鐘。即使不改變輸入時鐘,也會使用PLL,因為經過 PLL 后的時鐘在抖動(Jitter)方面的性能更好一些。
PLL的結構如圖所示:
能夠看出來這個系統是閉環(huán)負反饋系統。
FD/PD是鑒頻鑒相器,參考時鐘(ref_clk)通過鑒頻(FD)鑒相器(PD)和輸出的時鐘頻率進行比較,參考時鐘頻率等于輸出時鐘頻率則鑒頻鑒相器輸出為0,如果參考時鐘頻率比較大則鑒頻鑒相器輸出>1的值,如果參考時鐘頻率較小則鑒頻鑒相器輸出<1的值。
LF是環(huán)路濾波器,用于控制噪聲的帶寬,濾掉高頻噪聲,將帶有噪聲的波形變平滑。
VCO是壓控振蕩器,LF輸出的電壓越大,VCO輸出的頻率越高,然后將這個頻率信號連接到鑒頻鑒相器作為需要比較的頻率。
PLL的作用是讓期望得到的輸出時鐘與參考時鐘的頻率逐漸相等并穩(wěn)定。
倍頻的實現: 在VCO后接一個分頻器,分頻后的pll_out頻率等于ref_clk頻率,那么pll_out頻率就是ref_clk頻率的倍頻
分頻的實現: 在參考時鐘后接一個分頻器,ref_clk分頻后頻率等于pll_out頻率,那么pll_out是ref_clk的分頻
具體步驟 :
首先依然是創(chuàng)建prj,rtl,sim文件夾,prj中放工程,rtl中放綜合用的.v文件,sim中放testbench文件。建立工程,工程名為pll。工程名,頂層的文件名,頂層模塊名最好都保持一致,否則可能會報錯。另外在prj文件中建立一個子文件夾ipcore用來放工程中可能用到的ip,ipcore文件夾下再放一個pll_ip文件夾,表示存放的是pll的ip。養(yǎng)成良好的習慣,有助于以后在復雜工程里方便的查找文件,也方便別人閱讀。然后打開MegaWizard Plug,創(chuàng)建ip并配置ip:
Tools-MegaWizard Plug-In Manager-creat a new custom megafunction variation-next
后面配置擴展頻譜時鐘和帶寬可編程,配置時鐘切換,PLL重新配置都用默認項,都是高級設置。到output clock設置頁面就要進行輸出時鐘的參數配置。
我們將c0設置為輸入時鐘的2倍頻,c1設置為2分頻,c2設置為相移90°,c3設置為占空比20%,如下圖所示:
接下來是EDA配置界面,可以直接點擊“Next”。
這里顯示了我們在仿真PLL IP核時所需要的Altera的仿真庫,使用NativeLink聯合ModelSim的仿真時不需要關心這個仿真庫,設置好NativeLink后系統會自動幫我們添加這個仿真庫的,但如果使用ModelSim單獨進行仿真時不添加該仿真庫就會報錯,這里提示了我們需要添加哪些庫才能夠滿足ModelSim的單獨仿真。
接下來是Summary(總體設置)界面,顯示的是配置好PLL IP核后要輸出的文件,其中“pll_ip.v”和“pll_ip.ppf”是默認輸出的,不可以取消。此外我們再將“pll_ip_inst.v”這個實例化模板文件添加上,方便我們實例化時使用,其余的文件都不要勾選。
在彈出的頁面中勾選,可以把.qip文件添加到file目錄下
也可以手動把.qip文件添加到file目錄下
創(chuàng)建和設置完Ip后可以觀察到ipcore文件夾中生成了.ppf文件,.qip文件,pll_ip.v文件,pll_ip_inst.v文件。
.qip文件可以通過手動添加的方式或者彈窗確定的方式添加到工程結構中。
pll_ip.v和pll_ip_inst.v文件是根據我們設置好的ip參數生成的,如果不想改變輸出時鐘就不要改變里面的內容。pll的ip(atpll)可以看作一個器件,我們不需要也不能了解內部構造,只能通過配置參數進行設計,得到想要的輸出。我們通過圖形化界面的配置會生成pll_ip.v文件,文件中定義了pll_ip module,輸入是我們定義的50MHz的時鐘,輸出是我們定義的c0,c1,c2,c3和locked。實例化atpll黑匣子模塊,將定義的6個輸入輸出與atpll模塊相連,我們的pll_ip模塊就具有了自定義的鎖相環(huán)功能,其他引腳沒有被使用,就是默認的配置。還生成了pll_ip_inst.v文件,是將pll_ip模塊進行實例化。
接下來需要將pll的ip當作一個子模塊,實例化并調用它,寫成頂層模塊pll
編寫代碼
module pll
(
input wire sys_clk ,
output wire clk_mul_2 , //2倍頻后的時鐘
output wire clk_div_2 , //2分頻后的時鐘
output wire clk_phase_90 , //相移90°后的時鐘
output wire clk_ducle_20 , //占空比為20%的時鐘
output wire locked //檢測鎖相環(huán)是否已經鎖定,只有該信號為高時輸出的時鐘才是穩(wěn)定的
);
pll_ip pll_ip_inst
(
.inclk0 (sys_clk ),
.c0 (clk_mul_2 ),
.c1 (clk_div_2 ),
.c2 (clk_phase_90 ),
.c3 (clk_ducle_20 ),
.locked (locked )
);
endmodule
pll模塊的輸入為系統時鐘50MHz,輸出信號名稱分別對應各自的特性
pll_ip模塊中定義的輸入和輸出引腳,在實例化時,通過信號名稱關聯進行引用。c0就是2倍頻,c1就是2分頻...
Testbench
Testbench文件是tb_pll.v,testbench的原理是將頂層模塊作為待測件DUT,定義一個時鐘輸入作為DUT的激勵,并觀察輸出波形,如果得到了預想的波形說明我們的程序沒有問題。模塊必須要經過實例化才能調用,這里想調用頂層模塊作為被測件,我們需要實例化pll.v并重新連接輸入輸出。
`timescale 1ns/1ns
module tb_pll();
reg sys_clk;
wire clk_mul_2 ;
wire clk_div_2 ;
wire clk_phase_90;
wire clk_ducle_20;
wire locked ;
//初始化系統時鐘
initial sys_clk = 1'b1;
//sys_clk:模擬系統時鐘,每10ns電平翻轉一次,周期為20ns,頻率為50MHz
always #10 sys_clk = ~sys_clk;
pll pll_inst(
.sys_clk (sys_clk ), //input sys_clk
.clk_mul_2 (clk_mul_2 ), //output clk_mul_2
.clk_div_2 (clk_div_2 ), //output clk_div_2
.clk_phase_90 (clk_phase_90 ), //output clk_phase_90
.clk_ducle_20 (clk_ducle_20 ), //output clk_ducle_20
.locked (locked ) //output locked
);
endmodule
時鐘信號用寄存器reg變量進行定義,剩下的幾個輸出變量都用wire等同于物理連線。
初始化:時鐘初始為高電平
模擬系統時鐘:我們需要給DUT一個激勵時鐘,頻率為50MHz,因此每延時10ns要翻轉一次電平
實例化pll模塊:用物理連線將tb_pll模塊的輸入輸出和pll模塊的輸入輸出連接,那么tb_pll的輸出就是DUT對模擬系統時鐘的響應。通過modelsim觀察輸出信號,就可以判斷是否達到理想結果。
波形分析
和預想一致
說在后面:IP核給我們一種很好的學習思路,在使用一個模塊時,可以先不必看懂他的代碼,只需要根據模塊的作用進行實例化就可以完成我們想要的設計!
-
FPGA
+關注
關注
1625文章
21620瀏覽量
601234 -
半導體
+關注
關注
334文章
26855瀏覽量
214305 -
fifo
+關注
關注
3文章
386瀏覽量
43492 -
pll
+關注
關注
6文章
774瀏覽量
135006 -
IP核
+關注
關注
4文章
326瀏覽量
49376
發(fā)布評論請先 登錄
相關推薦
評論