PLL锁相环原理以及Altera FPGA的IP核实现


前言

本文主要介绍了锁相环的原理,以及适用Altrea的FPGA使用IP核进行测试,记录其实验结果


一、PLL锁相环功能核原理

1. 锁相环功能

参考链接:PLL wikipedia
锁相环( phase lock loop ,PLL)是一种产生输出信号的控制系统,其相位与输入信号的相位相关。保持输入和输出相位同步还意味着保持输入和输出频率相同。因此,除了同步信号之外,锁相环还可以跟踪输入频率,或者产生输入频率的倍数。

总之就是产生一个输出信号,该输出信号与输入信号有固定的相位差,可以用来对信号进行倍频和分频。

2. 锁相环原理[1]

锁相环由压控振荡器(VCO)、分频器(N)、相位检波器(PFD)、环路的低通滤波器(LF)和2分频电路组成,由电荷泵组成的锁相环电路如图1所示。
图1 由电荷泵组成的锁相环电路原理图
图1 由电荷泵组成的锁相环电路原理图

(1)相频检波器(PFD)
相拼检波器用于检测两个输入之间的相位差,并输出正比于这个相位差的信号。如果VCO的频率太高,则DN置1,UP为0;PLL处于相位锁定,DN和UP均为0;VCO频率太低则DN为0,UP置1。
(2)电荷泵
电荷泵位于相频检波器和环路滤波器之间,电荷泵负责在正比于相位误差时间周期内注入恒量的电流到环路滤波器,而它的输入来自相频检波器。
如果UP=1,则电流注入环路滤波器,使横跨环路滤波器的电压增加。
如果DN=1,则等量的电流从环路滤波器留出,所以横跨环路滤波器的电压减小。
(3)环路滤波器
环路滤波器对PLL的动态特性、性能和面积有较大的影响,注入它的电流借助一个电容转换成电压,利用此电压控制压控振荡器(VCO)。如图1 所示,LF中的电阻是为了环路的稳定,输出端的电容是为了滤除电荷泵周期性地注入电荷产生的纹波。
(4)压控振荡器
对SoC应用,PLL通常采用基于环形振荡器的压控振荡器,此时压控振荡器可以分成电压到电流的转换(V2I)和电流控制振荡器(ICO),因为环形振荡器的增益和频率更容易利用电流控制信号调节。
(5)分频器
在SoC的PLL中,常使用一个异步计数器将VCO信号分频一个固定的整数后,再与输入的参考频率比较来达到频率的倍乘。

个人认为可以将锁相环理解为一个负反馈系统,通过电路调节实现信号的分频或倍频。

二、Altera的FPGA调用IP核实现

使用Altrea的EP3C40F484C6进行实验,此FPGA使用的是一个50MHz的有源晶振,晶振供电3.3V,使用Verilog语言进行编程,程序如下,先测试IO口输出为1'b1时的电压值。
module pll_test(
	input Clk_n,
	input Rst_n,
	output io_clk,
	output io_pll
);

assign io_clk = 1'b1;
assign io_pll = 1'b1;

endmodule

此程序产生的效果如图2所示,电压在3.2V附近波动
图2 直接将IO口置1的输出电压
图2 直接将IO口置1的输出电压

之后使用PLL的IP核产生100MHz时钟信号进行测试,其实验效果如图3所示,其中黄色曲线为50MHz,红色为100MHz。

module pll_test(
	input Clk_n,
	input Rst_n,
	output io_clk,
	output io_pll
);

wire clk_100m
	pll inst_clk_pll
	(
		.areset(1'b0),
		.inclk0(clk),  
		.c0(clk_100m),
	);

assign io_clk = (CLK) ? 1'b0 : 1'b1;
assign io_pll = (clk_100m) ? 1'b0:1'b1;

endmodule

在这里插入图片描述
图3 使用PLL产生100MHz的时钟信号

之后直接将PLL产生的时钟信号的参数设置为50MHz,只是有180°相移,输出效果如图4所示
图4 50MHz和180°相移信号效果图
图4 50MHz和180°相移信号效果图

上述程序的RTL viewer中看到的编译器优化后的图如图5所示
图5 使用三目运算符进行赋值时的RTL viewer图
图5 使用三目运算符进行赋值时的RTL viewer图

如果直接使用assign进行连接,即程序为

module pll_test(
	input Clk_n,
	input Rst_n,
	output io_clk,
	output io_pll
);

wire clk_100m
	pll inst_clk_pll
	(
		.areset(1'b0),
		.inclk0(clk),  
		.c0(clk_100m),
	);

assign io_clk = CLK;
assign io_pll = clk_100m;

endmodule

此程序得到的RTL viewer图如图6所示
图6 直接assign连接IO和时钟引脚的RTL viewer图
图6 直接assign连接IO和时钟引脚的RTL viewer图

当PLL的输出设置为100MHz的时候其图像和图3相同,如图7所示,其中红色曲线为100MHz,黄色曲线为50MHz。图7 进行直接赋值后的50MHz和100MHz曲线
图7 进行直接赋值后的50MHz和100MHz曲线

后续补充

修改日期:2021/10/9

最近在调试程序的时候看到个warning,大体意思是PLL输出的时钟信号因为没有经过专用的时钟引脚,其抖动程度取决于其他设计单元的翻转速度,使用专用的PLL时钟输出教来保证抖动的程度(尽量小),可能这个会影响上述图中的信号效果。
这部分知识可看小梅哥写的关于这个warning的见解:http://www.corecourse.cn/forum.php?mod=viewthread&tid=27873

在之前看书的时候看到:
如果在原始时钟和分频后的时钟域之间有同步路径,可以使用PLL产生一个x1时钟作为原始驱动时钟,这样PLL对于这两个时钟的延时补偿将会是同样的,所以时钟域之间的歪斜会降低到最小。即使原始时钟使用的是PLL的输入时钟,那么原始时钟和n分频之后的时钟之间的歪斜也要比使用行波时钟要低。
行波时钟是指由寄存器驱动的时钟,比如使用计数器进行时钟分频产生的时钟

如果需要外部时钟信号输入FPGA内部,最好的做法是除了将其连接到时钟专用输入引脚之外,最好将它们连接到PLL、即使设计中并不需要对时钟进行相位或频率的改变,PLL的普通反馈模式都将会(在PLL的输出处)补偿由图8所示输入缓冲和全局缓冲所带来的延时,这样使得时钟到达所有目标寄存器的时间和时钟到达FPGA时钟输入引脚的时间相同。
图8 带全局缓冲的专用时钟输入引脚
图8 带全局缓冲的专用时钟输入引脚

总结

锁相环在FPGA的项目中基本都会用到,实际效果可以看出时钟信号并不是特别理想,所以在进行高速AD设计的时候会推荐使用专用的时钟芯片,当然这部分我只是了解,后续要是接触到再进行研究实验。 以上就是要说的内容,由于鄙人才疏学浅,不足之处还望指出,一起进步,转载请注明出处。

参考文献

[1]孟宪元,钱伟康.FPGA现代数字系统设计[M].清华大学出版社:北京,2019:57-59.

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值