写在前面

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

PLL原理

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

FPGA的PLL特性

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

首先,是一张PLL结构图

pigx技术架构文档_pigx技术架构文档

其次是一些NOTE

pigx技术架构文档_正弦波_02

然后是它的输出结构

pigx技术架构文档_pigx技术架构文档_03

最大PLL输出频率

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

接下来,我又查找了下相关的DataSheet,解决了如0,上1和2两个疑问。

0.支持四个PLL Core

pigx技术架构文档_pigx技术架构文档_04

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

pigx技术架构文档_FPGA_05

2.内部时钟树差不多也是400Mhz

pigx技术架构文档_IP_06


这样看来,还是比较美滋滋的。我从最开始的跑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就行。

pigx技术架构文档_IP_07

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视图

pigx技术架构文档_Core_08

测试结果

MAX/2的200Mhz,我200M的示波器已经糊成正弦波了

pigx技术架构文档_FPGA_09