搜索
bottom↓
回复: 0

《领航者ZYNQ之FPGA开发指南_V2》第十三章 IP核之MMCM/PLL实验

[复制链接]

出0入234汤圆

发表于 2021-11-8 17:38:53 | 显示全部楼层 |阅读模式
1)实验平台:正点原子领航者V2 ZYNQ开发板
2)  章节摘自【正点原子】《领航者ZYNQ之FPGA开发指南_V2 》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-329957-1-1.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:905624739 1.png


2.jpg


3.png


第十三章 IP核之MMCM/PLL实验
       PLL的英文全称是Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。Xilinx 7系列器件中的时钟资源包含了时钟管理单元CMT,每个CMT由一个MMCM和一个PLL组成。对于一个简单的设计来说,FPGA整个系统使用一个时钟或者通过编写代码的方式对时钟进行分频是可以完成的,但是对于稍微复杂一点的系统来说,系统中往往需要使用多个时钟和时钟相位的偏移,且通过编写代码输出的时钟无法实现时钟的倍频,因此学习Xilinx MMCM/PLL IP核的使用方法是我们学习FPGA的一个重要内容。本章我们将通过一个简单的例程来向大家介绍一下MMCM/PLL IP核的使用方法。
      本章包括以下几个部分:
      1.1MMCM/PLL IP核简介
      1.2实验任务
      1.3硬件设计
      1.4程序设计
      1.5下载验证

1.1MMCM/PLL IP核简介
       锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
       Xilinx 7系列器件中具有时钟管理单元CMT时钟资源,xc7z020芯片内部有4个CMT,xc7z010芯片内部有2个CMT,为设备提供强大的系统时钟管理以及高速I/O通信的能力。时钟管理单元CMT的总体框图如下图所示。
第十三章 IP核之MMCM709.png
图 7.5.13.1 CMT总体框图
      MMCM/PLL的参考时钟输入可以是IBUFG(CC)即具有时钟能力的IO输入、区域时钟BUFR、全局时钟BUFG、GT收发器输出时钟、行时钟BUFH以及本地布线(不推荐使用本地布线来驱动时钟资源)。在最多的情况下,MMCM/PLL的参考时钟输入都是来自IBUFG(CC)即具有时钟能力的IO输入,本实验也是如此。MMCM/PLL的输出可以驱动全局时钟BUFG和行时钟BUFH等等。BUFG能够驱动整个器件内部的PL侧通用逻辑的所有时序单元的时钟端口。BUFG/BUFH/CMT在一个时钟区域内的连接框图如下图所示。
第十三章 IP核之MMCM1032.png
图 13.1.2 BUFG/BUFH/CMT在一个时钟区域内的连接
       在本实验中,读者可以简单地理解为:外部时钟连接到具有时钟能力的输入引脚CCIO(Clock-Capable Input),进入MMCM/PLL,产生不同频率和不同相位的时钟信号,然后驱动全局时钟资源BUFG。但是要进行更深入的FPGA开发,就必须理解器件的时钟资源架构。有关Xilinx时钟资源和CMT的更详细信息,读者后期可以花一些时间和精力去学习一下Xilinx官方的手册文档“UG472,7 Series FPGAs Clocking Resources User Guide”里的介绍。
       MMCM和PLL的总体框图如下图所示。
第十三章 IP核之MMCM1354.png
图 13.1.3 MMCM总体框图
第十三章 IP核之MMCM1392.png
图 13.1.4 PLL总体框图
       其中MMCM的功能是PLL的超集,其具有比PLL更强大的相移功能。MMCM主要用于驱动器件逻辑(CLB、DSP、RAM等)的时钟。PLL主要用于为内存接口生成所需的时钟信号,但也具有与器件逻辑的连接,因此如果需要额外的功能,它们可以用作额外的时钟资源。
       PLL由以下几部分组成:前置分频计数器(D计数器)、相位-频率检测器(PFD,Phase-Frequency Detector)电路,电荷泵(Charge Pump)、环路滤波器(Loop Filter)、压控振荡器(VCO,Voltage Controlled Oscillator)、反馈乘法器计数器(M计数器)和后置分频计数器(O1-O6计数器)。
       在工作时,PFD检测其参考频率(FREF)和反馈信号(Feedback)之间的相位差和频率差,控制电荷泵和环路滤波器将相位差转换为控制电压;VCO根据不同的控制电压产生不同的震荡频率,从而影响Feedback信号的相位和频率。在FREF和Feedback信号具有相同的相位和频率之后,就认为PLL处于锁相的状态。
       在反馈路径中插入M计数器会使VCO的震荡频率是FREF信号频率的M倍,FREF信号等于输入时钟(FIN)除以预缩放计数器(D)。参考频率用以下方程描述:FREF= FIN/D,VCO输出频率为FVCO= FIN*M/D,PLL的输出频率为FOUT=(FIN*M)/(N*O)。
       Xilinx提供了用于实现时钟功能的IP核Clocking Wizard,该IP核能够根据用户的时钟需求自动配置器件内部的CMT及时钟资源,以实现用户的时钟需求。在这里我们主要讲解的是如何使用该IP核,有关该IP核的更详细介绍,读者可以参阅Xilinx官方的手册文档“PG065,Clocking Wizard v6.0 LogiCORE IP Product Guide”。
1.2实验任务
       本节实验任务是使用Zynq开发板输出4个不同时钟频率或相位的时钟,并在Vivado中进行仿真以验证结果,最后生成比特流文件并将下载到开发板上,使用示波器来测量时钟的频率。
1.3硬件设计
       本章实验将Clocking Wizard IP核产生的4个时钟100MHz、100MHz_180deg 、50MHz、25MHz,连接到开发板的J3扩展口IO上,分别是第9、10、11、12号脚。扩展口原理图如下图所示:
第十三章 IP核之MMCM2426.png
图 7.5.13.1 扩展口原理图
       本实验中,各端口信号的管脚分配如下表所示:
2.png
表 13.3.1 IP核之PLL实验管脚分配
对应的XDC约束语句如下所示:
  1. set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
  2. set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
  3. set_property -dict {PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports clk_100m]
  4. set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports clk_100m_180deg]
  5. set_property -dict {PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports clk_50m]
  6. set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk_25m]
复制代码

1.4程序设计
       我们首先创建一个空的工程,工程名为“ip_clk_wiz”。接下来添加PLL IP核。在Vivado软件的左侧“Flow Navigator”栏中单击“IP Catalog”,“IP Catalog”按钮以及单击后弹出的“IP Catalog”窗口如下图所示。
第十三章 IP核之MMCM3469.png
图 13.4.1 “IP Catalog”按钮
第十三章 IP核之MMCM3513.png
图 13.4.2 “IP Catalog”窗口
        打开“IP Catalog”窗口后,在搜索栏中输入“clock”关键字,可以看到Vivado已经自动查找出了与关键字匹配的IP核名称,如下图所示。
第十三章 IP核之MMCM3631.png
图 13.4.3 搜索栏中输入关键字
       我们双击“FPGA Features and Design”→“Clocking”下的“Clocking Wizard”,弹出“Customize IP”窗口,如下图所示。
第十三章 IP核之MMCM3757.png
图 13.4.4 “Customize IP”窗口
       接下来就是配置IP核的时钟参数。最上面的“Component Name”一栏设置该IP元件的名称,这里保持默认即可。在第一个“Clocking Options”选项卡中,“Primitive”选项用于选择是使用MMCM还是PLL来输出不同的时钟,对于我们的本次实验来说,MMCM和PLL都可以完成,这里我们可以保持默认选择MMCM。需要修改的是最下面的“Input Clock Information”一栏,把“Primary”时钟的输入频率修改为我们开发板的核心板上的晶振频率50MHz,其他的设置保持默认即可,如下图所示。
第十三章 IP核之MMCM4067.png
图 13.4.5 “Clocking Options”选项卡的设置
        接下来切换至“Output Clocks”选项卡,在“Output Clock”选项卡中,勾选前4个时钟,并且将其“Output Freq(MHz)”分别设置为100、100、50、25,注意,第2个100MHz时钟的相移“Phase(degrees)”一栏要设置为180。其他设置保持默认即可,如下图所示。
第十三章 IP核之MMCM4276.png
图 13.4.6 “Output Clocks”选项卡的设置
      “Port Renaming”选项卡主要是对一些控制信号的重命名。这里我们只用到了锁定指示locked信号,其名称保持默认即可,如下图所示。
第十三章 IP核之MMCM4398.png
图 13.4.7 “Port Renaming”选项卡的设置
      “MMCM Setting”选项卡展示了对整个MMCM/PLL的最终配置参数,这些参数都是根据之前用户输入的时钟需求由Vivado来自动配置,Vivado已经对参数进行了最优的配置,在绝大多数情况下都不需要用户对它们进行更改,也不建议更改,所以这一步保持默认即可,如下图所示。
第十三章 IP核之MMCM4588.png
图 13.4.8 “MMCM Setting”选项卡的设置
       最后的“Summary”选项卡是对前面所有配置的一个总结,在这里我们直接点击“OK”按钮即可,如下图所示。
第十三章 IP核之MMCM4692.png
图 13.4.9 “Summary”选项卡
       接着就弹出了“Genarate Output Products”窗口,我们直接点击“Generate”即可,如下图所示。
第十三章 IP核之MMCM4795.png
图 13.4.10 “Genarate Output Products”窗口
        之后我们就可以在“Design Run”窗口的“Out-of-Context Module Runs”一栏中出现了该IP核对应的run“clk_wiz_0_synth_1”,其综合过程独立于顶层设计的综合,所以在我们可以看到其正在综合,如下图所示。
第十三章 IP核之MMCM4979.png
图 13.4.11 “clk_wiz_0_synth_1”run
       在其Out-of-Context综合的过程中,我们就可以开始编写代码了。首先打开IP核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“clk_wiz_0”-“Instantitation Template”,我们可以看到“clk_wiz.veo”文件,它是由IP核自动生成的只读的verilog例化模板文件,双击就可以打开它,在例化时钟IP核模块的时钟,可以直接从这里拷贝,如下图所示。
第十三章 IP核之MMCM5253.png
图 13.4.12 “clk_wiz.veo”文件
        我们接下来创建一个verilog源文件,其名称为ip_clk_wiz.v,代码如下:
  1. 1  module  ip_clk_wiz(
  2. 2      input               sys_clk        ,  //系统时钟
  3. 3      input               sys_rst_n      ,  //系统复位,低电平有效
  4. 4      //输出时钟
  5. 5      output              clk_100m       ,  //100Mhz时钟频率
  6. 6      output              clk_100m_180deg,  //100Mhz时钟频率,相位偏移180度
  7. 7      output              clk_50m        ,  //50Mhz时钟频率
  8. 8      output              clk_25m           //25Mhz时钟频率
  9. 9      );
  10. 10
  11. 11 //*****************************************************
  12. 12 //**                    main code
  13. 13 //*****************************************************
  14. 14
  15. 15 wire        locked;
  16. 16
  17. 17 //MMCM/PLL IP核的例化
  18. 18 clk_wiz_0  clk_wiz_0
  19. 19 (
  20. 20  // Clock out ports
  21. 21  .clk_out1_100m     (clk_100m),         // output clk_out1_100m
  22. 22  .clk_out2_100m_180 (clk_100m_180deg),  // output clk_out2_100m_180
  23. 23  .clk_out3_50m      (clk_50m),          // output clk_out3_50m
  24. 24  .clk_out4_25m      (clk_25m),          // output clk_out4_25m
  25. 25  // Status and control signals
  26. 26  .reset             (~sys_rst_n),        // input reset
  27. 27  .locked            (locked),           // output locked
  28. 28  // Clock in ports
  29. 29  .clk_in1           (sys_clk)            // input clk_in1
  30. 30 );      
  31. 31
  32. 32 endmodule
复制代码

       程序中例化了clk_wiz_0,把FPGA的系统时钟50Mhz连接到clk_wiz_0的clk_in1,系统复位信号连接到clk_wiz_0的reset,由于时钟IP核默认是高电平复位,而输入的系统复位信号sys_rst_n是低电平复位,因此要对系统复位信号进行取反。clk_wiz_0输出的4个时钟信号直接连接到顶层端口的四个时钟输出信号。
       我们接下来先对代码进行仿真,TestBench代码如下:
  1. 1  `timescale 1ns / 1ps
  2. 2  
  3. 3  module tb_ip_clk_wiz();
  4. 4  
  5. 5  reg     sys_clk;
  6. 6  reg     sys_rst_n;
  7. 7  
  8. 8  wire    clk_100m;      
  9. 9  wire    clk_100m_180deg;
  10. 10 wire    clk_50m;     
  11. 11 wire    clk_25m;        
  12. 12
  13. 13 always #10 sys_clk = ~sys_clk;
  14. 14
  15. 15 initial begin
  16. 16     sys_clk = 1'b0;
  17. 17     sys_rst_n = 1'b0;
  18. 18     #200
  19. 19     sys_rst_n = 1'b1;
  20. 20 end
  21. 21
  22. 22 ip_clk_wiz u_ip_clk_wiz(
  23. 23     .sys_clk          (sys_clk        ),
  24. 24     .sys_rst_n        (sys_rst_n      ),
  25. 25
  26. 26     .clk_100m         (clk_100m       ),
  27. 27     .clk_100m_180deg  (clk_100m_180deg),
  28. 28     .clk_50m          (clk_50m        ),
  29. 29     .clk_25m          (clk_25m        )  
  30. 30     );
  31. 31
  32. 32 endmodule
复制代码

        对模块进行仿真的方法这里不再赘述,仿真后得到的波形如下图所示:
第十三章 IP核之MMCM7463.png
图 13.4.13 Vivado仿真波形
       由上图可知,locked信号拉高之后,锁相环开始输出4个稳定的时钟。clk_100m和clk_100m_180deg周期都为10ns,即时钟频率都为100Mhz,但两个时钟相位偏移180度,所以这两个时钟刚好反相;clk_50m周期为20ns,时钟频率为50Mhz;clk_25m周期为40ns,时钟频率为25Mhz。也就是说,我们创建的锁相环从仿真结果上来看是正确的。
1.5下载验证
       编译工程并生成比特流.bit文件后,此时把将下载器一端连接电脑,另一端与开发板上的JTAG下载口连接,连接电源线,并打开开发板的电源开关。
       点击Vivado左侧“Flow Navigator”窗口最下面的“Open Hardware Manager”,如果此时Vivado软件识别到下载器,则点击“Hardware”窗口中“Progam Device”下载程序,在弹出的界面中选择“Program”下载程序。
       程序下载完成后,接下来我们使用示波器测量开发板J3扩展口的第9、10、11、12号脚。示波器测试依次为U20(100MHz)、T20(100MHz_180)、P19(50MHz)和N18(25MHz)。如下图所示:
第十三章 IP核之MMCM8009.png
图 13.5.1 示波器测量引脚
       此时在示波器上就可以观察到时钟的波形图。下图为使用示波器测量扩展口第11号脚(N18)所显示的波形。
第十三章 IP核之MMCM8097.png
图 13.5.2 扩展口N18脚(25MHz)输出的波形
       由上图可知,示波器测量出的时钟频率为25Mhz,跟仿真结果是一样的,其它三个扩展口输出的时钟大家可以测试一下,这里不再贴出其它扩展口的波形图。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 19:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表