ARTICLE DETAIL

资讯详情

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

国产FPGA易灵思PLL配置实战:从参数计算到性能优化

国产FPGA易灵思PLL配置实战:从参数计算到性能优化 1. 为什么国产FPGA的PLL值得单独拿出来聊这两年国产FPGA的讨论热度肉眼可见地涨起来了尤其是易灵思Efinix这条线Trion和Titanium两个系列在中小规模逻辑、低功耗场景、MIPI和LVDS接口应用里被越来越多的项目选中。我自己从T8、T20一路用到T35F324再到后来接触Ti60F225踩过的坑不算少其中PLL配置这一块是最容易让新手翻车、也最容易被老手忽视的地方。PLL锁相环在FPGA里承担的角色说白了就是整个系统的“节拍器”。外部晶振给一个参考时钟PLL把它倍频、分频、移相生成内部各个模块需要的时钟域。你后面跑的SPI、I2C、MIPI、LVDS、图像处理流水线、定点数运算全都建立在这个时钟质量之上。PLL没配好后面全是白搭——时序收敛不了、接口误码率高、图像出马赛克、系统跑一会儿就死机这些现象追到根上十有八九是时钟的问题。易灵思的PLL和Xilinx、Intel那套东西在思路上有相通的地方但工具链Efinity的配置界面、参数命名、约束写法都有自己的脾气。很多从Xilinx转过来的朋友习惯性地套用Vivado那套MMCM/PLL的经验结果在Efinity里怎么调都不对。这篇内容就是把我自己在T35F324和Ti60F225上配置PLL的实战过程、参数计算、性能优化和排查经验完整梳理一遍适合刚上手易灵思的工程师也适合已经在用但PLL性能没调到位的朋友参考。2. 易灵思PLL的架构与核心参数拆解2.1 PLL在Trion/Titanium里的基本结构易灵思的PLL模块在Trion系列里通常每个器件有4个PLLTitanium系列根据型号不同数量有差异。每个PLL的核心结构包括参考时钟输入、预分频器Pre-divider、鉴相器PFD、电荷泵、环路滤波器、压控振荡器VCO、以及多路输出分频器。这个结构和大多数FPGA的PLL是一致的但易灵思在参数范围和约束方式上有自己的特点。参考时钟进来之后先经过一个预分频器把外部时钟降到PFD能接受的频率范围。PFD把参考时钟和反馈时钟做相位比较输出误差信号给电荷泵电荷泵驱动环路滤波器产生控制电压控制VCO的频率。VCO的输出经过反馈分频器回到PFD形成闭环同时经过各个输出分频器送到不同的时钟网络。这里有个关键点VCO的频率范围是有限制的。易灵思Trion系列的VCO典型工作范围在600MHz到1200MHz之间Titanium系列会更高一些。你所有的倍频分频计算最终都要保证VCO落在这个范围内否则PLL要么锁不住要么输出抖动大得没法用。2.2 核心参数的计算逻辑配置PLL本质上就是解一个方程。假设外部参考时钟频率为Fref预分频系数为M反馈分频系数为N输出分频系数为O那么PFD频率Fpfd Fref / MVCO频率Fvco Fpfd × N Fref × N / M输出频率Fout Fvco / O Fref × N / (M × O)举个例子T35F324上外部晶振是50MHz我要生成一个100MHz的时钟给图像处理流水线用。那么我可以选M1N20O10这样Fvco 50 × 20 / 1 1000MHz落在VCO范围内Fout 1000 / 10 100MHz。也可以选M2N40O10Fvco还是1000MHz效果一样。但不同的M/N组合PFD频率不同环路带宽和抖动特性会有差异。提示PFD频率不宜过低一般建议在10MHz以上否则锁定时间会变长抖动也会变差。但也不能太高超过PFD的最大工作频率就直接不工作了。2.3 Efinity里PLL IP的配置界面在Efinity里添加PLL是通过Interface Designer或者直接例化PLL原语来完成的。Interface Designer里有一个Clock PLL的配置向导你输入参考时钟频率和期望的输出频率工具会自动帮你算一组M/N/O参数。但自动算出来的不一定是最优的有时候工具为了凑频率会选一个PFD频率很低的组合导致抖动偏大。我一般习惯手动指定参数先把VCO频率定在一个比较高的值比如1000MHz到1100MHz然后反推M和N。VCO频率高一点输出分频的选择余地大抖动也相对好控制。Efinity的PLL配置界面里可以设置输出时钟的相位偏移单位是皮秒或者度数这个在做源同步接口的时候特别有用。3. 从零开始配置一个可用的PLL3.1 工程准备与时钟输入约束假设你手上是一块T35F324的开发板外部有一颗50MHz的有源晶振接在专用时钟输入引脚上。第一步是在Efinity里创建工程选好器件型号T35F324然后在Interface Designer里添加一个Clock PLL。时钟输入引脚需要做位置约束和IO标准约束。易灵思的专用时钟输入引脚通常在Bank的特定位置上具体要看器件的Pinout文档。在Efinity的约束文件.xml格式里你需要指定这个引脚的位置和IO标准比如pin nameclk_in locationA12 iostdLVCMOS33/IO标准要根据你板子上的实际电平来选3.3V的晶振就选LVCMOS332.5V就选LVCMOS25。选错了要么不工作要么长期可靠性有问题。3.2 PLL参数配置实操在Interface Designer的PLL配置页面里依次填入参考时钟频率50 MHz参考时钟容差根据晶振规格填一般填100 ppm或者50 ppm期望输出频率比如100 MHz输出数量根据你的设计需要T35F324的PLL一般有4路输出工具会自动算出一组参数。我实测下来对于50MHz到100MHz这个需求工具通常会给M1N20O10VCO1000MHz。这个组合是合理的PFD频率50MHz在推荐范围内。如果你需要多个不同频率的输出比如同时要100MHz、50MHz、25MHz那就在输出分频器那里分别设置O10、O20、O40。注意所有输出都来自同一个VCO所以VCO频率必须是所有输出频率的公倍数。1000MHz可以同时分频出100、50、25、200、125等频率但分不出33MHz这种非整数分频的频率。注意易灵思PLL的输出分频器一般是整数分频不支持小数分频。如果你需要33.33MHz这种频率要么换一个VCO频率要么用多个PLL。3.3 锁定时间与复位逻辑PLL配置好之后上电需要一个锁定过程。Efinity的PLL IP会输出一个locked信号这个信号在PLL锁定之前是低电平锁定之后拉高。你的设计里必须用这个locked信号来复位后续的逻辑否则PLL还没稳定后面的电路就开始跑行为不可预测。我一般的做法是把locked信号打两拍同步到PLL输出时钟域然后用这个同步后的信号作为后续逻辑的复位释放条件。这样做的原因是locked信号是异步的直接拿来用会有亚稳态风险。reg [1:0] locked_sync; always (posedge clk_out or negedge locked) begin if (!locked) locked_sync 2b00; else locked_sync {locked_sync[0], 1b1}; end wire rst_n locked_sync[1];这段代码的意思是locked拉低时同步寄存器清零locked拉高后经过两个时钟周期rst_n才释放。这样后续逻辑的复位释放是同步的避免了亚稳态传播。4. 性能优化抖动、相位与功耗的平衡4.1 抖动来源分析与抑制PLL的输出抖动主要来自几个方面参考时钟本身的抖动、PFD和电荷泵的噪声、VCO的相位噪声、电源噪声。参考时钟的抖动你控制不了只能选一个好晶振。VCO的相位噪声和VCO频率有关一般来说VCO频率越高相位噪声越差但分频到目标频率后抖动会被分频比改善。这里有个反直觉的地方VCO频率高绝对抖动可能变大但经过大分频比之后输出频率低相对抖动周期抖动的百分比反而可能更好。所以选VCO频率的时候要综合考虑。电源噪声对PLL的影响特别大。易灵思的PLL电源引脚通常有专门的VCCAUX和VCCPLL这些引脚上的去耦电容一定要按推荐值放一般是一个0.1uF加一个10uF尽量靠近引脚。我遇到过因为PLL电源去耦没做好导致输出时钟抖动大下游LVDS接收误码率居高不下的情况。后来在PLL电源引脚旁边补了一个1uF的电容误码率直接降了一个数量级。4.2 相位偏移的精确控制易灵思PLL支持输出时钟的相位偏移这个功能在源同步接口里非常关键。比如你用FPGA输出一个时钟给外部ADC同时输出数据外部ADC用这个时钟来采样数据。如果时钟和数据之间的相位关系不对采样窗口就可能落在数据跳变沿上导致采样错误。Efinity的PLL配置里可以设置每个输出的相位偏移单位可以是皮秒或者度数。我一般先用0度相位跑一遍用示波器或者逻辑分析仪看数据和时钟的实际相位关系然后根据建立保持时间的要求来调整。比如数据在时钟上升沿之后2ns稳定那我把时钟相位往后调2ns左右让采样点落在数据稳定区的中间。提示相位偏移的精度受限于PLL的VCO周期。VCO频率1000MHz时一个VCO周期是1ns相位偏移的步进大概是1ns/8或者更细具体看器件的相位偏移分辨率。4.3 动态重配置与低功耗场景有些应用场景需要在运行过程中切换时钟频率比如低功耗模式下降频高性能模式下升频。易灵思的部分PLL支持动态重配置可以通过APB接口或者专用配置端口在运行时修改M/N/O参数。动态重配置的流程一般是先让PLL进入旁路或者停止输出修改分频参数等待PLL重新锁定然后恢复输出。这个过程需要小心处理因为重配置期间输出时钟是不稳定的下游逻辑必须处于复位状态。在低功耗场景下如果某个时钟域暂时不用可以把对应的PLL输出关掉而不是让PLL一直跑着。易灵思的PLL支持输出使能控制关掉不用的输出可以省一些功耗。但要注意关掉输出再打开需要等PLL重新锁定不是瞬间就能用的。5. 常见问题排查与实战避坑记录5.1 PLL不锁定或锁定不稳定这是最常见的问题。现象是locked信号一直不拉高或者拉高之后又掉下去。排查思路按优先级来排查项可能原因解决方法参考时钟晶振没起振、频率不对、电平不匹配用示波器测晶振输出确认频率和幅度电源PLL电源引脚电压不对、去耦不足测VCCPLL电压补去耦电容参数VCO频率超出范围、PFD频率过低重新计算M/N/O确保VCO在范围内约束时钟输入引脚约束错误检查.xml约束文件里的引脚位置和IO标准复位PLL复位信号一直有效检查复位逻辑确保复位释放我遇到过一次PLL不锁定查了半天发现是晶振的负载电容焊错了导致晶振频率偏了差不多1%PLL的参考时钟容差设的是100ppm直接超出范围锁不住。换了对的电容就好了。所以晶振这一块千万别想当然该测就测。5.2 输出时钟抖动大导致下游误码这个问题的表现是接口能工作但误码率高或者图像处理出现随机噪点。用示波器看时钟波形会发现抖动明显偏大。原因通常是VCO频率选得太低或者PFD频率太低或者电源噪声大。我的经验是VCO频率尽量选在范围的中高段比如Trion系列选1000MHz到1100MHz。PFD频率尽量在25MHz到50MHz之间。电源去耦一定要做好PLL电源引脚旁边至少放一个0.1uF和一个1uF的电容地平面要完整。5.3 多时钟域之间的相位关系不对当你的设计里有多个时钟域而且它们之间有数据交互时时钟之间的相位关系就很重要。比如一个时钟域写FIFO另一个时钟域读FIFO如果两个时钟同源但相位不对FIFO的读写指针可能同时变化导致亚稳态。解决办法是让所有相关时钟都来自同一个PLL这样它们之间的相位关系是确定的。然后在跨时钟域的地方用同步器或者异步FIFO。易灵思的Efinity里有时钟域交叉的检查工具可以帮你找出潜在的亚稳态风险点。5.4 动态重配置后PLL失锁动态重配置的时候如果参数改得太猛比如VCO频率一下子从1000MHz跳到600MHzPLL可能失锁。我的做法是分步改先改输出分频再改反馈分频每次改完等锁定再改下一步。另外重配置期间一定要把下游逻辑复位不然会出现不可预测的行为。6. 从PLL延伸到系统级时钟规划6.1 时钟树与全局时钟资源易灵思FPGA的全局时钟资源是有限的T35F324大概有十几个全局时钟网络。PLL的输出要接到全局时钟缓冲器上才能低偏斜地分布到整个芯片。如果你把PLL输出直接接到普通IO或者局部时钟网络上偏斜会很大时序很难收敛。在Efinity里PLL输出到全局时钟的连接一般是自动的但你要注意不要超过全局时钟资源的数量。如果设计里时钟太多可以考虑用时钟使能或者门控时钟来减少同时活跃的时钟数量。6.2 时钟域交叉与复位同步多时钟域设计里复位同步是个容易被忽视的问题。异步复位信号如果直接接到多个时钟域的触发器上复位释放的时候可能在不同时钟域里发生在不同的时刻导致状态机跑飞。正确的做法是每个时钟域都有自己的复位同步器把异步复位同步到各自的时钟域。易灵思的Efinity里有一些复位同步的参考设计可以直接拿来用。6.3 与其他国产FPGA的对比思考我用过高云和安路的FPGAPLL的配置思路大同小异但工具链的成熟度和参数范围有差异。易灵思的Efinity在PLL配置的自动化程度上做得不错但手动调参的灵活性也很高。高云的PLL配置更接近Xilinx的风格安路的则有自己的特色。选哪个平台除了PLL本身还要看整体工具链、IP生态和技术支持。易灵思在MIPI和LVDS这些高速接口上的IP比较成熟如果你做图像处理或者视频接口易灵思是个不错的选择。7. 几个我踩过的坑和实测有效的技巧第一个坑是PLL的参考时钟引脚选错了。易灵思的专用时钟输入引脚和普通IO引脚在电气特性上有区别专用时钟引脚到PLL的路径更短抖动更小。我一开始把晶振接到普通IO上PLL也能锁但抖动明显比接到专用时钟引脚上大。后来看文档才发现这个问题换到专用引脚后抖动改善了差不多30%。第二个坑是PLL输出分频器的顺序。易灵思的PLL输出分频器有的是级联的有的是独立的。如果你需要两个频率成整数倍关系的输出比如100MHz和50MHz最好用同一个VCO的不同输出分频器而不是用100MHz再分频得到50MHz。前者两个时钟的相位关系是确定的后者会引入额外的分频器延迟。第三个技巧是关于PLL的锁定时间。易灵思的PLL锁定时间一般在几十微秒到几百微秒之间具体取决于环路带宽和参考时钟频率。如果你的系统对启动时间有要求可以适当增大环路带宽来加快锁定但代价是抖动会变大。这是一个权衡没有免费午餐。第四个技巧是仿真。Efinity支持PLL的行为仿真你可以在仿真里看到锁定过程、输出时钟的相位关系。虽然仿真不能完全反映实际抖动但至少能验证参数配置对不对、锁定逻辑有没有问题。我一般在板子回来之前都会跑一遍PLL仿真省得板子回来发现配置错了还要改。最后一个经验是关于PLL的电源。易灵思的PLL对电源噪声比较敏感如果板子上有DC-DC开关电源尽量让PLL的电源来自LDO或者在DC-DC输出后面加一级LC滤波。我在一个项目里因为PLL电源和数字电源共用了一个DC-DC结果PLL输出抖动一直下不来后来单独给PLL加了一个LDO问题就解决了。这个改动在PCB设计阶段就要考虑板子做回来再改就麻烦了。
返回列表