如何用ModelsimSE仿真IP核-以PLL為例
轉(zhuǎn)載自:http://blog.csdn.net/lg2lh 我們之前介紹了如何使用Modelsim SE進行仿真和利用do文件的仿真方法,但是其中待仿真的模塊是我們自己編寫的Verilog模塊,但是在實際工作中,我們的設(shè)計中會經(jīng)常用到FPGA廠商給我們提供的現(xiàn)成模塊—IP核,這些模塊我們看到不到源代碼,只知道IP核的端口信息,當我們要仿真的時候,同樣要向Modelsim提供這些IP核的信息,而FPGA廠商也會給我們提供相應(yīng)的IP核的編譯庫文件,我們?nèi)绻O(shè)計中包含這些IP核,就必須在仿真之前,將這些庫文件編譯到Moldelsim?的庫中去。其實IP核只是我們要添加的其中一種庫(MegaFunction),除此之外,我們還需要添加lpm庫(設(shè)計中如果調(diào)用了lpm原件,需要添加此庫),還有原語庫(primitive),器件庫(我們用的是cyclone),當然同一種庫,還會分Verilog版和VHDL版。這里只介紹Verilog版相關(guān)庫文件的添加,VHDL版的,方法類似,大家只需更換相應(yīng)的VHDL編譯文件即可。 1.1.1.建立仿真庫
我們將IP核等相關(guān)庫文件編譯到Modelsim中后,以后凡是設(shè)計中調(diào)用到IP核時,我們就不用再重復(fù)添加了。我們看一下如何在Modelsim中查看我們已經(jīng)編譯好的庫,打開modelsim,如下圖,會默認彈出名為library的窗口,窗口中的內(nèi)容就有我們已經(jīng)添加的庫,一部分是Modelsim自帶的庫。
下面我們開始準備添加相關(guān)庫文件。
第一步,首先在新建一個文件夾,用來存放我們編譯后的庫文件,這里命名為altera_lib,我們這里存放到了“C:modeltech64_10.2c”路徑下,然后在altera_lib下新建四個文件夾lpm、altera_mf、altera_primitive、cyclone,如下圖,后面我們會建立四個對應(yīng)且相同名稱的庫。
第二步,建立庫,我們以添加IP核庫文件(altera_mf)為例進行介紹。首先打開Modelsim,選擇菜單?File—>New—>Library。這里我們介紹一下“庫”的概念,庫實際就用來存放編譯結(jié)果的一個文件夾,他最終都和我們實際硬盤上的物理空間的文件夾是一一對應(yīng)的,在第五章我們提到過工作庫(work庫),存放的是我們自己設(shè)計文件的編譯結(jié)果。
第三步,彈出新建庫的窗口,我們選擇第三項“a new library and a logical mapping to it”,即創(chuàng)建一個新庫,并映射到我們硬盤的相應(yīng)路徑下。Library Name填寫相應(yīng)的庫名稱“altera_mf”,Library Physical Name中填寫我們第一步中新建庫對應(yīng)文件夾的存放路徑。這里altera_mf對應(yīng)文件夾路徑為“C:modeltech64_10.2caltera_libaltera_mf”。然后點擊確定。
第四步,在modelsim的library窗口下,大家可以看到新建的altera_mf庫,不過此時庫文件為空的。如下圖。
第五步,編譯相應(yīng)文件到庫中,我們這里需要將相關(guān)IP核文件編譯到altera_mf庫中去。菜單欄選擇compile—>compile…,彈出如下窗口,首先選擇待編譯的庫library,這里選擇我們剛新建的庫“altera_mf”,然后找到在quartus安裝目錄下,找到Altera提供的關(guān)于altera IP核的編譯文件altera_mf.v,路徑為“altera13.1quartusedasim_lib”。最后點擊compile,完成編譯后,關(guān)閉。此時可以看到library窗口下,altera_mf庫不再是一個空的庫。
第六步,重復(fù)2-5步,依次建立lpm、altera_primitive、cyclone三個庫。對應(yīng)的編譯文件依次是220model.v(lpm)、altera_primitives.v(altera_primitive)、cycloneiv_atoms.v(cyclone庫,這里我們只添加了cyclone4的庫文件)。添加完成后可以在library中看到四個庫,如下圖。
第七步,找到Modelsim安裝路徑下的modelsim.ini文件,去除文件的只讀屬性,然后打開, 將上一步中的四個庫的名稱及路徑以下圖的方式,添加到57行后。關(guān)閉文件,再設(shè)置為只讀屬性。注意路徑是反斜杠。
至此,我們已經(jīng)將altera相關(guān)的庫文件添加到了Modelsim SE中了。后面,我們將介紹如何通過do文件啟動仿真。
1.1.2.??原理介紹
??????介紹PLL IP核建立之前,我們先講一下PLL的基本原理。PLL是Phase-Locked Loop的縮寫,中文含意為鎖相環(huán)。PLL基本上是一個閉環(huán)的反饋控制系統(tǒng),它可以使PLL輸出與一個參考信號保持固定的相位關(guān)系。PLL一般由鑒相器、電荷放大器(Charge Pump)、低通濾波器、(電)壓控振蕩器、以及某種形式的輸出轉(zhuǎn)換器組成。為了使得PLL的輸出頻率是參考時鐘的倍數(shù)關(guān)系,在PLL的反饋路徑或(和)參考信號路徑上還可以放置分頻器。PLL的功能示意圖如下圖所示:
首先大家要理解什么是壓控振蕩器(VCO),壓控振蕩器實際就是一個:頻率—電壓轉(zhuǎn)換器。當VCO輸入的電壓變化時,對應(yīng)輸出的頻率也會發(fā)生變化。PLL的工作原理就是將VCO輸出的頻率經(jīng)過分頻器返回到輸入端,將分頻信號與原始輸入的信號鑒相,鑒相器輸出又通過電壓放大器和低通濾波器并轉(zhuǎn)換成電壓,這樣就調(diào)整了VCO的輸入電壓,從而調(diào)整了VCO的輸出頻率,然后這樣循環(huán)調(diào)整,最終將輸出頻率鎖定。
1.1.3.??建立IP核
第一步:按照2.4.2節(jié)的方法新建pll_test工程,這里我們就不重復(fù)了,新建好工程以后。選擇菜單欄Tools—>MegaWizard Plug-In Manager。其中MegaWizard就是Quartus的IP核建立向?qū)Чぞ?,我們通過這個工具建立我們需要的IP核。
第二步:彈出如下對話框,選擇“Create a new custom megafunction variation”創(chuàng)建一個新的IP核。點擊Next。
第三步:彈出如下對話框,首先介紹一下IP核搜索欄,我們可以通過這個地方快速查找到需要的IP核的位置,我們輸入pll,便可以迅速找到PLL的IP核,ALTPLL,如下圖。這里生成IP核文件,我們選擇為Verilog。
第四步:點擊IP核存放路徑后面的,選擇存放路徑,如下圖,我們存放至src/ip文件夾下,這里必須要在文件名處填寫IP核對應(yīng)輸出文件的名稱,這里我們定義為pll.v。然后點擊“打開”,回到第三步窗口,繼續(xù)Next。
第五步:此時會彈出PLL IP核的配置窗口。首先設(shè)置器件的速度等級,我們所用器件速度等級為8。速度等級數(shù)值越小,對應(yīng)的FPGA速度越快。然后設(shè)置PLL的輸入頻率,這里我們設(shè)置為50MHz,其他默認。點擊Next。
第六步:彈出如下對話框,保持默認選項,即創(chuàng)建一個異步輸入信號,注意這個復(fù)位信號是高電平有效的,創(chuàng)建一個PLL鎖定locked信號。繼續(xù)Next。
第七步:一直點擊Next,中間過程配置保持默認,直到選項卡為Output Clocks—>clk c0時,表示對pll輸出時鐘進行配置,clk c0的“use this clock”選項是默認選上的。選擇“Enter output clock frequency”,在“Requested Settings”下設(shè)置好期望輸出的時鐘頻率,這里clk c0設(shè)置為100MHz。然后點擊Next。
第八步:彈出同樣窗口,這里我們需要,手動選擇“use this clock”,同樣方法創(chuàng)建clk c1?為40MHz時鐘,clk c2為10MHz時鐘。c3、c4不啟用。
第九步:繼續(xù)Next,中間過程保持默認,一直到Summary選項下時,可以選擇實際輸出的文件,這里pll.v是必須的,這個文件是將來我們仿真時,IP的編譯文件。其次,我們選擇pll_inst文件,這個文件為pll的例化文件,我們可以直接從該文件中將pll的例化結(jié)果拷貝到相應(yīng)的應(yīng)用邏輯中。最后點擊Finish。
第十步:調(diào)用IP核,首先新建頂層文件,pll_test.v文件,參考src文件夾下源文件。找到src/ip路徑下pll_inst.v文件,打開。將其中的例化例子拷貝至頂層文件中。根據(jù)頂層IO信息調(diào)整pll的例化端口。代碼如下。
1.??module?pll_test
2.??????(
3.???????input????????????????? i_clk??????? ,//模塊輸入時鐘?,50mhz
4.???????input????????????????? i_rst_n????? ,//復(fù)位信號,低電平有效
5.???????output???????????????? o_clk_100MHz ,????//100MHz?時鐘輸出?????
6.???????output???????????????? o_clk_10MHz? ,????//40MHz?時鐘輸出????????????????????
7.???????output???????????????? o_clk_40MHz? ,????//10MHz?時鐘輸出
8.???????output???????????????? o_led_done????????//LED亮,時鐘LOCK????????
9.??????);
10.?????wire?????????????????? w_pll_lock?? ;
11.?????pll?? ??? pll_inst (
12.???.areset?????? ??????????????( !i_rst_n????????? ),
13.???.inclk0???????????????????? ( i_clk???????????? ),
14.???.c0???????????????????????? ( o_clk_100MHz????? ),
15.???.c1???????????????????????? ( o_clk_10MHz?????? ),
16.???.c2???????????????????????? ( o_clk_40MHz?????? ),
17.???.locked???????????????????? ( w_pll_lock??????? )
18.?);
19.?assign????? o_led_done? =!w_pll_lock;? ?????????
20.?endmodule
至此,我們完成了整個IP核建立及調(diào)用過程,下一節(jié)我們介紹IP核的仿真。
1.1.4.??啟動仿真
2.10.1節(jié)中已建立好仿真庫,以后再仿真任何IP核時,都不用再重復(fù)2.10.1節(jié)的操作?,F(xiàn)在,我們只需要簡單修改一下do文件的內(nèi)容,就可以直接通過do文件啟動仿真了。下面是本節(jié)的sim.do文件內(nèi)容。
21.?vlib?work
22.?vmap?work work
23.?vlog? ../sim/*.v
24.?vlog? ../src/*.v
25.?vlog? ../src/ip/pll.v
26.?vsim?-t ps?-novopt-L lpm? -L altera_mf -L cyclone?? -L altera_primitive?? work.tb_pll_test
可以看出,本節(jié)的sim.do文件的vsim指令后比我們之前實驗的vsim指令多了幾個選項-L lpm -L altera_mf -L cyclone-L altera_primitive,這幾個選項實際就把我們2.10.1節(jié)中建立的4個庫,添加到我們的仿真中去,-L?表示庫,緊跟著的是相應(yīng)的庫的名稱。其次-t表示仿真時間單位,這里我們需要將仿真的時間單位調(diào)整為ps,否則PLL仿真沒有波形。需要注意的是在編譯IP核的生成文件時,只編譯pll.v即可,我們之前生成的pll_inst.v文件不要編譯。否則會報錯。
修改完上述幾項后,我們再雙擊modelsim_run.bat文件,我們就可以啟動仿真,并看到我們的放真波形。