“Utilizing Clock IP Core in Vivado: A Guide”

1、绪论

​ Clock在时序逻辑的设计中是不可或缺的,同时对于Clock的编写和优化也能体现一个FPGA工程师的技术水平,Clock的分频,倍频在设计项目时都有可能用到,对于分频,可以通过代码的方式进行实现,而倍频,就要用到我们今天的主角——Clock IP核。熟练使用Clock IP核是学习FPGA的基础,需要熟练掌握。

2、简介

专业词汇解释:

PLL(Phase Locked Loop) :为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,由相应的器件VCO,实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时钟信号。其具有时钟倍频、分频、相位偏移和可编程占空比的功能。

CMT(Clock Management Tile):时钟管理器,包含了DCM/PLL/DCM等。

MMCM(Mixed Mode Clock Manager):混合模式时钟管理器, MMCM 功能是 PLL 的超集 ,在PLL的基础上加上了相位动态调整功能,因为PLL是模块电路,而动态调相是数字电路,所以叫Mixed Mode。MMCM是在Virtex-6中被引入的,而且Virtex-6中也只有MMCM。

DCM:在较早的FPGA中使用,比如Sparten-3和Virtex-4,后面的器件不再使用了。在Virtex-4中,CMT包括一个PLL和两个DCM。DCM的核心是DLL,即Delay Locked Loop,它是一个数字模块,可以产生不同相位的时钟、分频、倍频、相位动态调整等,但精度有限。

*笔者在使用Xilinx Spartan_6系列的fpga时的CMT是由DCM与PLL组成,而目前Xilinx 7 系列器件中的每个CMT由一个MMCM和一个PLL组成。

​ Xilinx 7 系列器件中具有时钟管理单元 CMT 时钟资源, xc7a100t 芯片内部有 6 个 CMT, 为设备提供强大的系统时钟管理以及高速 I/O 通信的能力。 时钟管理单元 CMT 的总体框图如下图所示:

​ 前面已经介绍了在Xilinx 7系列的芯片中,一个CMT由一个MMCM和一个PLL组成。下面对MMCM和PLL进行对比:

​ 由两张图我们可以直观看到MMCM和PLL的组成结构基本相同。
​ MMCM( Mixed-Mode Clock Manager)混合模式时钟管理器, MMCM 功能是 PLL 的超集,它是在 PLL的基础上加了相位动态调整功能, PLL 是模拟的,而动态调相是数字电路,所以称为混合模式。其相对于 PLL 的优势是相位可以动态调整,占用面积较大。 MMCM 主要用于驱动器件逻辑( CLB、 DSP、 RAM 等)的时钟。 PLL 是和 IO 资源紧密绑定的,占用面积小,常用于为内存接口生成所需的时钟信号,但也具有与其他器件逻辑的连接,因此如果需要额外的功能,它们可以用作额外的时钟资源。

​ Xilinx 提供了用于实现时钟功能的 IP 核 Clocking Wizard,该 IP 核能够根据用户的时钟需求自动配置器件内部的 CMT,以实现用户的时钟需求。在这里我们主要讲解的是如何使用该 IP 核,有关该 IP 核的更详细介绍,可以参阅 Xilinx 官方的手册文档“PG065, Clocking Wizard v5.2 LogiCORE IP Product Guide”(点击跳转)。

3、实验目的

开发平台:vivado2020.1

开发板:Xilinx Artix-7 xc7a100tfgg676-2

目的:使用开发板输出 4 个不同时钟频率或相位的时钟, 并在 Vivado 中进行仿真以验证结果

4、程序设计

1、先建立一个ip_clock的工程

2、创建clock ip核,在 Vivado 软件的左侧“Flow Navigator”栏中单击“IP Catalog”,

然后在下图中搜索“clock”,如下图所示,双击“ Clocking Wizard ”后弹出 IP 核的配置界面。

3、配置 IP 核

​ 接下来切换至“ Output Clocks”选项卡,在“ Output Clock”选项卡中,勾选前 4 个时钟,并且将其“ Output Freq(MHz)”分别设置为 100、 100、 50、 25,注意,第 2 个 100MHz 时钟的相移“Phase(degrees)”一栏要设置为 180。其他设置保持默认即可,如下图所示:

​ “ Port Renaming”选项卡主要是对一些控制信号的重命名。这里我们只用到了锁定指示 locked 信号,其名称保持默认即可,如下图所示:

​ “ MMCM Setting”选项卡展示了对整个 MMCM/PLL 的最终配置参数,这些参数都是根据之前用户输入的时钟需求由 Vivado 来自动配置, Vivado 已经对参数进行了最优的配置,在绝大多数情况下都不需要用户对它们进行更改,也不建议更改,所以这一步保持默认即可,如下图所示:

​ 最后的“ Summary”选项卡是对前面所有配置的一个总结,在这里我们直接点击“OK”按钮即可,如下图所示:

接着就弹出了“Generate Output Products”窗口,我们直接点击“Generate”即可,如下图所示:

等待一会儿,窗口可以看见生成的IP核,此处介绍如何查看ip核的源文件和模板文件。如下图所示,点击此处>可查看源文件。

然后点击下方"IP Sources" ,如图所示,便是模板文件。

模板文件里有例化 IP 核的模板,如下所示:

 clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    // Status and control signals
    .resetn(resetn), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk_in1));      // input clk_in1

4、编写程序

接下来创建一个新的设计文件,命名为clk_wiz.v,代码如下:

module clk_wiz(
    input  sys_clk,
    input  sys_rst_n,

    output clk_out1,
    output clk_out2,
    output clk_out3,
    output clk_out4,
    output locked);

    clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    // Status and control signals
    .resetn(sys_rst_n), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(sys_clk));      // input clk_in1

endmodule

它将 IP 核例化后,加上了输入输出,其原理图如下:

5、仿真测试

设计完成之后,需要进行仿真,查看结果是否符合预取,创建一个“tb_clk_wiz.v”的仿真文件,仿真代码编写如下:

`timescale 1ns / 1ps

module tb_clk_wiz();
reg  sys_clk;
reg  sys_rst_n;

wire clk_out1;
wire clk_out2;
wire clk_out3;
wire clk_out4;
wire locked;

clk_wiz clk_wiz_inst(
   .sys_clk(sys_clk),
   .sys_rst_n(sys_rst_n),
   .clk_out1(clk_out1),
   .clk_out2(clk_out2),
   .clk_out3(clk_out3),
   .clk_out4(clk_out4),
   .locked(locked)
);

initial begin 
   sys_clk = 1'b0;
   sys_rst_n = 1'b0;
   #200
   sys_rst_n = 1'b1;

end

always #10 sys_clk = ~sys_clk;

endmodule

仿真结果如下图所示,结果符合预期。

物联沃分享整理
物联沃-IOTWORD物联网 » “Utilizing Clock IP Core in Vivado: A Guide”

发表评论