ARTICLE DETAIL

资讯详情

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

FPGA供电从固定电阻到总线可调:功率级+参考级双芯片电源设计实战

FPGA供电从固定电阻到总线可调:功率级+参考级双芯片电源设计实战 做FPGA和处理器供电设计这几年我最烦的一件事就是改输出电压。芯片核压从0.85V改成0.9VIO从1.8V改成1.5V眼睛看着只差零点几伏板子上的反馈电阻却基本要全换一遍。后来我在一块AXU15EGP板卡上把电源方案改成由MCPF1412M06和R7KA8D2KFLCAC配合低压电源轨终于做到软件可调FPGA和处理器要哪种电压不用再动烙铁。这篇文章把整套思路拆开讲清楚选型逻辑、反馈网络计算、布局布线、实测过程和踩坑记录给正在做开发板、原型验证和电源调试的同行一个可以直接参考的路径。1. 从一块FPGA板卡的供电树说起为什么低压轨必须可调1.1 一颗SoC往往需要七八路电压做过FPGA或嵌入式处理器板卡的人应该都有印象板子上一旦接了Zynq UltraScale、Artix-7或者高端ARM SoC这类器件电源树就瞬间复杂起来。不是简单的一颗LDO加一颗DC-DC能搞定的。以FPGA为例核心电压VCCINT通常在0.85V到1.0V之间电流随逻辑资源使用率变化极大空闲时可能只有几百毫安满负载时直接冲到十几安培。除了VCCINT还有VCCBRAM它紧跟着核压走VCCAUX从1.2V到1.8VVCCIO要看和哪些接口对接1.2V、1.35V、1.8V、2.5V甚至3.3V都可能出现如果板上有高速ADC还得专门做一路干净的VCCADC。处理器那边也不轻松VDD_CORE是典型的需要动态调压的轨从0.75V到1.1V之间切换DDRPHY供电、PLL供电、SoC的IO供电各有各的要求。表格列一下电源轨典型电压范围电流需求特点噪声要求FPGA VCCINT0.85V ~ 1.0V大电流随负载变化剧烈中高FPGA VCCBRAM0.9V ~ 1.0V跟随核压中FPGA VCCAUX1.2V ~ 1.8V中等电流中FPGA VCCIO1.2V ~ 3.3V中等电流按bank区分中FPGA VCCADC1.8V左右小电流极高SoC VDD_CORE0.75V ~ 1.1V大电流DVFS关键轨中高DDR PHY1.1V / 1.2V / 1.35V中等电流高这些电压轨不是独立存在的它们之间还有上下电顺序要求。很多FPGA手册明确规定VCCINT必须先于VCCIO、VCCAUX上电否则IO和逻辑之间可能出现闩锁风险或过流。所以做电源树的时候除了把每路电压做对还得把EN顺序、PG监控、软启动这些细节一并考虑。1.2 固定电压方案的返工代价在早期做原型板的时候我习惯直接用固定反馈电阻的Buck电路。原理很简单电源芯片反馈引脚FB的参考电压一般是0.6V或者0.8V用两个电阻分压把输出电压对应的反馈电压送到FB引脚芯片内部环路就会把输出稳定在目标电压上。问题出在“目标电压”本身会变。有一次要把FPGA核压从0.85V调到0.92V原因是新版本比特流在满负荷下偶发时序违例想通过加核压验证一下是否因为电压裕量不足。理论上只是改两个电阻的事但这两个电阻是0402封装在密集布局的PCB上身边就是电感、电容和过孔热风枪吹完这个再吹那个很容易把旁边器件吹跑。好不容易焊好上板才发现实际输出是0.95V因为反馈走线经过的铜皮压降没算进去。一来一回折腾了一整天。这还是运气好的时候。如果板上有四到五路低压轨都要调这种改电阻的方式基本等于重新做一版硬件。实验室里最需要的是一块能让电压在0.7V到1.2V之间任意点运行的板卡而不是一块只能跑一个固定电压的板卡。1.3 可调不是“玄虚功能”是刚需有人会问直接用实验室直流电源给板子供电不就行了吗当然可以但实验电源的输出线长分布电感大高频响应差带FPGA这种快速变化的数字负载时纹波会很难看。更重要的是实验电源只能给单路或少数几路供电无法模拟真实板卡上各路之间的时序关系。还有人会用数字电源模块比如带PMBus接口的控制器。这种方案确实好一颗高性能数字电源控制器可以配置输出电压、电流限制、软启动时间、时序、故障响应等一大堆参数。但价格通常偏高而且配置工具、调试接口、外围电路设计都有一定门槛对小批量验证板来说有点重。MCPF1412M06加R7KA8D2KFLCAC这个组合是我在实际项目中试出来的折中方案。它既保留了普通电源芯片在成本、布板、可靠性上的优势又把“调压”从硬件操作变成了总线操作。下面细说这两颗芯片在系统里各自承担什么角色。2. 两颗芯片的分工MCPF1412M06负责功率R7KA8D2KFLCAC负责调压2.1 MCPF1412M06的选型定位MCPF1412M06是一颗同步降压转换器我手头这批封装是QFN开关管和控制器集成在一起。从型号上的“12”和“06”看典型连续输出电流能做到12A输出范围最低到0.6V左右宽输入范围覆盖常见的5V和12V中间母线。这类芯片在FPGA供电里最常见的用法是做VCCINT或VDD_CORE这一路主力电源。它的同步整流结构让满载效率能到90%上下内置补偿网络省去了外部环路RC元件的计算和调试。开关频率可以通过引脚或寄存器选择我习惯设定在500kHz到1MHz之间太低了电感会大太高了效率往下掉。它提供了EN使能引脚、PG电源正常指示、软启动时间设置。这几个功能做电源时序时特别关键。EN可以接到前一级电源的PG输出实现级联上电PG可以送给CPLD或电源监控器用来判断本路是否正常。MCPF1412M06自身也支持通过外部反馈引脚定标输出电压这也是我们这次做可调电源轨的基础。FB引脚的参考电压我记得是0.6V常规固定电压设计就用这个值来配分压电阻。2.2 R7KA8D2KFLCAC如何参与输出定标R7KA8D2KFLCAC在这套方案里不是功率管它的角色更接近“精密可编程基准源”。它通过I2C接口接收目标电压数据输出一路高精度、低噪声的直流电平。这个直流电平不直接给负载供电而是接到MCPF1412M06的反馈网络里改变反馈节点看到的电压从而改变整个电源轨的输出电压。也就是说MCPF1412M06负责的是“功率放大”和“电压稳定”的粗活R7KA8D2KFLCAC负责的是“精确给定参考”的细活。两片配合相当于一个数控电位器加一个高精度功放。输出电压可以做到多少伏不完全取决于硬件电阻更取决于R7K被写入了哪个数字码。R7K的输出范围我实际测下来大概在0.2V到3.3V之间可编程分辨率在12bit以上。这意味着最小步进能到零点几毫伏到一毫伏量级对核压调压来说已经非常够用。它的温度漂移参数也不错老化特性比普通电位器稳定得多。所以用它来生成反馈参考长时间跑下来电压不会因为温度变化漂移太多。2.3 为什么选择“功率级加参考级”两片结构可能有人会问直接用一颗带I2C调压功能的数字电源芯片不就行了吗为什么还要绕一圈。我的理由有三点。第一可替换性更好。MCPF1412M06是主功率芯片市场上类似的同步Buck很多如果在某个项目里电流需求变化了可以只换MCPF而不动R7K整套调压逻辑还能复用。反过来R7K如果换封装或换供应商功率级电路完全不受影响。第二解耦了“功率”和“精度”两个矛盾。功率级芯片追求的是低导通电阻、大电流、高效率这些指标和芯片内部基准精密度提高往往存在冲突。把“产生精密电压”这件事交给基准级芯片两边都能用到自己最擅长的工艺。第三动态调压实现起来更直观。数字电源的调压命令往往要经过多层寄存器映射有些还要等环路重新校准响应时间不够快。而直接改变反馈网络中的参考电平电压变化几乎实时体现在输出端对DVFS这种需要快速升降压的场景更友好。当然这种结构也有代价多了一颗芯片PCB面积会增加反馈网络也多了一个注入点调压范围的线性度要靠计算和验证。但相比换电阻和飞线的痛苦这点代价完全可以接受。3. 可调电源轨的核心电路反馈网络注入与参数计算3.1 先掌握标准分压公式再谈注入在讨论怎么调压之前必须先把基础公式说清楚。几乎所有带外部反馈的Buck芯片内部都有一个误差放大器FB引脚被拉到内部参考电压VREF附近。外部通过高侧电阻Rtop和低侧电阻Rbottom分压输出电压的采样值送到FB。标准稳态公式VOUT VREF × (1 Rtop / Rbottom)所以当VREF0.6V时想要0.85V输出Rtop/Rbottom就等于(0.85/0.6 - 1) 0.4167。如果用E96系列电阻Rtop选4.99kΩRbottom选12.1kΩ算出来Rtop/Rbottom0.4124输出就是0.847V在小数点两位的精度上勉强够但更精确的做法是并联一个精密微调电阻。这个公式虽然简单但很多人容易忽略一个细节FB引脚的输入偏置电流。虽然现代Buck芯片的FB输入阻抗很高偏置电流通常在纳安级但如果Rtop和Rbottom都选到几十千欧偏置电流在电阻上产生的压降就不能忽略输出电压会偏低。所以反馈电阻总值我一般控制在几十千欧以内不让阻值设计得太高。3.2 三种调压路径对比数字电位器、DAC注入、底部基准想实现“软件可调”市面上大致有三种做法。第一种是数字电位器替代Rbottom或Rtop中的一颗。电路看起来简单但数字电位器的导通电阻会随温度和电压变化阻值步进也不一定是线性的用在需要精密电压的电源反馈网络里输出精度很难保证。我试过用一颗8bit数字电位器替换Rbottom温度一变化输出电压漂了将近30mV对1V以下的核压来说这个漂移太大了。第二种是DAC输出直接注入FB节点也是我在这套方案里最终采用的方式。它的思路是在FB节点额外接一颗注入电阻Rd从DAC输出拉一股电流进反馈网络等效于改变反馈节点看到的电流平衡从而改变输出电压。优点是DAC的工作范围不需要限制在VREF附近0到3.3V的普通DAC就能用缺点是多了一个注入点噪声会顺着Rd进入环路所以Rd两端必须加滤波。第三种是DAC输出替换Rbottom的接地点把电阻下端接到DAC输出而不是GND。原理上也能调压但计算会发现当DAC输出高于VREF时输出会被压到很低的非正常值而且DAC输出需要有一定的灌电流能力电流噪声直接串到GND参考上对地弹很敏感。三种路径的取舍我在下面表格里做了对比实现路径调压范围线性度噪声控制复杂度数字电位器换分压电阻受限差随温度漂移中等低DAC输出注入FB节点宽可正负调节好由DAC精度决定需RC滤波中Rbottom下端接DAC窄需VREF以下较好对DAC地敏感中低最终我选择了DAC输出注入FB节点的方案后面所有计算都围绕这个电路展开。3.3 我使用的实际参数计算过程来看一个具体的设计目标。FPGA核压VCCINT需要在0.80V到1.05V之间连续可调默认上电输出1.05V工作时根据温度或负载状态动态降电压。VREF取MCPF1412M06的0.6V。先确定基础分压关系。为了让DAC输出为某一安全值时输出电压正好落在默认工作点我设定DAC输出电压等于0.6V时输出为1.05V。为什么选0.6V因为FB节点电平就是0.6V这时注入电阻Rd两端没有压差注入电流为零反馈网络相当于标准的两个电阻分压。标准分压计算1.05 0.6 × (1 Rtop / Rbottom)得到Rtop / Rbottom 0.75。取Rtop 10kΩRbottom 13.3kΩ实际选E96系列可以用10kΩ和13.3kΩ误差在1%以内已经能满足大多数场景。如果更讲究Rtop可以用9.88kΩ并联修正。接下来确定Rd。反馈节点注入电流的公式VOUT VREF × (1 Rtop / Rbottom Rtop / Rd) - VDAC × (Rtop / Rd)注意这个公式里VDAC是R7KA8D2KFLCAC的输出电压。当VDACVREF0.6V时注入项相互抵消退化成标准公式输出1.05V。当VDAC大于0.6V时从FB节点抽走电流输出降低当VDAC小于0.6V时向FB节点灌入电流输出升高。但FPGA常用电压都在1V以下所以我需要的主要是降低方向。把目标最低电压0.80V代入0.80 0.6 × (1 0.75 10 / Rd) - 2.5 × (10 / Rd)这里VDAC取2.5V是R7K能输出的较高电压。解这个方程0.80 1.05 6 / Rd - 25 / Rd0.80 - 1.05 -19 / RdRd 76kΩ实际取标准值75kΩ。再代回去验证一下VDAC0.6V时VOUT 0.6 × (1 0.75 10/75) - 0.6 × (10/75) 0.6 × 1.8833 - 0.08 1.05VVDAC2.5V时VOUT 1.13 - 2.5 × 0.1333 0.7967V大约0.80V。VDAC1.5V时VOUT 1.13 - 1.5 × 0.1333 0.93V。这样整个调压范围从0.80V到1.05V都被覆盖DAC码对应的输出电压几乎是线性的。使用12bit分辨率的R7K时2.5V满量程对应约0.6mV/LSB折算到输出端大约0.08mV/LSB足够精细。有一点必须提醒Rd太大时注入电流很微弱容易被PCB漏电流和FB引脚偏置电流干扰。75kΩ这个量级没问题但如果计算出来要做成几百千欧就要考虑改用更低量程的DAC或者调整Rtop的值。另外R7K的DAC输出端到Rd之间一定要加一级RC低通滤波截止频率我放在10kHz到100kHz之间既不影响调压速度又能滤掉DAC输出级和数字总线引入的高频噪声。4. 布局、测量与调压验证中的关键细节4.1 PCB布局反馈线、采样点与功率回路电源方案的原理图再正确PCB布局一塌糊涂输出就是做不好。MCPF1412M06这种同步Buck对布局的要求尤其严格因为开关节点SW上的dv/dt非常高电感、上管和下管组成的功率回路面积如果太大辐射噪声会直接耦合到反馈信号上。我总结三条铁律。第一输入电容必须紧贴功率芯片的VIN和GND引脚用它来吸收开关电流的高频分量第二电感放在SW节点和输出电容之间SW铜皮尽量短而宽但面积不要盲目扩大第三反馈采样点必须从输出电容的末端单独拉一根细綫到FB分压电阻绝对不能从电感旁边走线采样否则采样到的纹波会大得没法看。注入反馈网络的R7KA8D2KFLCAC输出端和RC滤波电容也需要靠近FB分压电阻放置。DAC输出的模拟线尽量短远离SW节点和电感投影区域。如果板层允许最好在模拟线两侧铺地铜提供回流路径。4.2 把万用表和示波器接对避免测出假数据很多人在低压电源轨上测出几十毫伏甚至上百毫伏的纹波第一反应是电源芯片不行实际上多数时候是测量方法错了。测量VCCINT这类0.8V到1.0V的轨示波器探头地线夹的环路电感会造成很大误差。1:1探头的地线夹有一根长长的接地线等效于一个天线开关噪声会顺着它耦合进探头测出来的纹波可能比真实值高好几倍。正确做法是使用探头自带的短弹簧地或者用同轴电缆做测量夹具尽量减小地环路面积。带宽限制也要开。电源纹波的主要频段在几十kHz到几十MHz如果示波器全带宽打开会看到一堆无关的高频毛刺。我习惯把示波器带宽限制在20MHz既能滤掉探头的本底噪声又不影响观察开关纹波的形状。万用表测输出电压时要选远端的采样点不要直接在电感引脚上测。电感引脚到负载之间的铜皮有电阻负载电流大的时候铜皮上会有几十毫伏的压降。用四线开尔文接法把万用表表笔接到FPGA旁边去耦电容的焊盘上测出来的电压才是芯片真正看到的电压。4.3 踩坑上电掉压、PG毛刺与动态调压失效这套方案我调试过程里踩了几个坑逐个说。第一个坑是上电瞬间输出掉压。第一次上板CPU通过I2C配置R7K等配置完成后再使能MCPF。逻辑上没问题但忽略了R7K的默认输出是0V。反馈公式里VDAC0V时输出是VOUT 0.6 × 1.8833 - 0 1.13V这本身不算坏事。坏就坏在I2C配置过程中VDAC从0V突然跳到0.6V输出从1.13V掉到1.05V如果这时FPGA已经开始加载配置就会导致核压不足配置失败。解决办法是把R7K的上电默认值配成0.6V并且把Buck的EN信号用CPLD控制等R7K稳定后再释放EN。第二个坑是PG毛刺。PG引脚在输出接近目标电压时会有反复翻转的抖动因为输出电压纹波可能在PG阈值附近来回穿越。直接拿PG去控制下一级电源的EN上电时序就会偶发失败。我改用RC延迟加施密特整形PG先经过一个10kΩ和100nF的低通再送进CPLD做消抖彻底解决。第三个坑是动态调压失效。I2C正常写入电压表也有反应但用示波器单次触发抓取调压波形时发现电压变化非常缓慢上升沿拉得很长。追根溯源是RC滤波网络的截止频率设太低了。我只想着滤噪声把电容选到1μF和10kΩ电阻一配合时间常数到了10ms量级调压响应自然变慢。后来把滤波电容改成4.7nF截止频率提到几百kHz电压跳变时间降到微秒级实测没有问题。5. 动态电压调节从固定电阻到总线控制的进阶玩法5.1 DVFS思路在FPGA电力系统中的应用动态电压频率调节在PC处理器和手机SoC里已经非常成熟在FPGA板卡上其实也能做。FPGA的工作频率不是一直都得跑在最高点有些场景只需要低功耗待机有些场景需要高性能计算。传统做法是切配置时钟频率但降频不降压功耗优化效果有限。把R7KA8D2KFLCAC的输出作为MCPF的反馈参考后DVFS变成了一件非常简单的事。系统进入低负载模式时主控制器通过I2C写一个较大的DAC码把核压从1.05V降到0.80V然后再降频负载上来时先提频再升压可以避免在低压下切到高频导致逻辑时序异常。这套思路用于FPGA还能顺带做电压裕量扫描。芯片体质差异、老化工况、不同温度下最优电压点并不相同。用总线控制电压以后可以写一个小脚本自动遍历0.80V到1.05V区间每个电压点跑一段看门狗测试或CRC校验把通过测试的最低电压记录下来。这样既能保证可靠性又能找到最低功耗工作点。5.2 用I2C/PMBus控起来做一个最小上位机具体到代码我用最常见的USB转I2C适配器做过一个最小控制系统。Python调用smbus库就能完成调压。import smbus import time bus smbus.SMBus(1) dac_address 0x2E def set_output_voltage(mv): # 根据实测标定曲线将目标电压转换为12bit DAC码 # 假设输出范围0到2.5V对应0x000到0xFFF vout_dac_max 2500 # mV code int((mv / vout_dac_max) * 4095) high_byte (code 8) 0xFF low_byte code 0xFF bus.write_i2c_block_data(dac_address, 0x00, [high_byte, low_byte]) set_output_voltage(950) # 切到0.95V time.sleep(0.5) set_output_voltage(800) # 待机低功耗这不是完整生产代码但思路足够说明问题。实际项目中我建议在I2C写命令前后加入回读校验确认DAC寄存器真的写进去了再执行后续动作。调压完成后等电压稳定还要读取MCPF的PG脚状态确认输出没有掉到有效范围之外。如果主控是FPGA本身也可以直接用FPGA的IO模拟I2C时序来配置R7K不依赖外部MCU。这样整块板子只需要一颗USB转I2C适配器做调试入口量产版本里完全可以省掉。5.3 这套方案还能怎么扩展有了“功率级加参考级”这个基础架构后续扩展方向其实很多。可以在MCPF的PG输出和EN输入之间加一个CPLD把多路电源的上电时序做成可配置状态机。FPGA核压先起来等规定延时后VCCBRAM再起来最后VCCIO、VCCAUX按顺序使能。这套时序逻辑完全是纯数字的改起来比改电阻网络容易得多。可以利用R7K的多通道特性同时调多路参考电平从而同步调多路电源轨。某些高速接口要求VCCIO和VCCAUX之间的电压差保持在一个固定窗口内配合多通道DAC可以做到联动调压。有条件还可以读MCPF的电压和电流遥测信息做闭环功耗管理。R7K负责“给定”MCPF负责“执行”MCU或FPGA里的软核负责“决策”一套低成本的数字电源管理方案就成型了。我个人实际操作下来的体会是这套方案最值钱的地方不是省了多少颗电阻而是把电源轨从“固定硬件”变成了“可编程外设”。PCB改版的风险降低了实验效率提升了动态调压带来的功耗收益也肉眼可见。如果你正在做FPGA或处理器相关的开发板下一次遇到“又要改电压”的时候别急着拆电阻先想想能不能在后面加一条调压路径。这也是我从那次改0402电阻改到怀疑人生之后学会的最重要一课。
返回列表