Chisel(Constructing Hardware In a Scala Embedded Language)是UC Berkeley开发的一种开源硬件构造语言。
站长xddcore有话说:在我大二的时候,因为项目需要,接触了Chisel。在体验过后,我被它深深的吸引了。我幻想着它十年后的样子,充满希望。于是创建了这个博客,让更多人的了解Chisel,学习Chisel。

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

内容纲要
Reading Time: 2 minutes

写在前面

今天时间还早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的示波器已经糊成正弦波了
在这里插入图片描述

Share

xddcore

xddcore www.github.com/xddcore

You may also like...

发表回复

您的电子邮箱地址不会被公开。