查看: 4931|回复: 0

【小脚丫STEP-MXO2】学习3 —PLL使用(IPexpress)

[复制链接]
  • TA的每日心情

    2017-12-13 09:01
  • 签到天数: 152 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-16 08:59:51 | 显示全部楼层 |阅读模式
    分享到:
    小脚丫玩了也快两个星期了,这次写关于板上芯片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 psmodule 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 endendmodule芯片资料参考文献:https://pan.baidu.com/s/1pLB8oIZ  密码:eiwq
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 09:01 , Processed in 0.115040 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.