专栏首页OpenFPGAPLL、DLL、DCM区别及应用

PLL、DLL、DCM区别及应用

主要包括PLL原理、DLL原理和DCM原理,应用可能只会简单说一说,具体以原理为主。

一、作用

二、PLL原理

这部分摘抄自:ADI官方文档,如需,请自行下载:

https://download.csdn.net/download/pieces_thinking/10710671

1.1 锁相环基本结构

  锁相环是一种反馈系统,其中电压控制振荡器(VCO)和相位比较器相互连接,使得振荡器可以相对于参考信号维持恒定的相位角度。锁相环可用来从固定的低频信号生成稳定的 输出高频信号等。   图1A显示了PLL的基本模型。 PLL可以借助拉普拉斯变换理论,利用正向增益项G(s)和反馈项H(s)来作为负反馈系统进行分析,如图1B所示。其适用负反馈系统的一般公式。

  PLL的基本模块为误差检波器(由鉴频鉴相器和电荷泵组成)、环路滤波器、 VCO和反馈分频器。负反馈强制误差信号e(s)在反馈分频器输出和基准频率处于锁相和锁频状态且FO= NFREF 的点处接近0。   根据图1,当系统使用PLL来生成高于输入的频率时, VCO会以角频率ωO振荡。该信号的一部分会通过分频器以1/N的比率回馈到误差检波器。这种经过分频的频率会馈入误差检波器的其中一个输入端。本例中,另一路输入为固定参考信号。误差检波器会比较两个输入端的信号。当这两个信号输入的相位和频率相等时,误差为常数,环路则处于“锁定”条件下。

鉴频鉴相器(PFD)

  图2显示鉴频鉴相器(PFD)的常见实现方案,该类器件基本上都由两个D型触发器组成。一路Q输出使能正电流源,另一路Q输出则使能负电流源。假设本设计中D型触发器由正边沿触发,那么可能状态就如逻辑表中所示。

  现在考虑系统失锁且+IN处的频率远高于–IN处的频率时电路的性能表现,如图2A所示。由于+IN处的频率远高于–IN处的频率,因此UP输出多数时间处于高电平状态。 +IN上的第一个上升沿会发送输出高电平,并且这种情况会一直持续到–IN上出现第一个上升沿。在实际的系统中,这就意味着输出及VCO的输入会被进一步拉高,进而造成–IN处的频率增加。这恰恰是期望达到的效果。如果+IN处的频率远低于–IN处的,则会出现相反效果。 OUT处的输出多数时间处于低电平状况。这会在负方向上驱动VCO,并再次使得–IN处的频率更加接近+IN处的频率,从而达到锁定条件。   图2B显示了输入处于锁频和接近锁相条件时的波形。由于+IN领先于–IN,因此输出为一系列正电流脉冲。这些脉冲往往会驱动VCO,使得–IN信号变得与+IN信号相位对齐。发生这种情况时,如果U3和U1及U2的CLR输入端之间没有任何延迟元件,那么输出可能会进入高阻抗模式,从而既不会生成正电流脉冲,也不会生成负电流脉冲。这并不是一种很好的状况。 VCO会发生漂移,直到造成显著的相位误差并再次开始生成正电流脉冲或负电流脉冲。这种循环会持续相当长的一段时间,其影响是电荷泵的输出会被某个信号(PFD输入基准频率的次谐波)调制。由于这可能是一种低频信号,因此无法通过环路滤波器进行衰减,从而会导致VCO输出频谱中出现非常明显的杂散,该现象称为“间隙”或“死区”效应。   通过在U3的输出端和U1及U2的CLR输入端之间添加延迟元件,可以确保不会发生这种情况。添加延迟元件后,即使+IN和–IN相位完全对齐时,电荷泵输出端仍会生成电流脉冲,如图2C所示。该延迟的持续时间等于在U3输出处插入的延迟,称为反冲防回差脉冲宽度。请注意,如果+IN频率小于−IN频率且/或+IN相位落后于−IN相位,那么电荷泵的输出将为一系列负电流脉冲,与图2中(A)和(B)所示条件相反。

振荡器/PLL相位噪声

  PLL是一种类型的振荡器,而在任何振荡器设计中,频率稳定性都至关重要。我们需要考虑长期和短期稳定性。长期频率稳定性是关于输出信号在较长时间(几小时、几天或几个月)内的变化情况。其通常以一定时间内的比率Δf/f来规定,单位为百分比或dB。   短期稳定性则是关于几秒或更短时间内的变化情况。这些变化可能是随机的,也可能是周期性的。可以使用频谱分析仪来检查信号的短期稳定性。图5显示了一种典型频谱,其中随机和离散频率成分导致出现大范围的波裙和杂散波峰。

  信号源中的已知时钟频率、电力线干扰和混频器产品都可能引起离散杂散成分。随机噪声波动引起的扩张是相位噪声造成的。其可能是有源和无源器件中的热噪声、散粒噪声和/或闪烁噪声造成的。   振荡器的相位噪声频谱显示1 Hz带宽时噪声功率与频率成函数关系。相位噪声的定义为指定频率偏移fm下1 Hz带宽时噪声与频率fo下振荡器信号幅度的比率。   习惯的做法是以单边相位噪声来表征振荡器,如图6所示;图中绘制了相位噪声与频率偏移fm的函数关系图,其中相位噪声单位为dBc/Hz且频率轴采用对数比例。请注意,实际曲线可以近似表示为数个区域,各区域的斜率为1/fX,其中x = 0时对应于“白”相位噪声区域(斜率 = 0 dB/十倍频程),而x = 1时对应于“闪烁”相位噪声区域(斜率 = –20 dB/十倍频程)。此外还有x = 2, 3, 4时的区域,且这些区域逐渐逼近载波频率。

  请注意,相位噪声曲线有些类似于放大器的输入电压噪声频谱密度。与放大器电压噪声一样,最好在振荡器中使用1/f低转折频率。   在某些情况下,将相位噪声转换成时间抖动会很有用。这可以通过对所需频率范围内的相位噪声图进行基本积分处理来实现。使用PLL输出来驱动ADC采样时钟时,这种在相位噪声和时间抖动之间执行转换的能力特别有用。一旦时间抖动已知,就可以评估其对整体ADC SNR的影响。 ADIsimPLL™程序(稍后讨论)可以执行相位噪声和时间抖动之间的转换。

  其他的详细资料,请自行下载ADI官方文档。

振荡器/PLL另一种形式

  下图是另一种PLL原理图,控制电路由上图的鉴相器和环路滤波器组成,调整振荡器的频率和相位就可以补偿时钟分布造成的时间延迟。

三、DLL原理

  DLL是基于数字抽样方式,在输入时钟和反馈时钟之间插入延迟,使输入时钟和反馈时钟的上升沿一致来实现的。又称数字锁相环。一个最简单的DLL与PLL的主要不同在于DLL用延时线代替了PLL的压控振荡器,延时线产生输入时钟的延时输出。时钟分布网络把时钟送到内部寄存器的时钟端口,控制逻辑对输入时钟和反馈时钟进行抽样、比较,调整延时线。两者的实现方式如下图所示。

  两者功能上都可以实现倍频、分频、占空比调整,但是PLL调节范围更大,比如说:XILINX使用DLL,只能够2、4倍频;ALTERA的PLL可以实现的倍频范围就更大毕竟一个是模拟的、一个是数字的。

区别

 &emsp对于PLL,用的晶振存在不稳定性,而且会累加相位错误,而DLL在这点上做的好一些,抗噪声的能力强些;但PLL在时钟的综合方面做得更好些。总的来说PLL的应用多,DLL则在jitter power precision等方面优于PLL。   DLL数字电路与PLL模拟电路实现时有精确的时序,而数字电路实现时:抗噪声,低功耗,抗抖动,移植性好。   PLL的振荡器有不稳定,相位偏移的积累而DLL技术稳定,没有累计相位偏移。因而在延时补偿和时钟调整时常用DLL。

  目前大多数FPGA厂商都在FPGA内部集成了硬的DLL(Delay-Locked Loop)或者PLL(Phase-Locked Loop),用以完成时钟的高精度、低抖动的倍频、分频、占空比调整移相等。目前高端FPGA产品集成的DLL和PLL资源越来越丰富,功能越来越复杂,精度越来越高(一般在ps的数量级)。Xilinx芯片主要集成的是DLL,而Altera芯片集成的是PLL。Xilinx芯片DLL的模块名称为CLKDLL,在高端FPGA中,CLKDLL的增强型模块为DCM(Digital Clock Manager)。

  Altera芯片的PLL模块也分为增强型PLL(Enhanced PLL)和高速(Fast PLL)等。这些时钟模块的生成和配置方法一般分为两种,一种是在HDL代码和原理图中直接实例化,另一种方法是在IP核生成器中配置相关参数,自动生成IP。Xilinx的IP核生成器叫Core Generator,另外在Xilinx ISE 5.x版本中通过Archetecture Wizard生成DCM模块。Altera的IP核生成器叫做MegaWizard。另外可以通过在综合、实现步骤的约束文件中编写约束属性完成时钟模块的约束。

四、DCM原理

  DCM共由四部分组成,如上图所示。其中最底层仍采用成熟的DLL模块;其次分别为数字频率合成器(DFS,Digital Frequency Synthesizer)、数字移相器(DPS,Digital Phase Shifter)和数字频谱扩展器(DSS,Digital Spread Spectrum)。不同的芯片模块的DCM输入频率范围是不同的

DCM与PLL的区别: (1) DCM只支持90、180、270相位,但PLL这方便更灵活宽泛

(2) DCM只支持2~16的小数分频,以及2倍频,但是PLL这方面更灵活宽泛

(3) DCM是用数字延时模块调理时钟,是纯数字的东西,用的灵活,占得面积小,噪声和jitter相对PLL大一些。

(4) PLL是模拟的,比DCM要浮躁,出来的钟也质量也高,但是比较复杂,占的面积也比DCM大

  深入了解DCM:是基于Xilinx的其他系列器件所采用的数字延迟锁相环(DLL,Delay Locked Loop)模块。在时钟的管理与控制方面,DCM与DLL相比,功能更强大,使用更灵活。DCM的功能包括消除时钟的延时、频率的合成、时钟相位的调整等系统方面的需求。DCM的主要优点在于:

  ①实现零时钟偏移(Skew),消除时钟分配延迟,并实现时钟闭环控制;

  ②时钟可以映射到PCB上用于同步外部芯片,这样就减少了对外部芯片的要求,将芯片内外的时钟控制一体化,以利于系统设计。对于DCM模块来说,其关键参数为输入时钟频率范围、输出时钟频率范围、输入/输出时钟允许抖动范围等。

五、应用

5.1 Quartus II调用PLL

这部分转自: https://blog.csdn.net/u010912383/article/details/52876260?utm_source=copy

Quartus 调用PLL IP核仿真

运行环境:

  • Quartus:Quartus Prime Version 16.0.0 in Linux
  • Simulation: ModleSim-Altera

首先新建一个空的项目,此处较为简单,省略。这里的项目名称为pll_simulation_test,如下图。

编写顶级文件。因为是空的项目,所以没有包含顶级文件,编译的话会出错。新建一个Verilog HDL File,输入以下简单的内容:

module pll_simulation_test(
        input wire clk  //clock signal
);
endmodule   

将其保存名为pll_simulation_test.v的文件。然后Processing -> Start Compilation开始编译。编译的过程需要花点时间,耐心等待一下。编译完成之后如下图:

  1. 产生PLL IP 核。在Quartus的右边找到IP Catalog,如果没有此界面的话的话,点击View -> Utility Windows -> IP Catalog即可出现。如下图所示:

找到Altera PLL,并点击“Add”,弹出如下窗口:

给PLL IP核取名字,这里是my_pll,点击OK。出现IP核的设置界面。

在这里我取消勾选“Enable locked output port”,即让输出只有一个。另外将“Reference Clock Frequency”设置为25.0MHz。点“Finish”完成。

“Exit”之后会弹出一个对话框,询问是否将my_pll.qip文件添加到工程。这里选择”Yes”。

至此,PLL IP Core产生完成。

Tip:你可以将项目导航切换到Files,看看是否有以下文件。

双击“my_pll.v”可以看到PLL IP 核的声明。

编写Test Bench文件

接下来我们开始编写一个简单测试文件。 首先新建一个Verilog HDL Files,取名为my_pll_tb.v。

 // File: my_pll_tb.v
  // Author: ZHUO Zengsi
  // Date: 2016-10-20
  // Function: This test bench file is to test the simulation of
  // PLL IP Core.

  `timescale 1ns/1ps

  module my_pll_tb();

    reg clk;                  // the reference clock signal, 25MHz
    reg rst;                  // the reset signal
    reg unsigned [3: 0] cnt;      // the count of clk, maximum is 15
    wire clk_out;         // the output signal with 100MHz

    my_pll init_my_pll_0(
        .refclk(clk),     // refclk.clk
        .rst(rst),        // reset.reset
        .outclk_0(clk_out)// outclk0.clk
    );

    initial
    begin
        clk = 1'b0;       // make initial value be 0
        rst = 1'b1;   // make initial value be 1
        cnt = 4'b0001;    // make initial value be 1
        #20 rst = 1'b0;   // after 20ns reset finished
    end

    always #20 clk = ~clk;   //reverse the signal every 20ns.

    always @(posedge clk)
    begin
        cnt <= cnt + 1;   // when the clk rise, cnt will increment 1
        if (cnt == 0)     // if cnt is 16, stop the simulation.
            $stop();
    end

  endmodule 

接下来设置仿真环境。打开“Assignments -> Settings”,点击“Simulation”出现如下界面。

在“Tool Name”中选择“ModelSim-ALtera”,选中“Compile test bench”,按照我们写的Test Bench文件来仿真,所以点击“Test Benches”。出现以下界面。

点击“New”新建一个Test Bench,如下图。

这里输入“Test bench name”为my_pll_tb,并在“File ame”中选中刚才编写的my_pll_tb.v文件。 然后“OK”回到上一个界面,再“OK”回到设置界面。

此时,在“Compile test bench”中出现刚下新建的Test Bench了。点击“OK”,仿真环境搭建完成。

仿真结果

接下来我们开始仿真。点击“Tools -> Run Simulation Tool -> RTL Simulation”开始仿真,仿真出现如下结果。

仿真的结果中出现四个信号,其中分别为时钟信号clk,重置信号rst,计数信号cnt以及输出信号clk_out,如下图。

在Test Bench文件中,我们延迟了20ns之后将重置信号置为0,这时候PLL开始正常运行。输入信号clk的频率为25Mhz,输出信号clk_out的频率为100MHz。当cnt的值为16时,停止仿真。总的仿真时间为620ns。

5.2 Xilinx PLL IP核使用方法

转自:https://blog.csdn.net/qq_30866297/article/details/52355245 如图所示,在“Design à Implementation”下的任意空白处单击鼠标右键,弹出菜单中选择“New Source …”。

在弹出的“New Source Wizard à Select Source Type”下,如图所示,选择文件类型为“IP (CORE Generator & Architecture Wizard)”。“File name”可以给新创建的PLL取个名字,我们命名为“pll_controller”。“Location”即生成的新文件所有相关源文件的存储路径,默认即为当前工程路径下的一个名为“ipcore_dir”的文件夹中,通常我们不需要更改它。点击“Next”继续。

接着进入“New Source Wizard à Select IP”页面,如图所示,选择IP核类型为“FPGA Features and Design à Clocking à Clocking Wizard”。点击“Next”继续。

如图所示,前面的配置信息在“New Source Wizard à Summary”页面重新罗列供review。点击“Finish”继续。

此时,我们注意到Design界面下有如图所示的“Creating: pll_controller.xco”的提示信息,大家需要耐心等待一会,新建的PLL模块正在创建中,随后将会弹出PLL的配置页面。

PLL配置

如图所示,在弹出的PLL配置页面Page1中,主要设置“Input Clock Information”下的输入时钟频率,这里我们在“Value”下输入“25”MHz。其他的配置通常使用默认即可,大家也可以点击右下角的“Datasheet”查看文档,确认相关设置的具体含义。

在page2中,如图所示,我们设置CLK_OUT1的输出时钟频率为12.5(单位:MHz),同时勾选CLK_OUT2、CLK_OUT3和CLK_OUT4,并且分别设置它们的频率为25、50和100(MHz)。

Page3中,如图所示,勾选“RESET”和“LOCKED”这两个接口。RESET即整个PLL的复位信号,LOCKED则是PLL输出时钟正常工作的指示信号。

完成上面的配置,在Page5中,如图所示,所有相关的配置信息都在此罗列出来了,供review。

与此同时,如图所示,在PLL配置页面的右侧,所有可用于连接到我们的逻辑中的信号接口也都一览无余,非常直观。

最后,在page6中,如图所示,PLL模块配置完成后,将会生成的所有相关源文件都罗列出来了。

我们可以点击PLL配置页面右下角的“Generate”生成当前配置。

如图所示,在“Design à Implementation”中出现了刚刚配置的pll_controller模块,选中它,然后在“Processes”中,我们可以双击“View HDL Instantiation Template”打开PLL文件的例化模板。

如图所示,这边是pll_controller的例化模板,我们把它复制到我们的设计模块中,然后更改“()”内的信号名称,和我们的模块信号名称一致。具体请参考设计实例的源代码。

本文分享自微信公众号 - OpenFPGA(OpenFPGA),作者:碎碎思

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MII2RGMII IP核使用设计举例

    本例程将 PS 的 ETH1 通过 EMIO 方式引出, 通过 EMIO 引出的 ETH 为 GMII 接口, 将其与 GMII to RGMII IP 核连接...

    碎碎思
  • 基于TCP/IP协议的电口通信

    之前有介绍过TCP/IP协议的实现是通过轻量级LWIP协议实现的,具体在FPGA中实现又可以分为多种方式,具体如下:

    碎碎思
  • 基于UDP/IP协议的电口通信(二)

    上一篇对整个UDP/IP协议的电口通信设计有个整体了解,接下来就是对于每个模块的设计,这部分,计划用两篇文章完成,会尽量简洁一点,谢谢大家支持。

    碎碎思
  • vue中对el-dialog宽度调整方法之一二

    vue时,会用到el-dialog做为弹窗,但这个弹窗的宽度默认为50%.因项目中需要调整弹偿的宽度,需要设置其属性。 尝试过程如下:

    星痕
  • 苹果的无人车野心,是如何缩水成“自动化系统”的?

    李林 编译整理 量子位 报道 | 公众号 QbitAI 近来,库克每次公开演讲,必然要谈及苹果专注于“autonomous system”,自动化系统。也就是说...

    量子位
  • Python之函数编程(1)

    第一次接触到这个知识点的时候,我还不是特别适应,内置的函数怎么可以用一个变量来代替?但是python确实是这么做的,这也不妨碍它的顺利执行。举个例子说明...

    AsiaYe
  • 【DB笔试面试506】基于主机数据复制技术的灾备方案有哪些?

    采用基于主机系统的数据复制技术的核心是利用主、备中心主机系统通过IP网络建立数据传输通道,通过主机数据管理软件实现数据的远程复制,当主数据中心的数据遭到破坏时,...

    小麦苗DBA宝典
  • Elasticsearch存储深入详解

    在本文中,我们将研究Elasticsearch的各个部分写入数据目录的文件。我们将查看节点,索引和分片级文件,并简要说明其内容,以便了解Elasticsearc...

    铭毅天下
  • Python入门高阶教程-高阶函数

    前面写的 Python 入门教程中只有基础入门和基础进阶两部分,可以在公众号下拉菜单中找到,小一我都已经分好类了。

    知秋小一
  • 机器学习(二) ——线性回归、代价函数与梯度下降基础

    机器学习(二) ——线性回归、代价函数与梯度下降基础 (原创内容,转载请注明来源,谢谢) 一、线性回归 线性回归是监督学习中的重要算法,其主要目的在于用一个...

    用户1327360

扫码关注云+社区

领取腾讯云代金券