一、简介
PLL 的英文全称是 Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL 对时钟网络进行系统级 的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。Xilinx 7 系列器件中的时 钟资源包含了时钟管理单元 CMT,每个 CMT 由一个 MMCM 和一个 PLL 组成。对于一个简单的设计来说, FPGA 整个系统使用一个时钟或者通过编写代码的方式对时钟进行分频是可以完成的,但是对于稍微复杂一 点的系统来说,系统中往往需要使用多个时钟和时钟相位的偏移,且通过编写代码输出的时钟无法实现时 钟的倍频,因此学习 Xilinx MMCM/PLL IP 核的使用方法是我们学习 FPGA 的一个重要内容。
xc7z020 芯片内部有 4 个 CMT
MMCM/PLL 的参考时钟输入可以是 IBUFG(CC)即具有时钟能力的 IO 输入、区域时钟 BUFR、全局时 钟 BUFG、GT 收发器输出时钟、行时钟 BUFH 以及本地布线(不推荐使用本地布线来驱动时钟资源)。在 最多的情况下,MMCM/PLL 的参考时钟输入都是来自 IBUFG(CC)即具有时钟能力的 IO 输入,本实验也是 如此。
直接上流程
打开IP,搜CLK,选中如下
填写主频率,一般用核心板上的晶振时钟。Primary
output_clk的设置,我们可以设置想要的频率还有相位,以及占空比。因为设计出的时钟不一定是非常精准的所以要看Actual.
module pll_tset(
input sys_clk,
input rst_n,
output clk_haf,
output clk_4fen_90,
output clk_2bei
);
wire locked;
//例化
clk_wiz_0 u_clk_wiz_0
(
// Clock out ports
.clk_out1(clk_haf), // output clk_out1
.clk_out2(clk_4fen_90), // output clk_out2
.clk_out3(clk_2bei), // output clk_out3
// Status and control signals
.reset(~rst_n), // input reset
.locked(locked), // output locked
// Clock in ports
.sys_clk(sys_clk)); // input sys_clk
endmodule
module tb_pll_test();
reg clk;
reg rst_n;
wire clk_haf;
wire clk_4fen_90;
wire clk_2bei;
always #10 clk=~clk;
initial begin
clk =1'b0;
rst_n=1'b0;
#200
rst_n=1'b1;
end
pll_tset u_pll_tset(
.sys_clk (clk ),
.rst_n (rst_n ),
.clk_haf (clk_haf ),
.clk_4fen_90 (clk_4fen_90),
.clk_2bei (clk_2bei )
);
endmodule
仿真如下
这里有一段延迟,要注意这个LOCKED信号,当它拉高时时钟才是稳定的。当我们设计的时候,可以先设计一个寄存器CLK,当LOCKED拉高再将输出的时钟赋值给CLK。这个就是稳定时钟。