FPGA学习之路(五)之锁相环倍频(PLL)探究

写在前面

今天时间还早QAQ,继续研究研究FPGA的锁相环倍频(PLL)。之前在做松果派ONE的时候,上面的swm320vet7内部带有一路PLL,最高支持output 120Mhz的时钟,而且外设可根据管脚奇偶数自由映射,当时就觉得贼有FPGA的感觉,哈哈哈。

PLL原理

PLL的原理就不多说了,反正用的IP Core,直接wire一下就行。不过看到一篇对于PLL原理介绍比较清晰的博客,分享给大家,想要深入了解的同学,可以点进去看看。(链接:https://blog.csdn.net/leoufung/article/details/50268031)

FPGA的PLL特性

我用的是Altera(未被intel收购前)的cyclone IV EP4CE15F23C8N 芯片。先来看看Data sheet上怎么吹它PLL特性的。

首先,是一张PLL结构图

在这里插入图片描述

其次是一些NOTE

在这里插入图片描述

然后是它的输出结构

在这里插入图片描述

最大PLL输出频率

其实看了上面的DataSheet,对我们实际编程参考意义不是很大。从写代码的角度上来说,我更希望知道的是如下问题:
0.EP4CE15F238N支持多少个PLL
1.这个 PLL的IP Core最大倍频支持多少?
2.时钟树最大的时钟支持多少?
使用角度上来说,如何快速调用这个PLL IP Core,帮我解决需求(当然,这个东西一般不写在DataSheet里面。

接下来,我又查找了下相关的DataSheet,解决了如0,上1和2两个疑问。
0.支持四个PLL Core
在这里插入图片描述

1.PLL的IP Core最大支持倍频为402.5Mhz(对于我的EP4CE15F238N来说),对于cyclone IV里面的最高端型号来说,是472.5Mhz。为了系统稳定的话,我们一般PLL到MAX/2(也就是200Mhz左右)。合计了下,一般SDRAM就100Mhz左右,这个200Mhz用来驱动SDRAM没啥问题了
在这里插入图片描述

2.内部时钟树差不多也是400Mhz
在这里插入图片描述
这样看来,还是比较美滋滋的。我从最开始的跑12T的12Mhz 8051单片机,一路到PLL到72Mhz的stm32F103(Cortex m3),再到1T 的24Mhz 8051单片机,再到PLL到120Mhz的松果派ONE(SWM320)。再到600Mhz 双核K210,如果不提i.mx6ul,jetson nano之类的频率比较高的嵌入式/AI开发板。 我觉得这个FPGA点点灯,做做时序控制外部IC,400Mhz,我还是非常满足的。算是我玩过的比较高频率的U了

Verilog

在这里就直接贴代码了,关于IP Core的导入,网上教程很多,大家直接照着搞就行。代码很简单,就是把PLL倍频后的CLK直接output,然后我用示波器测测(我的示波器是200Mhz带宽的,根据示波器带宽比被测型号频率高3-5倍的经验,理论上到40Mhz-67Mhz开始衰减,70Mhz后,赋值就完全衰减成正弦波了…)
如果要测出400Mhz不衰减的方波,按照5倍来配置示波器的话,大约需要带宽2Ghz的示波器,大概查了下价格,国产某源的价格为13W左右,嘿嘿嘿
**在这里需要有个注意事项,就是需要选择专用得PLL output管脚,不然普通IO翻转速度不够,拖后腿了。quartus会出现报错Warning (15064): PLL “pll:pll_core|altpll:altpll_component|pll_altpll:auto_generated|pll1” output port clk[1] feeds output pin “C1~output” via non-dedicated routing – jitter performance depends on switching rate of other design elements. Use PLL dedicated clock outputs to ensure jitter performance
**
如何知道哪些IO是PLL专用/xx专用 IO?
很简单,再分配引脚的时候,点下右边的filter就行。
在这里插入图片描述

module PLL(
	CLK, // PLL输入时钟
	RST_N,
	C0,
	C1,
	C2,
	C3,
	C4,
);


input CLK;
input RST_N;
output C0;
output C1;
output C2;
output C3;
output C4;

wire lock;

pll pll_core(
	.areset(~RST_N),//1复位
	.inclk0(CLK),
	.c0(C0), // 25
	.c1(C1),	//125
	.c2(C2),	//150
	.c3(C3),	//200
	.c4(C4),	//400
	.locked(lock)
);

endmodule

RTL视图

在这里插入图片描述

测试结果

MAX/2的200Mhz,我200M的示波器已经糊成正弦波了
在这里插入图片描述

FPGA中实现PLL,可以使用自定义代码实现。以下是一个简单的例子,演示如何使用自定义代码实现PLL倍频功能: 假设我们有一个输入时钟信号,频率为100MHz,现在需要将其倍频为200MHz。我们可以使用FPGA中的时钟管理器(Clocking Wizard)来生成PLL的基本参数,然后使用自定义代码来实现PLL倍频功能。 首先,打开Vivado软件,并创建一个新的工程。在工程中添加一个时钟管理器(Clocking Wizard),然后设置时钟管理器的输入时钟频率为100MHz,输出时钟频率为200MHz。生成时钟管理器的IP核后,将其添加到工程中。 然后,使用自定义代码实现PLL倍频功能。以下是一个简单的Verilog代码示例: ``` module pll ( input clk_in, // 输入时钟信号 output reg clk_out // 输出时钟信号 ); reg [7:0] cnt = 0; // 计数器 reg locked = 0; // 锁相环锁定标志 always @(posedge clk_in) begin if (cnt == 0) begin locked <= 1; // 锁相环锁定 clk_out <= ~clk_out; // 输出时钟信号翻转 end cnt <= cnt + 1; // 计数器自增 end endmodule ``` 这个代码示例中,我们使用一个计数器来实现时钟倍频的功能。在输入时钟信号的上升沿触发时,计数器对计数值自增1,当计数值达到设定的阈值时,输出时钟信号翻转一次,并将计数器清零。这样就实现了将输入时钟信号倍频输出的功能。 需要注意的是,这个代码示例只是一个简单的演示,实际应用中需要根据具体的需求进行修改和优化。同时,也需要进行时序约束和时序分析,以确保电路的正确性和稳定性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值