2026/9/6 18:28:05

数字倍频电路设计实战:PLL、DLL与FPGA实现全解析

数字倍频电路设计实战:PLL、DLL与FPGA实现全解析 简介一份聚焦数字倍频电路研究的专业技术文档面向电子、通信及自动化方向的工程师与学习者系统梳理了锁相环倍频、DDS数字倍频以及VHDL实现倍频器三条技术路线。文档从CD4046集成锁相环的内部结构与工作原理入手结合CD4518计数分频器给出×10、×100倍频电路设计同时介绍利用DDS结合等精度测频原理实现数字倍频的方法以及基于VHDL语言的倍频器设计与MaxplusⅡ仿真验证流程并扩展至AT89C2051单片锁相倍频电路和64倍锁相环实际应用案例。内容组织为1个doc文档压缩包大小约1.57MB便于直接阅读与打印已有165人浏览学习。读者可借助这份文档快速建立数字倍频技术的整体框架掌握从电路设计、误差分析到仿真验证的关键细节适用于课程设计、项目研发或技术预研参考。 做硬件这些年我经常遇到一个看起来不起眼、实际上挺关键的需求系统里只有一个低频参考源但某个模块需要更高频率的时钟。比如手里只有10MHz温补晶振ADC却要100MHz采样时钟或者传感器输出几kHz脉冲控制电路却需要几百kHz的同步信号。这种把低频信号变成高频信号的处理核心就是数字倍频电路。它属于数字电路里的基础模块但在时钟产生、通信系统、仪器仪表和FPGA开发里无处不在。数字倍频电路说到底是一套用数字逻辑把输入信号频率按整数倍提升的电路方案常见做法有锁相环倍频、延迟锁定环倍频和计数器分频整形这三种。和传统的模拟倍频器相比它的可编程性强、温漂小、易于集成也更适合在一个复杂系统里做时钟管理和同步。下面用我实际做过的项目为例把方案选择、参数计算、FPGA实现和排查技巧一次说清楚。这篇文章适合正在做FPGA开发、板级硬件设计或者嵌入式时钟方案的工程师也适合准备入门数字电路设计的学生参考。1. 数字倍频电路的核心思路与方案选型1.1 为什么不用模拟倍频模拟倍频器常见于射频前端利用非线性器件的谐波产生倍频信号再用滤波器把想要的谐波选出来。优点是输出频率可以做到很高适合微波毫米波场景。但放在普通数字系统里就非常麻烦谐波抑制困难滤波器要反复调输入频率一变整个匹配网络可能都要重来。更头疼的是模拟倍频对温度和器件批次都很敏感同一块板子换一颗管子输出幅度和相位就可能不一样。数字倍频的思路完全不同它不在模拟域靠非线性产生谐波而是在数字域把频率和相位关系管理起来用反馈环路或逻辑计数器把输出信号和输入参考锁定在某些整数倍关系上。这样一来环境温度变化、器件批次差异对频率精度的影响就小很多参数修改也方便。现代FPGA和MCU内部基本都自带PLL等时钟管理单元做数字倍频甚至不需要额外物料这是它取代模拟方案的根本原因。1.2 三种主流数字倍频方案对比我平时用到的数字倍频方案主要有三种下面这个表格可以很直观地看到它们之间的差异。方案基本原理优点缺点适用场景PLL倍频压控振荡器加反馈分频锁定到参考时钟的N倍频率高、抖动低、输出连续可调FPGA内部资源丰富需要锁定时间环路参数设计复杂VCO工作范围有限制高频时钟生成、ADC/DAC采样时钟、通信本振DLL多相倍频用延迟线产生多个相位边沿组合得到倍频脉冲锁定快抖动累积小适合片上时钟同步倍频倍数有限延迟线精度受工艺影响需要校准片内时钟相位对齐、中低频倍频计数器分频整形用高频基准时钟对输入信号周期计数按阈值翻转输出逻辑简单纯数字实现不依赖模拟模块输出频率远低于基准时钟相位抖动大不适合高频低速脉冲倍频、低速控制信号同步从这张表能看出来没有哪个方案是万能的。我做时钟方案时第一步永远是先明确需求而不是看到PLL就直接套。目标频率上百MHz且对抖动敏感那大概率是PLL只是想把一个低速脉冲翻倍翻十倍系统里又有现成的主时钟那计数整形最省事要的是片内多相位时钟DLL才是对口选择。1.3 选型思路先看三个问题选型时我习惯先自问三个问题目标频率是多少相位噪声和抖动要求有多严系统里有没有可用的高频基准时钟。这三个问题问完方案基本就定了一半。如果目标频率在几十MHz以上又要求低抖动基本只能选PLL。FPGA内部集成了模拟锁相环和时钟管理模块直接用IP核例化就行不用管外面那一堆环路滤波器和鉴相器这是最省心的做法。如果目标只是把低速脉冲做整数倍扩充而且系统里已经有一路高得多的系统时钟用计数器整形反而更可控因为它不涉及模拟环路逻辑行为完全确定仿真也好收敛。如果目标是保证多个模块之间的时钟相位关系比如DDR读写时钟对齐那就要考虑DLL方案或者用PLL的反馈补偿功能。这里提醒一句很多资料把PLL和DLL混着讲实际用起来差别很大。PLL通过调整压控振荡器的频率来对齐相位输出频率可以很高DLL只延迟输入时钟不改变频率。做倍频时DLL更多是作为辅助手段去产生精密相位而不是直接产生高频输出。2. 锁相环倍频的设计要点2.1 锁相环倍频的工作流程锁相环的基本组成包括鉴相器、环路滤波器、压控振荡器和反馈分频器。输入参考Fref经过前置分频M得到鉴相频率FpdVCO输出Fvco再经过反馈分频器N分频后回到鉴相器和Fpd比较。鉴相器输出的误差信号经过环路滤波器转换成直流控制电压调整VCO的振荡频率直到Fvco/N等于Fpd环路就锁定。这整套过程的本质是把VCO这个“自由运行”的振荡器通过负反馈强行拉扯到输入参考的整数倍关系上。锁定后的输出频率可以写成Fout Fvco / O Fref * N / (M * O)。这个公式就是PLL配置的核心只要搞懂它看任何PLL芯片的寄存器配置都不会慌。2.2 参数计算示例10MHz变100MHz举个例子我手头有个项目拿10MHz温补晶振做参考需要100MHz采样时钟用的Xilinx Artix-7内部有MMCM。很多人拿到这个需求会想倍频10倍反馈分频器N10不就行了但FPGA的MMCM内部还有VCO频率范围限制不能直接让VCO跑在100MHz这种低频率上。查Artix-7手册MMCM的VCO推荐范围大约在600MHz到1200MHz。我们取DIVCLK_DIVIDE1鉴相频率就是10MHz。为了让VCO落在合理范围取反馈倍频M60那么VCO10MHz×60600MHz。输出需要100MHz所以后置分频O600MHz/100MHz6。最终配置参数是CLKIN1_PERIOD10.000、CLKFBOUT_MULT_F60.0、DIVCLK_DIVIDE1、CLKOUT0_DIVIDE_F6.0。表面看这是60倍频后再6分频做了无用功实际是因为PLL的VCO需要在较高频率点工作才能获得更好的抖动特性。绕这一圈不是多此一举而是为了性能。这也是新手配PLL参数时最容易踩的坑看到倍频倍数就直接填结果生成的IP核报错或者无法收敛。2.3 相位噪声、锁定时间和环路稳定性怎么平衡锁相环的环路带宽是设计里的关键取舍。环路带宽越宽锁定速度越快对VCO相位噪声的抑制越好但对参考时钟噪声和鉴相杂散的抑制变差输出容易出现参考杂散。环路带宽越窄输出相位噪声更接近VCO自由振荡噪声锁定时间拉长杂散指标反而好一些。我实际调下来比较稳妥的做法是把环路带宽设置在鉴相频率的1/20到1/10左右。比如前面例子鉴相频率10MHz环路带宽放到几百kHz量级锁定时间和噪声性能相对均衡。如果系统要求上电快速出时钟不能只靠调环路带宽还得在软件里等PLL的locked信号并且在FPGA内部用状态机把复位释放和PLL锁定串起来避免下游模块在时钟还没稳定时就开始工作。2.4 容易忽略的约束和复位问题用FPGA内部PLL时有几个坑我几乎每次都要提醒同行注意。第一配置参数必须满足手册给出的VCO范围限制不能只盯着输入输出频率匹配就完事。第二PLL输出时钟必须先经过BUFG等全局时钟网络再送给内部逻辑否则时序约束很难满足布局布线也会非常痛苦。第三复位信号不能乱拉PLL在复位释放后需要重新锁定如果系统频繁复位输出时钟会反复中断严重时直接导致功能性异常。还有一点容易被漏掉如果下游ADC或DAC对采样时钟和参考时钟的相位有精度要求最好用外部反馈或者调整相位偏移而不是默认输出和输入同相。很多场景里相位关系比频率数值更敏感。3. 实操过程基于FPGA实现数字倍频电路3.1 用FPGA内部PLL/MMCM实现接着用Artix-7的例子说实操。在Vivado里可以用Clocking Wizard生成一个PLL配置把参考时钟10MHz填进去输出100MHz然后会自动生成MMCM原语的例化代码。核心部分大致是下面这个样子。MMCME2_BASE #( .CLKIN1_PERIOD(10.000), // 10MHz参考时钟周期 .CLKFBOUT_MULT_F(60.0), // VCO 10MHz * 60 600MHz .DIVCLK_DIVIDE(1), .CLKOUT0_DIVIDE_F(6.0) // 输出 600MHz / 6 100MHz ) mmcm_inst ( .CLKOUT0(clk_100m), .CLKOUT0B(), .CLKFBOUT(clkfb), .LOCKED(locked), .CLKIN1(clk_10m), .PWRDWN(1b0), .RST(~rst_n), .CLKFBIN(clkfb) );代码看起来不多但有几个点必须处理到位。参考时钟输入要接在专用时钟引脚上不能随便接一个普通GPIO否则内部时钟网络没法正确驱动。输出时钟clk_100m要在一个always块里同步使用避免跨时钟域问题。locked信号要接入逻辑作为下游模块的复位释放和状态机启动条件。把设计综合并加载到板子上之后我习惯把clk_100m引到一个空闲的IO引脚用示波器直接观察波形。注意选择IO bank的时候尽量选高速bank普通的低速引脚边沿会变钝测出来的波形会很差。3.2 不用PLL的计数倍频方法没有PLL资源的时候也有办法。用系统高频基准时钟比如100MHz去检测输入脉冲的上升沿然后按计数阈值翻转输出。举个例子输入信号是1kHz想倍频100倍也就是输出100kHz计数逻辑可以这样设计检测到输入上升沿后计数器从0开始累加计数到499时输出拉高计数到999时输出拉低并清零。这样输出一个周期正好1000个系统时钟也就是10us对应100kHz。reg [9:0] cnt; reg out_pulse; always (posedge clk_100m or negedge rst_n) begin if (!rst_n) begin cnt 10d0; out_pulse 1b0; end else if (input_rising_edge) begin cnt 10d0; out_pulse 1b0; // 与输入信号对齐 end else if (cnt 10d499) begin cnt cnt 1b1; out_pulse 1b1; // 半周期翻转 end else if (cnt 10d999) begin cnt 10d0; out_pulse 1b0; end else begin cnt cnt 1b1; end end这种做法的本质是“重新整形”不是传统意义上的相位锁定。它的误差是一个系统时钟周期所以只适合输出频率远低于系统时钟的场景。我用这个方法做过一个低速转盘测速信号倍频主频48MHz输出只需要几十kHz效果很好。但如果想用这个方法把10MHz倍频到100MHz就不现实了系统时钟至少要跑在几GHz以上这已经超出了普通FPGA的能力。3.3 DLL多相倍频的思路第三种是DLL多相倍频我在做DDR相关时钟同步时接触得比较多。DLL和PLL最大的区别在于DLL没有VCO它是用压控延迟线产生一整周期的相位延迟然后把延迟线分成若干级每一级输出一个等间隔的相移时钟。比如延迟线分成8级每级延迟就是输入时钟周期的1/8。用逻辑把相邻两个时钟边沿组合起来就能得到8倍频的脉冲序列。这种结构锁定速度快抖动累积小很适合片内多相时钟生成。缺点是倍频倍数基本受限延迟线精度也受工艺影响一般不会拿它去生成远高于参考的高频时钟。在FPGA里这类能力通常封装在高速IO和特定时钟原语中不建议自己用门电路搭。3.4 实测波形和结果分析实际验证时把10MHz参考和100MHz输出同时接到示波器上可以看到输出频率稳定在输入频率的10倍上升沿和参考信号的固定相位对齐。频谱仪上能看到基波和杂散表现正常情况下杂散应该出现在偏离载波10MHz和20MHz的位置对应参考频率的整数倍。如果杂散幅度超标先检查环路带宽设置再检查电源滤波和参考时钟走线很多问题是PCB布局造成的而不是PLL本身的问题。我在一次测试中遇到的杂散是参考时钟走线太长和旁边的数字信号线形成了耦合干扰直接串入参考时钟输入端。把走线缩短并加宽间距后杂散下降了至少10dB效果非常明显。4. 常见问题与排查技巧实录4.1 锁不住、失锁怎么查PLL锁不住是最常见的问题也是最容易误判的问题。我收到这类问题后的排查顺序基本是固定的。第一看locked信号如果上电后一直拉低说明确实没锁住。第二用示波器实测参考时钟引脚确认参考信号真的进来了频率、幅度和上升沿都正常。第三检查配置参数有没有超出VCO范围尤其是反馈倍频乘以输入频率之后的结果必须落在手册规定的区间内。第四查电源纹波VCO供电对噪声极其敏感纹波大大会导致锁定困难。如果是分立PLL方案还要重点检查环路滤波器的电容和电阻是否焊对封装、容差、温漂都会影响环路稳定性。我见过一块板子锁不住是因为环路滤波器的一个电容用了错误的材质低频特性严重偏移导致负反馈变成正反馈。4.2 输出抖动大、杂散高怎么办抖动来源无非三类参考时钟本身抖动、PLL环路引入的噪声、输出IO和走线引入的干扰。参考时钟抖动大最直接的办法是换更低抖动的晶振或者在晶振电源端加LC滤波。环路带宽设置不当会让抖动恶化这个需要用频谱仪实测再调整。FPGA内部PLL输出抖动还和IO bank供电、同时开关噪声有关输出引脚尽量远离高速数据引脚或者用差分时钟输出降低共模干扰。还有一条容易被忽视PLL输出在高频时最好经过专用的时钟buffer再接负载直接走长线带容性负载边沿和抖动都会明显变差。4.3 占空比不对、毛刺多怎么处理计数倍频最容易出现占空比偏差原因是翻转逻辑写得不够严谨。关键在于半周期和全周期分别用两个条件判断不要用同一个变量既做翻转又做清零否则很容易出现差一个时钟周期的情况。输出可以再打一拍寄存减少组合逻辑带来的毛刺。PLL输出一般不会出现这种问题如果出现了多半是输出时钟没有走全局时钟网络或者约束没有写好导致边沿恶化。4.4 问题速查表现象可能原因处理方法PLL锁定失败参考时钟丢失、参数超VCO范围、复位频繁实测参考时钟、查手册参数、检查复位逻辑锁定时间过长环路带宽太窄、VCO启动慢适当加宽环路预留上电时间输出抖动大参考抖动大、电源纹波高、环路带宽不当换低抖动参考、加电源滤波、调环路带宽高频杂散明显环路带宽过宽、接地不佳收窄环路带宽、优化PCB接地占空比偏差计数翻转点不对称分别判断半周期和全周期计数值毛刺明显组合逻辑竞争、输出未寄存输出打一拍使用同步逻辑最后再分享一个我踩过坑的经验有次PLL输出频率正确但始终有周期性杂散查了一圈最后发现是晶振下方的地平面被一条高频信号线截断导致返回路径不完整。把晶振换了个位置后杂散直接降了10dB。这件事给我留下的感触很深数字倍频电路方案本身重要但布局、电源、地这些“看不见”的东西往往才决定最终效果。建议小项目也先规划好电源和地再布信号线省得后面返工。本文还有配套的精品资源点击获取