ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

可编程振荡器在400G网络设备中的选型与调试实战

可编程振荡器在400G网络设备中的选型与调试实战 做网络设备硬件设计这些年我越来越意识到一个事儿板上最不起眼的那颗时钟晶振往往决定了整个系统能不能稳定跑起来。尤其是今年我们团队在推进400G交换机和核心路由器项目时遇到了不少和时钟相关的疑难杂症。频率跑不上去、PTP同步老是漂、眼图闭合、误码率超标排查到最后锅全在参考时钟上。也就是从那时候开始我认真研究了“New Programmable Oscillators”这个方向也就是可编程振荡器在下一代网络系统里的应用。市面上关于可编程振荡器的资料其实不少但多数是厂商数据手册式的干巴巴介绍讲了功能但没讲清楚“为什么需要它”以及“到板上怎么用”。这篇博文我想结合自己最近的选型、调试和测试经历把可编程振荡器这东西从原理到选型再到实战踩坑完整梳理一遍。适合正在做高速网络硬件、数据中心交换机、路由器、5G承载设备或者工业TSN设备的硬件工程师、系统架构师以及刚入行想搞懂时钟设计的同学。1. 为什么下一代网络系统开始“卷”时钟源1.1 从普通晶振到可编程振荡器到底变了什么先说一个最直观的变化。以前我们做百兆、千兆交换机的时候板卡上放一颗25MHz无源晶振旁边接两个负载电容设计就结束了。因为SerDes速率不高对参考时钟的抖动要求很宽松几百飞秒甚至几皮秒的抖动都能接受系统跑起来没啥毛病。但是到了25GE、100GE、400GE这个级别情况完全不一样了。高带宽的SerDes通常需要极低抖动的参考时钟抖动稍微超标一点误码率就会明显上升。而且现代网络设备往往要支持多种速率模式比如一个端口既能跑10GE也能跑25GE还能协商到50GE。这种情况下如果每个速率都用一颗固定频率晶振那板上得摆一排晶振layout非常痛苦而且成本也高。可编程振荡器解决的就是这个痛点。它本质上是一个“时钟合成器振荡器”的融合体内部通过PLL或者分数分频结构可以根据配置输出一个很宽范围内的任意频率。你可以通过I2C、SPI接口动态改频率也可以出厂前用OTP一次性烧录成固定频率。这样就实现了“一颗芯片代替多种晶振”的效果BOM简化了备货压力也小了甚至还可以在软件层面动态切换频率去适配不同的系统模式。1.2 下一代网络到底“新”在哪里速率、同步与灵活性从我最近接触的项目来看下一代网络系统对时钟的要求跟传统交换机相比有三个突出的变化。第一是速率更高了。400GE端口在物理层用的是56Gbaud甚至112Gbaud的PAM4信号对应的SerDes参考时钟通常要求抖动在几百飞秒以内最好是能低于300fs。传统晶振的抖动指标很难稳定达到这个水平必须依赖内部PLL结构来“洗”时钟的可编程振荡器。第二是同步要求更严格了。现在运营商网络大规模部署IEEE 1588 PTP和SyncE要求全网设备的时间偏差控制在纳秒甚至亚纳秒级别频率同步精度要达到ppb级别。PTP和SyncE对时钟源的长期稳定度和短期稳定度都有苛刻要求普通晶振的频率温度漂移和老化特性很容易让系统同步失锁。第三是模式变化更频繁了。软件定义网络、动态速率协商、灵活以太网FlexE这类技术要求硬件在运行过程中具备重新配置的能力。如果时钟是“焊死”的固定频率那系统要切换到另一个速率模式就得重新设计硬件这显然不符合下一代网络的灵活性诉求。1.3 一颗可编程振荡器替代整棵时钟树别高兴太早不过话说回来市面上有些宣传说“一颗可编程振荡器解决所有时钟问题”这话真不能全信。一颗器件能覆盖的频率范围确实很宽但它通常只有一到两路输出而我们的交换机板上往往需要多个频率的参考时钟CPU需要的25MHz、SerDes需要的156.25MHz、PHY芯片需要的125MHz、还有系统用于同步的10MHz甚至1PPS。一颗器件替代不了整棵时钟树的全部功能。所以更务实的做法是把可编程振荡器用在最核心、最需要灵活性、抖动要求最高的那一路或两路上比如SerDes参考时钟和PTP系统时钟。其他辅助时钟依然可以用固定晶振或者时钟buffer来搞定。这个思路在我后面会展开细讲。2. 可编程振荡器的工作原理与关键技术指标2.1 内部结构拆解不是简单换了个可调晶振很多人第一次接触可编程振荡器会以为它就是“把晶振里的电容换成了可变电容然后通过电压来改变频率”。这个理解说实话有点过时了。现在的可编程振荡器已经进化成高度集成化的混合信号芯片内部结构远比一个可调晶振复杂。典型的结构是一颗高Q值的参考晶体或者MEMS谐振器作为频率基准后面接一个低噪声PLL或者分数N分频器加上输出驱动电路和控制接口。参考源负责提供稳定可靠的“种子频率”PLL通过配置分频比把种子频率合成到目标频率输出驱动再根据配置输出不同电平标准比如LVPECL、LVDS、HCSL或者CMOS。PLL的环路带宽和噪声整形能力直接决定了输出时钟的抖动性能。这也是为什么可编程振荡器输出频率虽然千变万化但抖动能做到比普通晶振还低——因为低噪声PLL可以滤掉一部分参考源的带外噪声同时通过合理的环路设计压低带内噪声。实际选型的时候要特别注意PLL是整数分频还是分数分频。整数分频结构简单、确定性好但只能输出跟参考频率成整数倍关系的频率分数分频虽然能输出任意频率但分数杂散是个隐患需要看器件有没有做杂散抑制处理。2.2 选型必看的关键参数从频率范围到输出格式做硬件选型数据手册里参数一大堆但真正决定这颗可编程振荡器适不适合你的网络系统主要看这么几项。先说频率范围和步进。不同的网络协议对应的参考频率差异很大10GE通常用156.25MHz25GE可能用161.1328125MHz100GE跑PAM4的时候又有另外的频率。所以可编程振荡器能不能精确调到这些带小数点的频率很关键。有的器件频率步进能做到小数点后几位有的只能整数步进这就要擦亮眼睛看清楚了。然后是抖动。这里要区分两个指标一个是随机抖动通常用相位抖动RMS来表示积分带宽常见是12kHz到20MHz另一个是确定性抖动比如由电源噪声或者串扰引入的。对于SerDes参考时钟我一般要求相位抖动RMS在300fs以下保守一点的还会要求低于200fs。这个指标直接关系到高速链路的误码率表现。还有牵引范围就是PLL能够锁定输入的频率范围。如果你后面要做时钟同步比如给SyncE用那输入参考源偏移了振荡器能不能跟着锁住就看这个参数。一般来说牵引范围至少要覆盖参考源最大频偏的几倍不然锁相环很容易失锁。输出格式和电平标准也不能忽略。同样的频率用LVPECL输出和用HCSL输出在PCB布线要求、端接方式上差别很大。比如HCSL需要源端串阻和终端电阻配合而LVPECL通常需要直流偏置。选择的时候要跟后端芯片的时钟输入需求匹配避免电平不匹配把信号搞坏。2.3 为什么抖动和相位噪声是高速网络的生命线我想单独拿出抖动和相位噪声来说因为这两个指标在高速网络系统里实在太重要了也是很多人选型时最容易糊弄过去的地方。大家可以把SerDes链路想象成一段需要精确“踩点”的舞蹈。发送端的时钟决定了信号什么时候跳变接收端的时钟决定了什么时候采样。如果参考时钟的相位有抖动就像舞蹈节拍忽快忽慢接收端的采样点就会偏离数据眼的中心当偏离超过了系统的定时余量误码就出现了。在400GE这种极高符号速率的场景下一个UI的单位间隔只有大约18ps而系统分配给时钟抖动的预算往往只有几百飞秒。这意味着任何一丁点来自参考时钟的噪声都可能把链路吃掉。我实际测过一款宣称抖动800fs的普通晶振和一款抖动200fs的可编程振荡器放到同一个400G端口上做误码测试前者的误码率明显会高出好几个数量级。所以如果项目里有高密度、高速率的SerDes我的经验是时钟源宁可多花一点成本也要选抖动数据好看的。这个钱省不得。3. 选型与系统设计实操指南3.1 一个400G交换机的时钟树设计实例前段时间我们做了一款面向数据中心的400G交换机时钟树设计很有代表性我就拿它来举例。这颗板卡上有一块交换芯片支持32个400G端口还有一块CPU负责控制面一颗PHY芯片用于管理口。最开始我们用传统的固定晶振方案一共摆了四颗不同频率的晶体分别是交换芯片SerDes的156.25MHz、CPU的25MHz、管理PHY的25MHz和系统同步口的10MHz。四颗晶振挤在板子上layout布线绕来绕去而且频率固定后面客户提了一个要求希望端口能通过软件在100GE和400GE之间动态切换速率。这就麻烦了因为100GE和400GE的SerDes参考频率不一样固定晶振根本做不到。后来我们把交换芯片的SerDes参考时钟换成了一颗I2C可配置的可编程振荡器。上电后先按默认的156.25MHz启动系统起来后软件根据工作模式写寄存器需要切到100GE的时候动态改成另一个频率。整个过程不需要改硬件非常方便。而且这颗器件的抖动指标是160fs比原来的晶振好了不少实测400G链路的眼图余量也提升了。3.2 可编程振荡器选型对比我筛选时关注什么做选型对比的时候我列了一个表格把几款主流的可编程振荡器放到一起比重点就比三个维度抖动性能、编程方式和频率精度。项目方案A方案B方案C相位抖动12kHz~20MHz150fs220fs350fs输出频率范围1MHz~2200MHz1MHz~1500MHz1MHz~725MHz编程方式I2C动态配置I2COTPOTP出厂烧录输出格式LVDS/HCSL/LVPECL/CMOSLVDS/LVPECL/CMOSCMOS频率切换时间10ms级100ms级不适用温度稳定度±0.1ppm±0.5ppm±1ppm方案A价格最贵但抖动和温度稳定度最好而且支持动态切换。方案C是纯OTP的便宜是便宜但出厂后频率就锁死了完全不适合需要灵活配置的场景。我这里提醒一句如果项目中期或者后期有改频率的潜在需求千万别选纯OTP方案哪怕省那几块钱成本后续改版花的钱远远不止这些。对于网络系统我比较推荐具备I2C或者SPI动态配置能力的方案。因为除了频率切换你还可以在调试阶段通过寄存器读回芯片状态、调整输出驱动强度、甚至开启扩频来应对EMI问题这些都是OTP方案给不了的能力。3.3 从原理图到PCB可编程振荡器设计避坑清单原理图和PCB设计阶段有几个细节我觉得值得单独拿出来说都是我们实际踩过坑的地方。第一是去耦电容。可编程振荡器内部有PLL和电荷泵对电源噪声很敏感。电源引脚旁边至少放一颗100nF的高频去耦电容最好再并一颗1uF或者10uF的体电容。电容要尽量靠近电源引脚放置过孔到引脚的路径越短越好否则去耦效果大打折扣。第二是输出信号的端接。不同电平标准的端接要求不一样比如LVDS要在接收端跨接100欧姆终端电阻LVPECL通常需要戴维南等效电路提供直流偏置HCSL则需要在发送端加源端串阻。如果端接没做好信号反射会导致边沿劣化眼图就难看甚至会让后面的SerDes芯片锁定失败。第三是要留意中断引脚和状态引脚的处理。很多可编程振荡器有锁相失锁报警引脚或者时钟输出有效指示引脚。我建议不要把这些引脚空着而是接到CPLD或者CPU的GPIO上上电时做个状态查询如果时钟没起来或者失锁了系统可以及时报错不至于等链路完全起不来才去抓瞎排查。4. 实际调试中的常见问题与排查技巧4.1 动态切换频率时出现的毛刺和失锁问题我们在调试动态频率切换的时候遇到了一个比较棘手的问题软件通过I2C改写寄存器切换频率后某些时候系统会对端口的SerDes报信号丢失但概率不是很大大概十分之一的样子。排查下来发现问题出在切换频率的时序上。可编程振荡器在改变分频比的时候输出时钟会经历一个短暂的“再锁定”过程在这个过程里输出可能是不稳定的甚至会有毛刺。如果后面那颗SerDes在这段时间内还在工作就可能被毛刺干扰。解决办法是在切换频率前先把可编程振荡器的输出使能位关掉或者通知后端SerDes进入复位状态等振荡器重新锁定了再重新打开输出。软件流程上一定要有“先停、再切、后启”的顺序不能粗暴地直接改写频率寄存器就撒手不管。4.2 PTP同步不稳别急着找软件工程师的茬有一次客户反馈他们的PTP设备进行了长时间的老化测试发现时间偏差会周期性地跳变隔一段时间就跳那么一次时好时坏。软件团队检查了PTP协议栈没发现问题闭环调了好几天都没解决。我后来介入排查抓了系统时钟的相位噪声频谱发现在特定频偏处有比较明显的杂散信号。继续顺着查下去发现这颗可编程振荡器用的是分数分频模式而分数分频在特定频点会产生分数杂散。如果这个杂散正好落在PTP环路带宽附近就会干扰时间同步算法导致时间偏差周期性跳变。解决方案有两个方向一个是调整可编程振荡器的内部配置让输出频率通过整数分频路径来实现从根源上避开分数杂散另一个是在PCB设计上加强屏蔽减少杂散信号耦合到敏感路径。具体选哪个要看器件支持不支持整数分频模式。所以选型时如果这个时钟要用于PTP时间同步我强烈建议选那些分数杂散抑制做得比较好的高端器件或者干脆要求产物支持整数分频模式。4.3 抖动测试超标排查思路全记录实验室做高速链路信号完整性测试时发现有一块板子的参考时钟相位抖动明显超标。我们先用频谱仪看了时钟信号的相位噪声曲线发现低频部分的噪声平台起来了不太正常。我第一步是怀疑电源问题于是把可编程振荡器的电源端单独接到一个干净的线性电源上抖动指标立刻改善了很多。这就说明板上的开关电源纹波和噪声耦合到了时钟芯片的电源端。后来我们在时钟芯片电源处做了一级LC滤波把10uH电感和10uF电容组合用上抖动指标就恢复正常了。这个案例提醒我们可编程振荡器即使本身抖动指标再优秀如果供电不干净板上实测依然会超标。时钟设计不能只看芯片数据手册的参数得从系统电源、PCB布局、去耦设计整体考虑。4.4 一个实用的故障排查速查表结合我们几个项目积累的经验我整理了一个针对可编程振荡器在系统里出问题的快速排查表放出来给大家参考现象优先排查方向常见根因上电后无时钟输出电源、使能引脚、配置寄存器芯片未使能、I2C配置未正确写入、电源电压不在工作范围时钟频率不准配置寄存器、OTP固件分频比设置错误、PLL未锁定就读取了频率输出时钟有毛刺切换流程、端接频率切换时未关闭输出、传输线端接不完整导致反射SerDes误码率高时钟相位抖动、电源噪声参考时钟抖动超标、板上开关电源噪声耦合PTP时间同步漂移相位噪声、杂散分数杂散干扰、环路带宽设置不当高温环境下失锁温度范围、老化器件温度稳定度不够、PCB热设计不均匀这个表格不能覆盖所有情况但可以作为排查问题的起点。时钟问题往往不是孤立存在的很多时候是多个因素叠加导致的所以排查的时候不要只盯着一颗芯片看要把电源、layout、软件配置、环境温度综合起来考虑。5. 一点个人总结与后续扩展思路做可编程振荡器的选型和调试这段时间我自己最大的体会是技术方案没有放之四海而皆准的答案关键在于理解系统到底要什么。如果做的是一款量产百万台的低端路由器那肯定用固定晶振更划算但如果是面向未来几年的灵活组网设备那在核心时钟路径上多花几块钱成本换来的灵活性和性能储备是完全值得的。另外在设计初期就引入可编程振荡器还有一个隐性好处硬件版本在研发阶段可以随时通过软件修改频率不用重新打板验证。这意味着硬件工程师可以更从容地迁就软件构建的模式切换需求而不是每次都靠改版去适配新协议。这一点在项目进度紧张的时候尤其能感觉到它的价值。最后如果想继续往深了挖可编程振荡器的配置其实还可以跟系统的温度补偿算法联动——通过读取板级温度传感器实时调整振荡器参数来补偿温漂这对实现高精度时间同步会很有帮助。这个方向我们还在验证阶段等有实测数据了再回来分享。
返回列表