Lattice diamond IPexpress 例子 - PLL


【小腳丫STEP-MXO2】學習3 —PLL使用(IPexpress)

http://jingyan.eeboard.com/article/75672

 

小腳丫玩了也快兩個星期了,這次寫關於板上芯片PLL的簡單應用。板上芯片是LCMXO2-4000HC-4MG132,內部含有兩路PLL,最高倍頻可達400MHz。PLL就是鎖相環,這里我們用它來進行頻率合成。PLL是由鑒相器PD、壓控振盪器VCO、低通濾波器LPF三個基本電路組成。我們在這里直接應用,對於內部是怎么實現這個功能大家可以參閱網上資料。直接芯片手冊看起,配置了PLL。芯片手冊居然是全英文的,沒有中文的,看起來費力呀。尤其是資源介紹和編程上,沒有中文參考。雖然如此,我也是在翻譯軟件的幫助下仔細閱讀了手冊。MXO2 4000HC上的PLL時鍾輸出不止一個,有CLKOP、CLKOS、CLKOS2、CLKOS3四組。可以滿足多時鍾的要求。

上圖的CLKI是外部時鍾輸入端,板子上接的是12MHz的晶振;CLKFB是PLL 反饋信號接入端,這里與CLKOP連接。這個反饋信號的作用的感知CLKOP的輸出時鍾來確定或調整最后的輸出信號的頻率、相位等,使輸出CLKOP更加穩定。CLKOP就是主PLL倍頻輸出,CLKOS、CLKOS2、CLKOS3就是副PLL輸出。四路信號可以同時輸出,輸出不同的頻率,不過要在規定的范圍內。LOCK是一個異步信號,它表征了PLL的狀態信息。圖中的每個端口的意義我也不都明白,后面我會給出參考文獻。其實要想把一個芯片搞明白參考文獻是必不可少的,而且還的費時間去讀。參考文獻里還有相互引用,看的我也頭大。后面給出鏈接,請大神翻譯。

       下面講一下用軟件自帶IPexpress配置PLL。

      1、打開Lattice Diamond,先自己新建工程,點擊Tools—>IPexpress,這樣進入了了IP模塊了,打開之后可以看到里面有一些常用的模塊,只需要簡單的配置就可以使用。點擊PLL,出現下圖:

如果是新建工程在Diamond里打開IPexpress的話在器件選型那里已經填好了。這個要注意,必須和板子上的芯片匹配,不然無法下載運行。代碼可以Verilog或者VHDL,看自己了。文件路徑設定好之后點擊customize。

       2、出現下圖。圖中紅色標注的是這次用到的地方。其中CLKI那里輸入12,這個頻率單位是MHZ,因為板子上的晶振是12MHz,CLKOP輸入120,大家也可以自己輸入一個頻率去測試。但是這里輸入必須是CLKI的整數倍或者是0.1——0.9倍。否則后面的計算會提示錯誤。同樣我們可以設置CLKOS、CLKOS1,設置頻率之前要先使能,勾上Enable。設置好之后就可以下拉電極Calculate。同時點擊左下角導入工程。最后點擊Generate生成。最后生成的Verilog文件可以自己導入看一下。里面都是一些設置。

        3、之后就是工程綜合、引腳映射等。最后下載了。有時候下載的時候會出現錯誤,重新綜合就可以了。下載之后用示波器測試就可以了。測試發現輸出的波形還可以,正弦波。頻率有小波動,可能是示波器的原因吧。

`timescale 1 ns / 1 ps
module PLL2 (CLKI, CLKOP, CLKOS)/* synthesis NGD_DRC_MASK=1 */;
    input wire CLKI;
    output wire CLKOP;
    output wire CLKOS;

    wire LOCK;
    wire CLKOS_t;
    wire CLKOP_t;
    wire scuba_vlo;

    VLO scuba_vlo_inst (.Z(scuba_vlo));

    defparam PLLInst_0.DDRST_ENA = "DISABLED" ;
    defparam PLLInst_0.DCRST_ENA = "DISABLED" ;
    defparam PLLInst_0.MRST_ENA = "DISABLED" ;
    defparam PLLInst_0.PLLRST_ENA = "DISABLED" ;
    defparam PLLInst_0.INTFB_WAKE = "DISABLED" ;
    defparam PLLInst_0.STDBY_ENABLE = "DISABLED" ;
    defparam PLLInst_0.DPHASE_SOURCE = "DISABLED" ;
    defparam PLLInst_0.PLL_USE_WB = "DISABLED" ;
    defparam PLLInst_0.CLKOS3_FPHASE = 0 ;
    defparam PLLInst_0.CLKOS3_CPHASE = 0 ;
    defparam PLLInst_0.CLKOS2_FPHASE = 0 ;
    defparam PLLInst_0.CLKOS2_CPHASE = 0 ;
    defparam PLLInst_0.CLKOS_FPHASE = 0 ;
    defparam PLLInst_0.CLKOS_CPHASE = 14 ;
    defparam PLLInst_0.CLKOP_FPHASE = 0 ;
    defparam PLLInst_0.CLKOP_CPHASE = 1 ;
    defparam PLLInst_0.PLL_LOCK_MODE = 0 ;
    defparam PLLInst_0.CLKOS_TRIM_DELAY = 0 ;
    defparam PLLInst_0.CLKOS_TRIM_POL = "RISING" ;
    defparam PLLInst_0.CLKOP_TRIM_DELAY = 0 ;
    defparam PLLInst_0.CLKOP_TRIM_POL = "RISING" ;
    defparam PLLInst_0.FRACN_DIV = 0 ;
    defparam PLLInst_0.FRACN_ENABLE = "DISABLED" ;
    defparam PLLInst_0.OUTDIVIDER_MUXD2 = "DIVD" ;
    defparam PLLInst_0.PREDIVIDER_MUXD1 = 0 ;
    defparam PLLInst_0.VCO_BYPASS_D0 = "DISABLED" ;
    defparam PLLInst_0.CLKOS3_ENABLE = "DISABLED" ;
    defparam PLLInst_0.OUTDIVIDER_MUXC2 = "DIVC" ;
    defparam PLLInst_0.PREDIVIDER_MUXC1 = 0 ;
    defparam PLLInst_0.VCO_BYPASS_C0 = "DISABLED" ;
    defparam PLLInst_0.CLKOS2_ENABLE = "DISABLED" ;
    defparam PLLInst_0.OUTDIVIDER_MUXB2 = "DIVB" ;
    defparam PLLInst_0.PREDIVIDER_MUXB1 = 0 ;
    defparam PLLInst_0.VCO_BYPASS_B0 = "DISABLED" ;
    defparam PLLInst_0.CLKOS_ENABLE = "ENABLED" ;
    defparam PLLInst_0.OUTDIVIDER_MUXA2 = "DIVA" ;
    defparam PLLInst_0.PREDIVIDER_MUXA1 = 0 ;
    defparam PLLInst_0.VCO_BYPASS_A0 = "DISABLED" ;
    defparam PLLInst_0.CLKOP_ENABLE = "ENABLED" ;
    defparam PLLInst_0.CLKOS3_DIV = 1 ;
    defparam PLLInst_0.CLKOS2_DIV = 1 ;
    defparam PLLInst_0.CLKOS_DIV = 15 ;
    defparam PLLInst_0.CLKOP_DIV = 2 ;
    defparam PLLInst_0.CLKFB_DIV = 30 ;
    defparam PLLInst_0.CLKI_DIV = 1 ;
    defparam PLLInst_0.FEEDBK_PATH = "CLKOP" ;
    EHXPLLJ PLLInst_0 (.CLKI(CLKI), .CLKFB(CLKOP_t), .PHASESEL1(scuba_vlo), 
        .PHASESEL0(scuba_vlo), .PHASEDIR(scuba_vlo), .PHASESTEP(scuba_vlo), 
        .LOADREG(scuba_vlo), .STDBY(scuba_vlo), .PLLWAKESYNC(scuba_vlo), 
        .RST(scuba_vlo), .RESETM(scuba_vlo), .RESETC(scuba_vlo), .RESETD(scuba_vlo), 
        .ENCLKOP(scuba_vlo), .ENCLKOS(scuba_vlo), .ENCLKOS2(scuba_vlo), 
        .ENCLKOS3(scuba_vlo), .PLLCLK(scuba_vlo), .PLLRST(scuba_vlo), .PLLSTB(scuba_vlo), 
        .PLLWE(scuba_vlo), .PLLADDR4(scuba_vlo), .PLLADDR3(scuba_vlo), .PLLADDR2(scuba_vlo), 
        .PLLADDR1(scuba_vlo), .PLLADDR0(scuba_vlo), .PLLDATI7(scuba_vlo), 
        .PLLDATI6(scuba_vlo), .PLLDATI5(scuba_vlo), .PLLDATI4(scuba_vlo), 
        .PLLDATI3(scuba_vlo), .PLLDATI2(scuba_vlo), .PLLDATI1(scuba_vlo), 
        .PLLDATI0(scuba_vlo), .CLKOP(CLKOP_t), .CLKOS(CLKOS_t), .CLKOS2(), 
        .CLKOS3(), .LOCK(LOCK), .INTLOCK(), .REFCLK(), .CLKINTFB(), .DPHSRC(), 
        .PLLACK(), .PLLDATO7(), .PLLDATO6(), .PLLDATO5(), .PLLDATO4(), .PLLDATO3(), 
        .PLLDATO2(), .PLLDATO1(), .PLLDATO0())
             /* synthesis FREQUENCY_PIN_CLKOS="48.000000" */
             /* synthesis FREQUENCY_PIN_CLKOP="360.000000" */
             /* synthesis FREQUENCY_PIN_CLKI="12.000000" */
             /* synthesis ICP_CURRENT="5" */
             /* synthesis LPF_RESISTOR="16" */;
    assign CLKOS = CLKOS_t;
    assign CLKOP = CLKOP_t;
    // exemplar begin
    // exemplar attribute PLLInst_0 FREQUENCY_PIN_CLKOS 48.000000
    // exemplar attribute PLLInst_0 FREQUENCY_PIN_CLKOP 360.000000
    // exemplar attribute PLLInst_0 FREQUENCY_PIN_CLKI 12.000000
    // exemplar attribute PLLInst_0 ICP_CURRENT 5
    // exemplar attribute PLLInst_0 LPF_RESISTOR 16
    // exemplar end

endmodule


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM