Lattice diamond IPexpress 例子

【小脚丫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
原文地址:https://www.cnblogs.com/lamblabs/p/8567451.html