PLL/DLL/DCM/MMCM
在 Xilinx 的 FPGA 中,时钟管理器称为 Clock Management ,简称 CMT 。常用到的 DCM / PLL / MMCM 都包含在 CMT 中。
PLL
PLL 简介
PLL 就是锁相环,具有时钟倍频、分频,调节相位等都是可以用 PLL ,而且 PLL 是一个模拟电路,它产生的频率比 DCM 更加准确,jitter 也更好,但 PLL 无法动态调整相位。
PLL 组成
1. 鉴频鉴相器
2. 电荷泵
3. 环路滤波器
4. 压控振荡器
PLL 在芯片上的位置
DLL
DLL 简介
DLL 主要由一个延时线和控制逻辑组成。延时线对时钟输入端 CLKIN 产生一个延时,时钟分布网线将该时钟分配到器件内的各个寄存器和时钟反馈端 CLKFB ;控制逻辑在反馈时钟到达时采样输入时钟以调整二者之间的偏差,实现输入和输出的零延时。
具体工作原理是:控制逻辑在比较输入时钟和反馈时钟的偏差后,调整延时线参数,在输入时钟后不停地插入延时,直到输入时钟和反馈时钟的上升沿同步,锁定环路进入“锁定”状态,只要输入时钟不发生变化,输入时钟和反馈时钟就保持同步。DLL 可以被用来实现一些电路以完善和简化系统级设计,如提供零传播延迟,低时钟相位差和高级时钟区域控制等。
DLL 的优点
- 实现零时钟延时,消除了时间分配延时,实现了时钟闭环控制
- 可用于外部芯片的同步,使得内外时钟一体化。
DLL 与 PLL 区别
DLL 与 PLL 的主要不同在于 DLL 用延时线代替了 PLL 的压控振荡器,延时线产生输入时钟的延时输出。时钟分布网络把时钟送到内部寄存器的时钟端口,控制逻辑对输入时钟和反馈时钟进行抽样、比较,调整延时线。两者的实现方式如下图所示。
DCM
DCM 是比较早的 FPGA 中使用的,某些 Sparten-3 和 Virtex-4 ,后面的器件不再使用了。在 Virtex-4 中,CMT 包括一个P LL 和两个 DCM 。DCM 的核心是 DLL ,即延迟 Locked Loop ,它是一个数字模块,可以产生不同相位的时钟,分频,倍频,相位动态调整等,但精度有限。
DCM 在芯片上的位置
MMCM
MMCM 是混合模式时钟管理器,它的官方解释是:这是一个 PLL ,上面加上了 DCM 的一小部分以进行精细的相移(这就是它的混合模式的原因 PLL 是模拟的,但是相移是数字的) 。它是在 PLL 的基础上加上了相位动态调整功能,因为 PLL 是模块电路,而动态调相是数字电路,所以叫混合模式。
- Virtex-6 中也只有 MMCM 。
- 7系列 FPGA 中,每个 CMT 包含一个 MMCM 和一个 PLL 。
- Ultrascale 系列 FPGA 中,一个 CMT 包含一个 MMCM 和两个 PLL 。
MMCM相对PLL的优势就是相位可动态调整,但 PLL 占用的面积更小。
MMCM 在芯片上的位置
参考链接
- PLL datasheet
https://www.xilinx.com/support/documentation/ip_documentation/pll_module.pdf
https://www.xilinx.com/support/documentation/user_guides/ug572-ultrascale-clocking.pdf
https://www.xilinx.com/support/documentation/user_guides/ug472_7Series_Clocking.pdf
- DCM datasheet
https://www.xilinx.com/support/documentation/application_notes/xapp462.pdf
- MMCM datasheet
www.xilinx.com/support/documentation/ip_documentation/mmcm_module.pdf
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- 大白话-constructor
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- React Native在Android平台运行gif的解决方法
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- Android ormLite复杂条件查询
- Effective Modern C++翻译(1):序言
- C++操作mysql方法总结(2)
- Linux基础(day3)
- C++操作mysql方法总结(1)
- javascript实现最基本、最简单的继承
- C++操作mysql方法总结(3)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Jaba_Web--JDBC 查询记录操作模板
- Linux下如何删除指定路径下所有的__pycache__文件夹?
- js逐步实现原生flex系统
- POJ 2054 Color a Tree解题报告
- Jaba_Web--JDBC 删除记录操作模板
- POJ 1789 Truck History 最小生成树
- Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
- Codeforces Round #677 (Div. 3)
- Java_Web--JDBC 增加记录操作模板
- js逐步实现原生控制系统
- STL 训练 POJ - 1862 Stripies
- Cypress系列(66)- 测试运行最佳实践
- Golang内存逃逸是什么?怎么避免内存逃逸?
- js逐步教实现表单系统
- STL训练 HDU - 1716 Ray又对数字的列产生了兴趣: