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”的仿真文件,仿真代码编写如下:文章来源:https://www.toymoban.com/news/detail-795128.html
`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
仿真结果如下图所示,结果符合预期。
文章来源地址https://www.toymoban.com/news/detail-795128.html
到了这里,关于【Vivado】clock ip核的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!