ARTICLE DETAIL

资讯详情

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

国产FPGA易灵思PLL配置实战:从参数计算到锁定调试

国产FPGA易灵思PLL配置实战:从参数计算到锁定调试 1. 为什么国产FPGA的PLL值得单独拿出来聊这两年国产FPGA的讨论热度明显上来了尤其是易灵思Efinix的Trion和Titanium系列在中小规模逻辑、低功耗场景和成本敏感型项目里出现得越来越频繁。T35F324、Ti60F225这些型号做图像处理、接口桥接、电机控制的人应该都不陌生。但很多人从Xilinx或Altera的平台切过来之后第一个卡住的地方往往不是逻辑设计而是PLL配置——时钟树没配对后面全是白搭。PLL锁相环这个东西原理书上讲得都差不多鉴相器、环路滤波器、压控振荡器、分频器。但落到具体芯片上每家IP核的参数命名、约束方式、锁定行为都不一样。易灵思的PLL通过Efinity软件里的Interface Designer或直接例化原语来配置表面上看选项不多实际上有几个坑非常隐蔽输出时钟的相位关系、VCO频率范围、锁定时间与参考时钟的关系、以及多PLL级联时的抖动累积。这篇内容适合谁看如果你正在用T35F324或Ti60F225做项目需要从外部晶振产生多路不同频率的时钟给FPGA内部逻辑、DDR、MIPI或LVDS收发器用那这篇就是写给你的。如果你刚接触FPGA想搞明白PLL到底怎么配、为什么这么配也能从这里拿到一套可复现的流程。我会把Efinity里的配置步骤、参数计算过程、实测锁定波形和踩过的坑都摊开讲。2. 易灵思PLL的整体架构与Efinity配置思路2.1 Trion与Titanium的PLL资源差异易灵思的PLL资源在不同系列里差别不小选型和配置前必须先把手册翻清楚。Trion系列比如T35F324通常每个器件有4个PLL分布在芯片的不同角落每个PLL能驱动特定区域的时钟网络。Titanium系列比如Ti60F225的PLL数量更多支持更宽的VCO频率范围和更灵活的输出分频适合高速接口场景。这里有个容易忽略的点PLL的物理位置决定了它能驱动哪些时钟资源。你在Efinity里例化一个PLL如果输出时钟要送到芯片另一侧的LVDS收发器可能根本走不通或者布线延迟大到时序无法收敛。所以配置之前先打开Efinity的Device View看清楚目标逻辑区域离哪个PLL最近。特性Trion T35F324Titanium Ti60F225PLL数量48VCO频率范围600-1200 MHz800-1600 MHz参考时钟输入专用引脚内部路由专用引脚内部路由级联输出分频1-1281-256相位偏移精度45度步进22.5度步进锁定指示有有可配置滤波这张表里的数据是基于常见配置的典型值具体以你用的Efinity版本和器件手册为准。我实测T35F324的VCO在600MHz以下时抖动明显变大所以一般会把VCO推到800MHz以上再分频下来。2.2 Efinity中PLL的三种配置方式Efinity里配PLL有三条路一是用Interface Designer的图形界面生成二是直接例化PLL原语三是通过时钟向导Clock Wizard自动生成。三种方式各有适用场景。图形界面适合快速原型选好输入频率和输出频率软件自动算参数。但它的缺点是不让你直接改VCO频率有时候算出来的VCO偏低抖动大。直接例化原语最灵活但需要你手动填所有分频系数容易出错。时钟向导介于两者之间能看中间参数但生成的代码可读性一般。我的习惯是先用时钟向导算一版参数记下VCO频率和各分频值然后手动例化原语把参数填进去。这样既保证计算正确又能完全控制配置。2.3 配置前的准备工作动手之前先把这几样东西准备好外部参考时钟的频率和抖动指标。晶振的抖动直接决定PLL输出抖动别用太差的。目标输出时钟的频率、相位关系和数量。画个时钟树草图。确认目标PLL的供电和地是否干净。PLL对电源噪声很敏感模拟电源引脚旁边一定要放去耦电容。Efinity工程里确认器件型号和速度等级选对了。速度等级影响PLL的最大VCO频率。注意易灵思的PLL参考时钟输入有专用引脚也有从内部逻辑路由过来的。专用引脚的抖动性能最好如果参考时钟是从其他逻辑分频出来的抖动会累积锁定时间也可能变长。3. PLL参数计算与Verilog例化实操3.1 从目标频率反推VCO和分频系数PLL的核心公式就一个输出频率 参考频率 × (M / N) / O。其中M是反馈分频N是输入预分频O是输出分频。VCO频率 参考频率 × M / N。举个例子T35F324上外部晶振是50MHz我需要三路时钟100MHz给系统逻辑200MHz给DDR25MHz给低速外设。先定VCO。T35F324的VCO范围是600-1200MHz我选800MHz因为800能被200、100、25整除分频系数都是整数。计算过程参考频率 50MHz设N1则M VCO / 参考频率 800 / 50 16输出100MHzO 800 / 100 8输出200MHzO 800 / 200 4输出25MHzO 800 / 25 32所有分频系数都是整数且O在1-128范围内没问题。如果算出来不是整数就要调整VCO频率或者换一个参考频率。比如参考是24MHz要输出100MHzVCO选1200MHzM50O12也能整除。提示尽量让VCO落在范围的中高段太低抖动大太高功耗和温升上去了。T35F324我一般把VCO设在800-1000MHz之间。3.2 手动例化PLL原语的完整代码Efinity的PLL原语叫ELJ_PLL不同版本名字可能略有差异以你工程里的库为准。下面是我在T35F324上实测通过的一段例化代码module pll_sys ( input wire ref_clk, // 50MHz外部晶振 input wire rst_n, // 低电平复位 output wire clk_100m, output wire clk_200m, output wire clk_25m, output wire pll_locked ); ELJ_PLL #( .REFCLK_FREQ (50.0), .VCO_FREQ (800.0), .M_DIV (16), .N_DIV (1), .O0_DIV (8), .O1_DIV (4), .O2_DIV (32), .O0_PHASE (0), .O1_PHASE (0), .O2_PHASE (0) ) u_pll ( .REFCLK (ref_clk), .RSTN (rst_n), .CLKOUT0 (clk_100m), .CLKOUT1 (clk_200m), .CLKOUT2 (clk_25m), .LOCKED (pll_locked) ); endmodule这段代码里REFCLK_FREQ和VCO_FREQ是给综合工具做检查用的实际分频靠M、N、O三个参数。O0_PHASE到O2_PHASE是相位偏移单位是度T35F324支持45度步进。如果你需要输出时钟之间有固定相位差比如给ADC采样时钟和FPGA内部时钟做对齐就在这里设。3.3 相位偏移与多PLL级联的注意事项相位偏移这个功能用好了能省掉外部延迟线用不好就是时序噩梦。我做过一个项目需要两路100MHz时钟相位差90度用来驱动一个正交解调逻辑。直接在PLL里设O0_PHASE0O1_PHASE90输出确实有90度差但实测发现相位偏移的精度受VCO频率影响。VCO800MHz时一个周期1.25ns45度对应156.25ps这个精度对大多数应用够了。但如果VCO600MHz45度就是208ps误差会大一些。多PLL级联要特别小心。比如你用PLL1产生100MHz再送给PLL2做参考PLL2的抖动就是PLL1的抖动加上自己的抖动。如果PLL1的参考是普通晶振抖动可能还好如果PLL1的参考是从FPGA内部逻辑分频出来的那抖动会很大。我一般只在必须产生非整数倍频率关系时才级联否则尽量用一个PLL多路输出。注意级联时PLL2的锁定时间会变长因为要等PLL1先锁。复位逻辑里要确保PLL1锁定后再释放PLL2的复位否则PLL2可能永远锁不上。4. 锁定行为、抖动实测与性能优化4.1 锁定时间与锁定指示的可靠使用PLL从复位释放到LOCKED拉高这段时间叫锁定时间。T35F324在50MHz参考、800MHz VCO下实测锁定时间大约在100-200微秒。这个时间跟环路滤波器带宽有关带宽越窄锁定越慢但抖动抑制越好。LOCKED信号不能直接当复位用。我见过有人把LOCKED取反后直接接到逻辑复位上结果上电时逻辑在LOCKED抖动期间反复复位状态机跑飞。正确做法是LOCKED拉高后再用一个计数器延时几千个时钟周期等时钟稳定了再释放逻辑复位。reg [15:0] lock_cnt 0; reg sys_rst_n 0; always (posedge clk_100m or negedge pll_locked) begin if (!pll_locked) begin lock_cnt 0; sys_rst_n 0; end else if (lock_cnt 16hFFFF) begin lock_cnt lock_cnt 1; sys_rst_n 0; end else begin sys_rst_n 1; end end这段代码里LOCKED拉高后还要等65535个100MHz时钟周期大约655微秒才释放系统复位。实测下来很稳上电不会出现逻辑跑飞的情况。4.2 抖动来源分析与实测数据PLL输出抖动分两类确定性抖动和随机抖动。确定性抖动主要来自参考时钟的周期性干扰和电源噪声随机抖动来自VCO本身的热噪声。易灵思的PLL在VCO频率较高时随机抖动会好一些因为环路带宽可以设得相对宽。我用示波器测过T35F324在几种配置下的峰峰值抖动VCO频率输出频率峰峰值抖动实测备注600 MHz100 MHz约120 ps抖动偏大800 MHz100 MHz约65 ps推荐工作点1000 MHz100 MHz约50 ps功耗略高1200 MHz100 MHz约45 ps温升明显这个数据是用普通无源探头测的不是专业相位噪声仪绝对值可能有偏差但相对趋势是准的。可以看到VCO从600推到800抖动改善很明显。再往上推改善幅度变小但功耗和发热上去了。所以800-1000MHz是个甜点区间。电源噪声对抖动的影响也很大。我试过在PLL模拟电源引脚旁边只放一个0.1uF电容抖动比放0.1uF10uF组合大了将近30%。所以去耦电容别省0.1uF和10uF并联尽量靠近引脚。4.3 降低抖动的几个实操手段除了选对VCO频率和做好电源去耦还有几个手段能进一步优化参考时钟走差分如果外部晶振支持差分输出尽量用差分输入到PLL的专用参考引脚。单端输入的共模噪声会直接调制到VCO上。避免参考时钟经过内部逻辑参考时钟从专用引脚直接进PLL不要先经过全局时钟缓冲器再进PLL那样会引入额外抖动。环路滤波器参数Efinity里有些PLL原语允许配置环路滤波器的电荷泵电流和滤波电容值。默认值通常够用但如果参考时钟频率很低比如10MHz以下可能需要调大滤波电容来稳定环路。地平面完整PLL下面的地平面不要被其他信号割裂否则回流路径变长噪声耦合增加。提示如果你发现PLL偶尔失锁先查电源纹波再查参考时钟是否有毛刺。我遇到过一次参考时钟引脚旁边走了一根PWM信号耦合过去导致PLL每隔几秒失锁一次。把PWM线挪远就好了。5. 常见问题排查与避坑经验5.1 PLL不锁定或锁定不稳定的排查流程PLL不锁定是最常见的问题排查按这个顺序来查参考时钟用示波器看参考引脚上有没有波形频率对不对幅度够不够。易灵思的PLL参考输入有最小幅度要求太小了锁不上。查复位RSTN是不是一直为低有些开发板的复位按键是常闭的上电就是低电平PLL永远在复位状态。查电源PLL的模拟电源和数字电源都要正常。我见过一次数字电源正常但模拟电源的磁珠虚焊PLL就是不锁。查参数M、N、O算出来的VCO频率是不是在允许范围内超出范围肯定不锁。查约束Efinity的时序约束里参考时钟的频率有没有写对写错了综合工具可能报错或者行为异常。如果以上都正常但LOCKED还是不稳定试试降低VCO频率或者增大环路滤波电容。有时候是环路带宽太宽噪声导致鉴相器误判。5.2 输出时钟频率偏差与相位错误的修正输出频率不对先确认M、N、O三个值有没有填错。Efinity的PLL原语里参数名有时候容易混淆比如M_DIV是反馈分频还是输入分频不同版本可能不一样。查手册确认。相位错误通常是相位偏移值设错了或者输出分频是奇数导致相位步进不是整数。比如O3时相位偏移的精度会下降。如果相位要求严格尽量让输出分频是偶数。还有一种情况输出时钟送到了全局时钟网络但全局时钟缓冲器有固定延迟导致实际相位和PLL输出相位不一致。这种延迟通常在几百皮秒量级如果系统对相位敏感需要在约束里做时钟偏斜调整。5.3 多时钟域下的时序收敛技巧一个PLL出多路时钟就形成了多时钟域。跨时钟域的信号必须做同步处理否则亚稳态跑不掉。我一般用两级触发器同步慢到快和快到慢都要同步。// 慢时钟域到快时钟域的同步 reg [1:0] sync_ff 0; always (posedge clk_fast) begin sync_ff {sync_ff[0], signal_from_slow}; end wire signal_synced sync_ff[1];如果是多比特信号跨时钟域比如一个计数器的值不能简单用两级触发器要用握手或者异步FIFO。Efinity里例化异步FIFO很方便别自己写。时序约束方面Efinity的SDC文件里要把每路时钟都约束上包括PLL输出的时钟和外部输入时钟。跨时钟域的路径要设false path或者max delay不然工具会按同步路径去优化浪费资源还可能过约束。注意PLL输出的时钟在约束里要写成generated clock源是参考时钟。这样工具才知道它们之间的频率关系做时序分析才准。5.4 常见问题速查表现象可能原因排查方法解决措施LOCKED一直为低参考时钟缺失或幅度不足示波器测参考引脚检查晶振和走线LOCKED偶尔跳低电源纹波大或参考有毛刺测电源纹波查参考走线加去耦远离干扰源输出频率偏差大M/N/O参数错误重新计算分频系数修正参数输出抖动大VCO频率偏低提高VCO频率调整M/N相位偏移不准输出分频为奇数检查O值改为偶数分频上电逻辑跑飞LOCKED直接当复位查复位逻辑加延时释放复位多PLL级联不锁前级PLL未锁定查前级LOCKED加锁定顺序控制这张表里的每一条都是我实际踩过的尤其是最后一条级联PLL的锁定顺序控制第一次做的时候没注意调了一下午才发现是前级没锁就释放了后级复位。6. 从PLL到系统时钟树的完整设计思路6.1 时钟树规划与资源分配PLL配置只是时钟树的一部分。一个完整的时钟树要考虑外部参考时钟从哪个引脚进经过哪个PLL输出几路时钟每路时钟驱动哪些逻辑区域全局时钟缓冲器够不够用。T35F324的全局时钟网络数量有限不是所有PLL输出都能上全局网络。如果某路时钟只驱动一个小模块可以用区域时钟或者局部时钟省下全局资源给关键路径。Efinity的布局器会自动分配但你可以通过约束引导它。我一般画一张时钟树图标出每路时钟的频率、驱动范围、是否跨时钟域。这张图在调试时序问题时非常有用能快速定位是哪路时钟出了问题。6.2 动态配置与低功耗场景的取舍有些项目需要在运行时切换时钟频率比如低功耗模式下把系统时钟从100MHz降到25MHz。易灵思的PLL支持动态重配置但操作比较复杂需要先复位PLL改分频参数再等锁定。这个过程会导致时钟中断如果系统里有正在运行的逻辑必须先停掉。如果只是简单的频率切换比如两档频率可以用两个PLL通过时钟选择器切换输出。这样切换时另一个PLL一直锁着切换瞬间的时钟毛刺小。但两个PLL同时运行功耗会高一些看你怎么取舍。低功耗场景下PLL本身也是耗电大户。如果系统大部分时间在休眠可以考虑关掉PLL用内部RC振荡器维持低速时钟需要高速时再启动PLL。但PLL的启动锁定时间要算进唤醒时间里别让系统等太久。6.3 从PLL配置延伸到板级设计的检查清单PLL调通了不代表板级设计没问题。上板之前这几项检查一下参考时钟的走线是否远离高速信号和电源开关节点。PLL电源引脚的去耦电容是否按手册推荐值放了位置是否靠近引脚。如果参考时钟来自外部晶振晶振的负载电容是否匹配起振是否可靠。板上的复位电路是否能让PLL的RSTN在上电时保持足够长的低电平。如果有多块板子级联时钟同步方案是否考虑到了PLL的锁定时间差异。我遇到过一次板子上的晶振负载电容用了22pF但晶振手册要求15pF结果起振频率偏了0.5%PLL虽然锁了但输出频率也跟着偏导致串口通信误码。换了电容就好了。这种问题很隐蔽因为PLL的LOCKED是拉高的看起来一切正常。7. 写在最后的一点个人体会易灵思的PLL用熟了之后其实比想象中稳定。关键是别把它当黑盒参数算清楚电源做干净复位逻辑写对基本不会出大问题。我从Xilinx平台切过来的时候最大的不习惯是Efinity的文档没有Xilinx那么细很多参数要自己试。但试多了就有感觉了比如VCO频率和抖动的关系电源去耦对锁定的影响这些都是手册上不会写太细的。如果你正在调T35F324或Ti60F225的PLL建议先用时钟向导生成一版上板测锁定和抖动然后根据实测结果微调VCO和分频。别一上来就追求最优参数先跑通再优化。另外LOCKED信号一定要做延时处理这个坑我踩过不止一次希望你别再踩了。
返回列表