如何用ModelsimSE仿真IP核-以PLL爲例

咱們以前介紹瞭如何使用Modelsim SE進行仿真和利用do文件的仿真方法,可是其中待仿真的模塊是咱們本身編寫的Verilog模塊,可是在實際工做中,咱們的設計中會常常用到FPGA廠商給咱們提供的現成模塊—IP核,這些模塊咱們看到不到源代碼,只知道IP核的端口信息,當咱們要仿真的時候,一樣要向Modelsim提供這些IP核的信息,而FPGA廠商也會給咱們提供相應的IP核的編譯庫文件,咱們若是設計中包含這些IP核,就必須在仿真以前,將這些庫文件編譯到Moldelsim 的庫中去。其實IP核只是咱們要添加的其中一種庫(MegaFunction),除此以外,咱們還須要添加lpm庫(設計中若是調用了lpm原件,須要添加此庫),還有原語庫(primitive),器件庫(咱們用的是cyclone),固然同一種庫,還會分Verilog版和VHDL版。這裏只介紹Verilog版相關庫文件的添加,VHDL版的,方法相似,你們只需更換相應的VHDL編譯文件便可。 app

1.1.1.創建仿真庫

咱們將IP核等相關庫文件編譯到Modelsim中後,之後凡是設計中調用到IP核時,咱們就不用再重複添加了。咱們看一下如何在Modelsim中查看咱們已經編譯好的庫,打開modelsim,以下圖,會默認彈出名爲library的窗口,窗口中的內容就有咱們已經添加的庫,一部分是Modelsim自帶的庫。 異步

下面咱們開始準備添加相關庫文件。 工具

第一步,首先在新建一個文件夾,用來存放咱們編譯後的庫文件,這裏命名爲altera_lib,咱們這裏存放到了「C:\modeltech64_10.2c\」路徑下,而後在altera_lib下新建四個文件夾lpmaltera_mfaltera_primitivecyclone,以下圖,後面咱們會創建四個對應且相同名稱的庫。 oop

第二步,創建庫,咱們以添加IP核庫文件(altera_mf)爲例進行介紹。首先打開Modelsim,選擇菜單 File>New>Library。這裏咱們介紹一下「庫」的概念,庫實際就用來存放編譯結果的一個文件夾,他最終都和咱們實際硬盤上的物理空間的文件夾是一一對應的,在第五章咱們提到過工做庫(work),存放的是咱們本身設計文件的編譯結果。 this

第三步,彈出新建庫的窗口,咱們選擇第三項「a new library and a logical mapping to it」,即建立一個新庫,並映射到咱們硬盤的相應路徑下。Library Name填寫相應的庫名稱「altera_mf」,Library Physical Name中填寫咱們第一步中新建庫對應文件夾的存放路徑。這裏altera_mf對應文件夾路徑爲「C:\modeltech64_10.2c\altera_lib\altera_mf」。而後點擊肯定。 atom

第四步,在modelsimlibrary窗口下,你們能夠看到新建的altera_mf庫,不過此時庫文件爲空的。以下圖。 spa

第五步,編譯相應文件到庫中,咱們這裏須要將相關IP核文件編譯到altera_mf庫中去。菜單欄選擇compile>compile…,彈出以下窗口,首先選擇待編譯的庫library,這裏選擇咱們剛新建的庫「altera_mf」,而後找到在quartus安裝目錄下,找到Altera提供的關於altera IP核的編譯文件altera_mf.v,路徑爲「altera\13.1\quartus\eda\sim_lib」。最後點擊compile,完成編譯後,關閉。此時能夠看到library窗口下,altera_mf庫再也不是一個空的庫。 設計

第六步,重複2-5步,依次創建lpmaltera_primitivecyclone三個庫。對應的編譯文件依次是220model.v(lpm)altera_primitives.v(altera_primitive)cycloneiv_atoms.v(cyclone庫,這裏咱們只添加了cyclone4的庫文件)。添加完成後能夠在library中看到四個庫,以下圖。 orm

第七步,找到Modelsim安裝路徑下的modelsim.ini文件,去除文件的只讀屬性,而後打開, 將上一步中的四個庫的名稱及路徑如下圖的方式,添加到57行後。關閉文件,再設置爲只讀屬性。注意路徑是反斜槓。 blog

至此,咱們已經將altera相關的庫文件添加到了Modelsim SE中了。後面,咱們將介紹如何經過do文件啓動仿真。

1.1.2.  原理介紹

      介紹PLL IP核創建以前,咱們先講一下PLL的基本原理。PLLPhase-Locked Loop的縮寫,中文含意爲鎖相環。PLL基本上是一個閉環的反饋控制系統,它可使PLL輸出與一個參考信號保持固定的相位關係。PLL通常由鑑相器、電荷放大器(Charge Pump)、低通濾波器、(電)壓控振盪器、以及某種形式的輸出轉換器組成。爲了使得PLL的輸出頻率是參考時鐘的倍數關係,在PLL的反饋路徑或(和)參考信號路徑上還能夠放置分頻器。PLL的功能示意圖以下圖所示:

首先你們要理解什麼是壓控振盪器(VCO),壓控振盪器實際就是一個:頻率—電壓轉換器。當VCO輸入的電壓變化時,對應輸出的頻率也會發生變化。PLL的工做原理就是將VCO輸出的頻率通過分頻器返回到輸入端,將分頻信號與原始輸入的信號鑑相,鑑相器輸出又經過電壓放大器和低通濾波器並轉換成電壓,這樣就調整了VCO的輸入電壓,從而調整了VCO的輸出頻率,而後這樣循環調整,最終將輸出頻率鎖定。

1.1.3.  創建IP

第一步:按照2.4.2節的方法新建pll_test工程,這裏咱們就不重複了,新建好工程之後。選擇菜單欄Tools>MegaWizard Plug-In Manager。其中MegaWizard就是QuartusIP核創建嚮導工具,咱們經過這個工具創建咱們須要的IP核。

第二步:彈出以下對話框,選擇「Create a new custom megafunction variation」建立一個新的IP核。點擊Next

第三步:彈出以下對話框,首先介紹一下IP核搜索欄,咱們能夠經過這個地方快速查找到須要的IP核的位置,咱們輸入pll,即可以迅速找到PLLIP核,ALTPLL,以下圖。這裏生成IP核文件,咱們選擇爲Verilog

第四步:點擊IP核存放路徑後面的,選擇存放路徑,以下圖,咱們存放至src/ip文件夾下,這裏必需要在文件名處填寫IP覈對應輸出文件的名稱,這裏咱們定義爲pll.v。而後點擊「打開」,回到第三步窗口,繼續Next

第五步:此時會彈出PLL IP核的配置窗口。首先設置器件的速度等級,咱們所用器件速度等級爲8。速度等級數值越小,對應的FPGA速度越快。而後設置PLL的輸入頻率,這裏咱們設置爲50MHz,其餘默認。點擊Next

第六步:彈出以下對話框,保持默認選項,即建立一個異步輸入信號,注意這個復位信號是高電平有效的,建立一個PLL鎖定locked信號。繼續Next

第七步:一直點擊Next,中間過程配置保持默認,直到選項卡爲Output Clocks>clk c0時,表示對pll輸出時鐘進行配置,clk c0的「use this clock」選項是默認選上的。選擇「Enter output clock frequency」,在「Requested Settings」下設置好指望輸出的時鐘頻率,這裏clk c0設置爲100MHz。而後點擊Next

第八步:彈出一樣窗口,這裏咱們須要,手動選擇「use this clock」,一樣方法建立clk c1 40MHz時鐘,clk c210MHz時鐘。c3c4不啓用。

第九步:繼續Next,中間過程保持默認,一直到Summary選項下時,能夠選擇實際輸出的文件,這裏pll.v是必須的,這個文件是未來咱們仿真時,IP的編譯文件。其次,咱們選擇pll_inst文件,這個文件爲pll的例化文件,咱們能夠直接從該文件中將pll的例化結果拷貝到相應的應用邏輯中。最後點擊Finish

第十步:調用IP核,首先新建頂層文件,pll_test.v文件,參考src文件夾下源文件。找到src/ip路徑下pll_inst.v文件,打開。將其中的例化例子拷貝至頂層文件中。根據頂層IO信息調整pll的例化端口。代碼以下。

1.  module pll_test

2.      (

3.       input                  i_clk        ,//模塊輸入時鐘 ,50mhz

4.       input                  i_rst_n      ,//復位信號,低電平有效

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核創建及調用過程,下一節咱們介紹IP核的仿真。

1.1.4.  啓動仿真

2.10.1節中已創建好仿真庫,之後再仿真任何IP核時,都不用再重複2.10.1節的操做。如今,咱們只須要簡單修改一下do文件的內容,就能夠直接經過do文件啓動仿真了。下面是本節的sim.do文件內容。

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

能夠看出,本節的sim.do文件的vsim指令後比咱們以前實驗的vsim指令多了幾個選項-L lpm -L altera_mf -L cyclone-L altera_primitive這幾個選項實際就把咱們2.10.1節中創建的4個庫,添加到咱們的仿真中去,-L 表示庫,緊跟着的是相應的庫的名稱。其次-t表示仿真時間單位,這裏咱們須要將仿真的時間單位調整爲ps,不然PLL仿真沒有波形。須要注意的是在編譯IP核的生成文件時,只編譯pll.v便可,咱們以前生成的pll_inst.v文件不要編譯。不然會報錯。

修改完上述幾項後,咱們再雙擊modelsim_run.bat文件,咱們就能夠啓動仿真,並看到咱們的放真波形。



相關文章
相關標籤/搜索