一、时钟原语介绍
目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高的要求。为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时钟,以达到最低的时钟抖动和延迟。 FPGA 全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小。为了适应复杂设计的需要,Xilinx的FPGA中集成的专用时钟资源与数字延迟锁相环(DLL)的数目不断增加。
常用的与全局时钟资源相关的Xilinx器件原语包括:IBUFG、IBUFGDS、BUFG、BUFGP、BUFGCE、BUFGMUX、BUFGDLL和DCM等。
1.1 IBUFG
输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。
IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVTTL、PCI、PCIX和SSTL等多种格式的IO标准。
1.2 IBUFGDS (Differential Signaling Input Buffer with Selectable I/O Interface)
差分输入时钟缓冲器,即IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。
IBUFGDS支持BLVDS、LVDSSEXT、LDT、LVDS、LVPECL和ULVDS等多种格式的IO标准。
1.3 BUFG
全局缓冲,其输入为IBUFG的输出。BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。
1.4 BUFGCE
带有时钟使能端的全局缓冲,包括一个输入端I、一个使能端CE、一个输出端O。仅当使能端CE有效(高电平)时,BUFGCE才会有输出。
1.5 BUFGP
等价于IBUFG加上BUFG。
1.6 BUFGDLL
全局缓冲延迟锁相环,相当于BUFG和DLL的结合。用于完成全局时钟的同步和驱动等功能,现在逐渐被DCM代替。
1.6 DCM
数字时钟管理单元。用于完成时钟的同步、移相、分频、倍频、去抖动等。为了达到最小的延迟和抖动,几乎所有的DCM应用都需要使用全局缓冲资源。
二、MMCM/PLL介绍
在7系列FPGA中,每个时钟区域对应一个CMT(clock management tile),CMT由一个MMCM(mixed-mode clock manager)和一个PLL(phase-locked loop)组成。
PLL的英文全称为Phase-Locked Loop,即锁相环,是一种控制反馈电路。PLL对时钟网络进行系统级别的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。
MMCM是混合模式时钟管理器,相当于能够进行精准相移的PLL。(PLL为模拟电路,动态调相位数字电路)。
总结:MMCM相对PLL的优势就是相位可动态调整,但PLL占用的面积更小。
MMCM/PLL的参考时钟输入可以是IBUFG(CC)即具有时钟能力的IO输入、区域时钟BUFR、全局时钟BUFG、GT收发器输出时钟、行时钟BUFH以及本地布线(不推荐使用本地布线来驱动时钟资源)。绝大多数情况下,MMCM/PLL的参考时钟输入为IBUFG(CC)即具有时钟输入能力的IO输入。
三、vivado的PLL IP核使用
3.1 IP核创建
3.2 例化后的模板
//----------------------------------------------------------------------------
// Input Clock Freq (MHz) Input Jitter (UI)
//----------------------------------------------------------------------------
// __primary__________50.000____________0.010
// The following must be inserted into your Verilog file for this
// core to be instantiated. Change the instance name and port connections
// (in parentheses) to your own signal names.
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
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
.reset(reset), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(clk_in1)); // input clk_in1
// INST_TAG_END ------ End INSTANTIATION Template ---------
3.3 顶层文件和测试文件
module ip_clk_wiz(
input sys_clk,
input sys_rst_n,
output clk_100m,
output clk_100m_180deg,
output clk_50m,
output clk_25m
);
wire locked;
//MCMM/PLL IP核例化
clk_wiz_0 u0_pll
(
// Clock out ports
.clk_out1(clk_100m), // output clk_out1
.clk_out2(clk_100m_180deg), // output clk_out2
.clk_out3(clk_50m), // output clk_out3
.clk_out4(clk_25m), // output clk_out4
// Status and control signals
.reset(~sys_rst_n), // input reset IP核默认是高电平复位 ——————————————|_________________
.locked(locked), // output locked 锁定时,locked信号就变为高电平,表示输出的时钟是可用的
// Clock in ports
.clk_in1(sys_clk)); // input clk_in1
endmodule
`timescale 1ns / 1ps
module tb_ip_clk_wiz();
//reg define
reg sys_clk;
reg sys_rst_n;
//wire define
wire clk_100m;
wire clk_100m_180deg;
wire clk_50m;
wire clk_25m;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#200 sys_rst_n = 1'b1;
end
always #10 sys_clk = ~sys_clk;
ip_clk_wiz u1(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.clk_100m (clk_100m),
.clk_100m_180deg (clk_100m_180deg),
.clk_50m (clk_50m),
.clk_25m (clk_25m)
);
endmodule
3.4 仿真图
说明:IP核的reset接口为高电平有效,locked接口为高电平有效。其他模块调用PLL模块时,需要判定locked信号是否为高电平。
四、参考博客及文献
博客:
时钟相关原语学习记录
PLL与MMCM区别
Vivado MMCM和PLL的区别 新人不想看,老人用不到系列.
文档:
启明星ZYNQ之FPGA开发指南_V1.2