目录
PLL 的英文全称是 Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL 对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。Xilinx 7 系列器件中的时钟资源包含了时钟管理单元 CMT,每个 CMT 由一个 MMCM 和一个 PLL 组成。对于一个简单的设计来说,FPGA 整个系统使用一个时钟或者通过编写代码的方式对时钟进行分频是可以完成的,但是对于稍微复杂一点的系统来说,系统中往往需要使用多个时钟和时钟相位的偏移,且通过编写代码输出的时钟无法实现时钟的倍频,因此学习 Xilinx MMCM/PLL IP 核的使用方法是我们学习 FPGA 的一个重要内容。本章我们将通过一个简单的例程来向大家介绍一下 MMCM/PLL IP 核的使用方法。
1 MMCM/PLL IP 核简介
锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号
控制
环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。
锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
Xilinx 7 系列器件中具有时钟管理单元
CMT
时钟资源,
xc7z020
芯片内部有
4
个
CMT
,
xc7z010
芯片内部有 2
个
CMT
,为设备提供强大的系统时钟管理以及高速
I/O
通信的能力。时钟管理单元
CMT
的总体框图如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/22a693ad3440838d30b174ffe0c95f6b.png)
MMCM/PLL 的参考时钟输入可以是
IBUFG(CC)
即具有时钟能力的
IO
输入、区域时钟
BUFR
、全局时钟 BUFG
、
GT
收发器输出时钟、行时钟
BUFH
以及本地布线(不推荐使用本地布线来驱动时钟资源)。在最多的情况下,MMCM/PLL
的参考时钟输入都是来自
IBUFG(CC)
即具有时钟能力的
IO
输入,本实验也是如此。MMCM/PLL
的输出可以驱动全局时钟 BUFG 和行时钟BUFH 等等。BUFG 能够驱动整个器件内部的 PL 侧通用逻辑的所有时序单元的时钟端口。
BUFG/BUFH/CMT
在一个时钟区域内的连接框图如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/0b76368c04333608a50e35460b74e531.png)
在本实验中,读者可以简单地理解为:外部时钟连接到具有时钟能力的输入引脚 CCIO
(
Clock-Capable Input),进入
MMCM/PLL
,产生不同频率和不同相位的时钟信号,然后驱动全局时钟资源BUFG。但是要进行更深入的
FPGA
开发,就必须理解器件的
时钟资源
架构。有关
Xilinx
时钟资源和
CMT的更详细信息,读者后期可以花一些时间和精力去学习一下 Xilinx
官方的手册文档
“UG472
,
7 Series FPGAs Clocking Resources User Guide”里的介绍。
时钟资源简介
![](https://i-blog.csdnimg.cn/blog_migrate/027ae867669abfbf4b532ca31297903f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e970937d7b0fe032f865c925ff7fd3f0.png)
UG472
![](https://i-blog.csdnimg.cn/blog_migrate/24f0e3406e764d572b6693d93b01815b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/953202ab8808b10f4c9f4bc3eb397069.png)
MMCM 和
PLL
的总体框图如上面两张图所示。
其中 MMCM
的功能是 PLL
的超集,其具有比
PLL
更强大的相移功能。
MMCM
主要用于驱动器件逻辑(CLB
、
DSP
、
RAM
等)的时钟。
PLL
主要用于为内存接口生成所需的时钟信号,但也具有与器件逻辑的连接,因此如果需要额外的功能,它们可以用作额外的时钟资源。
PLL 由以下几部分组成:前置分频计数器(
D
计数器)、相位
-
频率检测器(
PFD
,Phase-Frequency Detector)电路,电荷泵(Charge Pump)、环路滤波器(Loop Filter)、压控振荡器(VCO,Voltage Controlled Oscillator)、反馈乘法器计数器(M 计数器)和后置分频计数器(O1-O6 计数器)。
在工作时,PFD
检测其参考频率(FREF
)和反馈信号(Feedback)之间的相位差和频率差,控制电荷泵和环路滤波器将相位差转换为控制电压;VCO
根据不同的控制电压产生不同的震荡频率,从而影响 Feedback 信号的相位和频率。在
F
REF
和
Feedback
信号具有相同的相位和频率之后,就认为
PLL
处于锁相的状态。
在反馈路径中插入 M
计数器会使
VCO
的震荡频率是
F
REF
信号频率的
M
倍,
F
REF
信号等于输入时钟 (FIN
)除以预缩放计数器(
D
)。参考频率用以下方程描述:
F
REF
= F
IN
/D
,
VCO
输出频率为
F
VCO
= FIN
*M/D
,
PLL
的输出频率为
F
OUT
=
(FIN
*M
)
/
(
N*O
)。
Xilinx 提供了用于实现时钟功能的
IP
核
Clocking Wizard
,该
IP
核能够根据用户的时钟需求自动配置器件内部的 CMT
及时钟资源,以实现用户的时钟需求。在这里我们主要讲解的是如何使用该
IP
核,有关该 IP
核的更详细介绍,读者可以参阅
Xilinx
官方的手册文档
“PG065
,
Clocking Wizard v6.0 LogiCORE IP Product Guide”。
2 实验任务
本节实验任务是使用 Zynq
开发板输出
4
个不同时钟频率或相位的时钟,并在
Vivado
中进行仿真以验证结果,最后生成比特流文件并将下载到开发板上,使用示波器来测量时钟的频率。
3 硬件设计
![](https://i-blog.csdnimg.cn/blog_migrate/8a9cb72cb6c06c8c15dfe3e280c542e6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/699cb41f59e46b89b72f2f1c48cb03d6.png)
对应的
XDC
约束语句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]set_property -dict {PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports clk_100m]set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports clk_100m_180deg]set_property -dict {PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports clk_50m]set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk_25m]
4 程序设计
我们首先创建一个空的工程,工程名为“
ip_clk_wiz
”。接下来添加
PLL IP
核。在
Vivado
软件的左侧 “Flow Navigator
”栏中单击“
IP Catalog
”,“
IP Catalog
”按钮以及单击后弹出的“
IP Catalog
”窗口如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/dbdc6f6b7f62aac3677e7650f5f3ac12.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a34c12964f0ca59d1551152f49af5a14.png)
打开“IP Catalog”
窗口后,在搜索栏中输入
“clock”
关键字,可以看到
Vivado
已经自动查找出了与关键字匹配的 IP
核名称,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/356a8f699bdd9f66a769a045280ac7d3.png)
双击“FPGA Features and Design
”→“
Clocking
”下的“
Clocking Wizard
”,弹出
“Customize IP”窗口。
最上面的“Component Name”一栏设置该 IP 元件的名称,这里保持默认即可。
“Port Renaming”选项卡主要是对一些控制信号的重命名。
最后的“
Summary
”选项卡是对前面所有配置的一个总结,在这里我们直接点击“
OK
”按钮即可。
接着就弹出了“Genarate Output Products
”窗口,我们直接点击“
Generate
”即可。
之后我们就可以在“Design Run
”窗口的“
Out-of-Context Module Runs
”一栏中出现了该
IP
核对应的 run“
clk_wiz_0_synth_1
”,其综合过程独立于顶层设计的综合。
开始编写代码:
首先打开 IP
核的例化模板,在 “Source
”窗口中的“
IP Sources
”选项卡中,依次用鼠标单击展开“
IP
”
-“clk_wiz_0”-
“
Instantitation Template”,我们可以看到“
clk_wiz.veo
”文件,它是由
IP
核自动生成的只读的
verilog
例化模板文件,双击就可以打开它,在例化时钟 IP
核模块的时钟,可以直接从这里拷贝。
接下来创建一个 verilog
源文件,代码如下:(太简单了,就不浪费时间粘了)