PLL ( Phase Locked Loop ,即锁相环)是最常用的 IP 核之一,其性能强大,可以对输入到 FPGA 的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟。
Altera 中的 PLL 是模拟锁相环,和数字锁相环不同的是模拟锁相环的优点是输出的稳定度高、相位连续可调、延时连续可调;缺点是当温度过高或者电磁辐射过强时会失锁。
PLL基本工作原理
1 、首先需要参考时钟( ref_clk )通过鉴频( FD )鉴相器( PD )和需要比较的时钟频率进行较,我们以频率调整为例, 如果参考时钟频率等于需要比较的时钟频率则鉴频鉴相器输出为 0,如果参考时钟频率大于需要比较的时钟频率则鉴频鉴相器输出一个变大的成正比的值,如果参考时钟频率小于需要比较的时钟频率则鉴频鉴相器输出一个变小的正比的值。
2 、鉴频鉴相器的输出连接到环路滤波器( LF )上,用于控制噪声的带宽,滤掉高频噪声,使之稳定在一个值,起到将带有噪声的波形变平滑的作用。如果鉴频鉴相器之前的波形抖动比较大,经过环路滤波器后抖动就会变小,趋近于信号的平均值。
3 、经过环路滤波器的输出连接到压控振荡器( VCO )上,环路滤波器输出的电压以控制 VCO 输出频率的大小,环路滤波器输出的电压越大 VCO 输出的频率越高,然后将这个频率信号连接到鉴频鉴相器作为需要比较的频率。
如果 ref_clk 参考时钟输入的频率和需要比较的时钟频率不相等,该系统最终实现的就是让它们逐渐相等并稳定下来。如果 ref_clk 参考时钟的频率是 50MHz ,经过整个闭环反馈系统后,锁相环对外输出的时钟频率 pll_out 也是 50MHz 。
PLL倍频
倍频是在 VCO 后直接加一级分频器,我们知道 ref_clk 参考时钟输入的频率和需要比较的时钟频率经过闭环反馈系统后最终会保持频率相等,而在需要比较的时钟之前加入分频器,就会使进入分频器之前的信号频率为需要比较的时钟频率的倍数,VCO 后输出的 pll_out 信号频率就是 ref_clk 参考时钟倍频后的结果。
PLL分频
分频是在 ref_clk 参考时钟后加一级分频器,这样需要比较的时钟频率就始终和 ref_clk 参考时钟分频后的频率相等,在 VCO 后输出的 pll_out 信号就是 ref_clk 参考时钟分频后的结果。
PLL_IP核的创建与配置
如果创建一个新的IP核选择第一个“Create a new Custom megafunction variation”,如果编译已存在的IP核选择第二个“Edit an existing custom megafunction variation”,如果复制已存在的IP核选择第三个“Copy an existing custom megafunction variation”,选择后点击“Next”。
-
框 1 提供了一个搜索框,可以通过 IP 核名称来搜索。
-
框 2 为 IP 核列表,Altera 提供的 IP 核都列在其中,每个文件夹代表一类,比如 Memory Compiler 里包含了与存储器有关的 IP 核。
-
框 3为工程指定的 FPGA 所属的器件系列,每个器件系列能提供的 IP 核种类与数量不尽相同,所以这个地方要保持与工程创建时选择的器件系列一致,避免出现添加本器件不支持的情况,这里默认是一致的。
-
框 4为添加 IP核时输出文件的语言类型,这个取决于工程具体设计所使用的语言,这里选择 Verilog。
-
框 5 是 IP 核输出文件的保存类型及 IP 核名称,路径一般在工程文件夹中。
PLL的四种输出模式:
In normal mode(普通模式):仅在进入管脚时和到达芯片内部第一级寄存器时的相位相同,(A路径和B路径时延相等)但是输出的时钟相位无法保证相同(此模式下最好不要用作于对外输出);
In source-synchronous compensation Mode(源同步补偿模式):使得进入管脚时的数据和上升沿的相位关系与到达芯片内部第一级寄存器时数据和上升沿的相位关系保持不变(通过调整内部的布局布线延时做到的,用于数据接口,特别是高速的情况下);(A路径和B路径时延相等)
In zero delay buffer mode(零延时模式):对外输出的时钟和参考时钟同相位(更适合于时钟的外部输出);
With no compensation(无任何补偿模式):因为没有任何补偿,所以会由延时产生的相移。因为没有特殊要求所以我们选择默认的普通模式即可。
- 框1是为 PLL IP核创建异步复位管脚,名为 areset,用来对PLL IP核进行异步复位。- 框2是为PLL IP核创建锁定管脚,名为locked,用来检测PLL IP核是否已经锁定,只有该信号为高时输出的时钟才是稳定的。对于一般的应用而言,可以不用添加这两个管脚,这里我们只添加上“locked”,以便在仿真时能够体现PLL的工作特点。完成后点击“Next”。
保持默认即可,直接点击“Next”。
保持默认,直接点击“Next”。
保持默认,直接点击“Next”。
-
框1选项勾选是否使用当前的输出时钟,每个PLL最多有5个输出时钟,分别为c0、c1、c2、c3、c4,其配置界面都相同。我们可以根据需要选择输出时钟的数量,c0默认是选中的,保持该选项不变。
-
框2是配置输出时钟的频率,有两种方式:直接输入频率值(未选中的选项)和输入参数配置频率(当前选中的选项)。对于直接输入频率值的方式,直接在“Requested Settings”中输入想得到的输出频率即可;对于输入参数配置频率,需要输入倍频因子(Clock multiplication factor)和分频因子(Clock division factor),最后的输出频率计算方式为:输出频率=输入频率 *倍频因子/分频因子。另外需要注意的是:PLL IP核的输出并非随心所欲的,受输入频率等因素影响,每个PLL IP核的输出频率会有一定的范围限制。
-
框3为设置输出时钟相对输入时钟的相移,默认设置是0。
-
框4为输出时钟的占空比,默认设置是50%。
直接点击“Next”
修改IP核
双击点开即可修改
调用IP核
将ip核文件夹复制到新建的文件工程中
在工程中添加ip核
PLL IP核调用
module pll
(
input wire sys_clk , //系统时钟50MHz
output wire clk_mul_2 , //系统时钟经过2倍频后的时钟
output wire clk_div_2 , //系统时钟经过2分频后的时钟
output wire clk_phase_90 , //系统时钟经过相移90°后的时钟
output wire clk_ducle_20 , //系统时钟变为占空比为20%的时钟
output wire locked //检测锁相环是否已经锁定,
//只有该信号为高时输出的时钟才是稳定的
);
/
pll_ip pll_ip_inst
(
.inclk0 (sys_clk ), //input inclk0
.c0 (clk_mul_2 ), //output c0
.c1 (clk_div_2 ), //output c1
.c2 (clk_phase_90 ), //output c2
.c3 (clk_ducle_20 ), //output c3
.locked (locked ) //output locked
);
endmodule
PLL IP核仿真
`timescale 1ns/1ns
module tb_pll();
reg sys_clk;
//wire define
wire clk_mul_2 ;
wire clk_div_2 ;
wire clk_phase_90;
wire clk_ducle_20;
wire locked ;
//初始化系统时钟
initial sys_clk = 1'b1;
always #10 sys_clk = ~sys_clk;
pll pll_inst(
.sys_clk (sys_clk ), //input sys_clk
.clk_mul_2 (clk_mul_2 ), //output clk_mul_2
.clk_div_2 (clk_div_2 ), //output clk_div_2
.clk_phase_90 (clk_phase_90 ), //output clk_phase_90
.clk_ducle_20 (clk_ducle_20 ), //output clk_ducle_20
.locked (locked ) //output locked
);
endmodule