PLL锁相环
相位锁定环路,对输入时钟进行分频倍频,得到更高或更低频率的时钟信号,供逻辑电路使用。
N:前置分频计数器
PFD:相位频率检测器
Charge Pump:电荷泵
Loop Filter:环路滤波器
VCO:压控振荡器
M:反馈乘法器
K,V:后置分频器
电路原理介绍:
首先Fin输入时钟,进入N预分频单元,出来的是FREF参考时钟,进入PFD频率相位检测电路,检测VCO反馈回来的时钟信号与参考时钟进行比较,然后将比较结果送入Charge,能得到一个电压信号,电压信号经过一个环路滤波器后,就是一个比较稳定的电压信号,这电压信号再来控制VCO压控振荡器,从来产生一个时钟信号Fvco,再次经过M的一个倍频,输入到PFD,这里就是一个环路反馈,不断调整达到一个平衡。当PFD=M就稳定下来,稳定下来之前需要一定时间。
目的:将系统时钟50MHZ倍频4倍,得到200MHZ的时钟信号
调用PLL IP核
速度等级:8
Inclk0 :晶振产生的频率50MHZ
运行模式:普通模式
Areset:复位信号 高电平复位
Pfdena:PFD的一个使能信号,保证pll的工作
Locked:锁定输出,当高电平则锁定环路,输出的时钟信号是有效的
Inclk1:如果是多个时钟输入,就可以通过这个来切换
这里来表示输出,可以看出可以输出C0-C4五个,这里的50M就是我们最终得到的50M
Clock multiplication:时钟的倍频因子
Clock division :时钟分频因子
Clock phase shift:时钟的相移,就是指时钟的一个相位差
Clock duty cycle:时钟的占空比
我这里配置生成一个100MHZ的时钟c0,配置完成后点击finish
编写tb文件对PLLl锁相环ip核进行仿真测试
`timescale 1ns/1ps
module pll_tb;
reg CLK;
reg rst;
wire c0;
wire locked ;
pll_tb u1(
.inclk0(CLK),
.areset(~rst),
.c0(c0),
.locked(locked)
);
initial CLK = 0;
always #10 CLK = ~CLK;
initial begin
rst = 0;
#100;
rst = 1;
#100;
$stop;
end
endmodule
红色:未知态
当locked锁相环被锁定的时候,输出时钟信号才有效。
quartus17.1 及以上版本进行PLL仿真
学习如何设置相位偏移
这里设置相位偏移-30
分成生成outclk2 = 50Mhz,outclk1 = 100Mhz,以及带有-30相位偏移的100Mhz = outclk0
设置完成后,等待v文件的生成。
将ip核例化成顶层文件
module ip_clk_gen (
input wire refclk, // refclk.clk
input wire rst, // reset.reset
output wire outclk_0, // outclk0.clk
output wire outclk_1, // outclk1.clk
output wire outclk_2, // outclk2.clk
output wire locked // locked.export
);
clk_gen u1 (
.refclk(refclk), // refclk.clk
.rst(~rst), // reset.reset
.outclk_0(outclk_0), // outclk0.clk
.outclk_1(outclk_1), // outclk1.clk
.outclk_2(outclk_2), // outclk2.clk
.locked(locked) // locked.export
);
endmodule
tb文件:
`timescale 1ns/1ps
module ip_clk_gen_tb;
reg refclk; // refclk.clk
reg rst; // reset.reset
wire outclk_0; // outclk0.clk
wire outclk_1; // outclk1.clk
wire outclk_2; // outclk2.clk
wire locked ; // locked.export
ip_clk_gen u1(
.refclk(refclk), // refclk.clk
.rst(~rst), // reset.reset
.outclk_0(outclk_0), // outclk0.clk
.outclk_1(outclk_1), // outclk1.clk
.outclk_2(outclk_2), // outclk2.clk
.locked(locked) // locked.export
);
initial refclk = 0;
always #5 refclk = ~refclk;
initial begin
rst = 0;
#100;
rst = 1;
#100;
$stop;
end
endmodule
波形:
可看到PLL的复位信号是高电平复位。
reclk为系统时钟 100 Mhz
红色clk0为偏移了30度相位的100mhz时钟
紫色clk1:没有相位偏移的100mhz时钟
黄色clk2 = 50mhz,可看到时钟周期是20ns