PLL与MMCM

FPGA中,外部时钟域与主时钟域不同步将导致各种各样的复杂情况的出现,因此异步时钟域的处理往往是一个重要的问题,也有各种各样的解决办法,如特定的握手协议、异步FIFO、双时域同步器、锁相环等。锁相环(PLL,Phase-Locked Loop)是一种能够自动跟踪输入信号相频,从而实现信号同步的电路,主要由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)、压控振荡器(VCO,Voltage Controlled Oscillator)组成。模拟鉴相器是一个乘法器,能够将相位差信号转换成控制电压,环路滤波是一个低通滤波器,平滑控制电压的变化,调节VCO的响应速度和稳定性,对能否锁相起到至关重要的作用。一种常用的压控振荡器通过变容二极管实现,根据不同的电压电容容值发生变化,从而实现了不同频率信号的输出,最后锁相环电路输出信号将实现与输入信号同步。

Altera公司IP核采用了PLL,赛灵思公司则采用了混合模式时钟管理(MMCM,Mixed-Mode Clock Manager),MMCM中集成了PLL以及其他部件,实现了更高精度的时钟输出以及更大范围的频率合成与输出。

配置

下文记录了IP核MMCM的配置(参考Clocking Wizard v6.0)以及验证:通过50M输入时钟得到两个输出时钟分别为122.88M以及245.76M。

  1. 时钟配置选择频率合成、相位校准,平衡模式,输入频率50MHz 时钟选择页其余参数说明:
    •频率合成允许输出时钟具有与活动输入时钟不同的频率。

•扩频提供调制输出时钟,从而降低电子设备产生的电磁干扰(EMI)的频谱密度。此功能仅适用于MMCM(E2/E3/E4)_ADV原语。UNISIM对该功能的模拟支持目前不可用。

•相位校准允许输出时钟相位锁定到参考,例如设备的输入时钟引脚。

•最小化功率使您能够最小化基本体所需的功率,这可能以频率、相位偏移或占空比精度为代价。

•动态相移允许您更改输出时钟上的相位关系。

•动态重新配置允许您在设备配置后更改基元的编程。选择此选项时,默认情况下会选择AXI4 Lite接口来重新配置时钟原语。

•平衡。选择Balanced会导致软件选择正确的带宽进行抖动优化

•最小化输出抖动。此功能最大限度地减少了输出时钟上的抖动,但代价是功率和可能的输出时钟相位误差。此功能不适用于最大化输入抖动滤波功能。

•最大化输入抖动滤波允许输入时钟上出现更大的输入抖动,但会对输出时钟上的抖动产生负面影响。此功能不适用于最小化输出抖动功能。

•安全时钟启动和排序可用于在输出端获得稳定有效的时钟。它还按照配置中指定的特定顺序启用时钟。

•时钟监视器可帮助您监视时钟向导的时钟输入。它最多可以监测四个时钟。您可以监视输入频率是否超出预期频率的范围。

•Auto Primitive根据您的需求实例化适当的计时原语。您不需要知道MMCM或PLL的规格来判断哪个原语适合您的需求;向导会为您执行此操作。此功能仅适用于UltraScale™和UltraScale+™设备。

  1. 输出时钟设置为122.88M以及245.76M,系统会自动计算最接近的时钟大小。

RTL代码编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module Clk_Generator(
clk_in,
rst,

clk_out122,
clk_out245,
locked
);
input clk_in;
input rst;

output clk_out122;
output clk_out245;
output locked;

IP_MMCM IP_MMCM
(
// Clock out ports
.clk_out1(clk_out122), // output clk_out1
.clk_out2(clk_out245), // output clk_out2
// Status and control signals
.reset(!rst), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(clk_in)); // input clk_in1
endmodule

testbench验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
`timescale 1ns / 1ps
`define period 20
module Clk_Generator_tb;
reg clk_in;
reg rst;
wire clk_out122;
wire clk_out245;
wire locked;

Clk_Generator Clk_Generator(
.clk_in(clk_in),
.rst(rst),

.clk_out122(clk_out122),
.clk_out245(clk_out245),
.locked(locked)
);
initial clk_in=1;
always#(`period/2)clk_in=~clk_in;

initial begin
rst=0; //低电平复位
#201
rst=1;
end
endmodule

结果记录

复位信号在201ns进入高电平,在3060ns产生输出时钟信号,在3555ns有效信号输出高电平,锁相成功。

参考链接: 锁相环原理:https://blog.csdn.net/u013178472/article/details/105620578