写在前面
今天时间还早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结构图
其次是一些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的示波器已经糊成正弦波了