简介:面向下一代Intel与AMD CPU核电源设计的供电方案技术文档,聚焦处理器内核供电在功率、精度与效率上的难题,适合电源管理、硬件设计与嵌入式工程师作为参考文献与专业指导查阅。内容汇集德州仪器、美信、美国国家半导体、达拉斯半导体等厂商的多款电源管理芯片方案:TPS65800电源管理单元集成降压与升压转换器、线性稳压器、LED驱动器及模数转换算法;DS2781单芯片电量计提供16位电流、11位电压与温度测量;LP5550支持PowerWise高速串行接口;MAX8809A/MAX8810A单芯片2/3/4相控制器专为下一代CPU核电源设计,配合MAX8523可提升瞬态响应;T2系列模块以4.5V~14V宽输入、最高150A的四相设计满足紧凑布局。压缩包仅含1个PDF文档,约111KB,便于检索。已有111人学习下载,可帮助读者建立多相供电、瞬态响应与电量计量等关键环节的选型思路。
1. 从一颗400W CPU的瞬态说起:核电源到底在解决什么问题
一颗当代服务器CPU的核电压已经压到0.7V上下,满载电流却往1000A走,而一次核心唤醒带来的电流阶跃只有几百纳秒。12V母线、铜箔、插座针脚、封装基板这些环节全都带寄生电感,它们来不及把电流送上去,只能靠CPU旁边的电容先顶住——这就是核电源(Vcore)方案的全部战场。标题里的“下一代Intel和AMD CPU”,落到工程上就是IMVP VR13/VR14与SVI2/SVI3这两套电压调节协议下的多相供电设计,涉及数字控制器、智能功率级、耦合电感、垂直供电和PMBus遥测。这篇写给做主板、服务器、AI加速卡和电源模块的硬件与固件工程师,也写给需要看懂VRM行为、会读遥测数据做性能与功耗调优的系统工程师。
2. 多相Buck与数字控制器:下一代CPU核电源的拓扑与选型
核电源的骨架仍然是同步Buck:上下两个MOSFET、一个输出电感、一堆输出电容。问题在于规模。单相同步Buck在0.7V输出下做到40A~60A已经很吃力,散热和封装都顶不住,而下一代服务器CPU的VDDCR/VCCIN通道要500A~1000A。所以核电源一定是多相并联,由一颗数字控制器统一调度相数、开关频率、环路和时序,再通过SVID或SVI总线接受CPU的电压请求。选型和布局的核心矛盾只有一句话:在给定的封装面积和高度里,把稳态纹波、瞬态跌落和效率同时压到可接受的范围。
2.1 为什么核电源必须多相,还要上耦合电感和TLVR
多相的第一层收益是交错。N相Buck的驱动信号依次错开360°/N,各路电感的纹波电流在输出节点互相抵消,输出端看到的纹波电流近似降到单相的1/N。第二层收益是热分散:同样的总电流摊到N个功率级上,每相的导通损耗和温升都下降,SPS可以贴着CPU socket排开。代价是成本、占板面积,以及轻载时相数管理不当导致的效率塌陷。
单相电感纹波电流按下面的关系估算,其中D为占空比,fsw为单相开关频率:
ΔIL = (Vin - Vout) × D / (L × fsw),其中 D ≈ Vout / Vin以Vin=12V、Vout=0.75V、L=150nH、fsw=800kHz为例,D≈0.0625,ΔIL≈(11.25×0.0625)/(150e-9×800e3)≈5.9A。八相交错后,输出端纹波电流在理想交错条件下约为单个电感的八分之一,不到1A。这组数字解释了为什么核电源敢用这么小的电感值——交错本身就替电容分担了纹波压力。
但交错解决不了瞬态。CPU的电流阶跃发生在百纳秒量级,此时决定电压跌落的不是稳态纹波,而是回路里所有寄生电感和输出电容的等效串联电感(ESL)。耦合电感和TLVR(跨电感电压调节器)就是为这一段设计的:通过让相邻相的电感绕在同一磁芯上,或者用一组辅助绕组把各相的di/dt信息耦合起来,稳态等效电感基本不变(纹波不恶化),而瞬态等效电感显著降低,相电流可以更快地爬升。代价是多一个磁件、多一层绕制工艺,控制器侧的相电流检测也要重新标定。
注意:TLVR的辅助绕组电流应力很高,磁芯饱和和损耗要单独评估,不能按主电感的规格照搬。
2.2 数字控制器与智能功率级:SPS/DrMOS的关键参数
数字控制器负责四件事:上电初始化和时序、环路补偿与瞬态增强、相数管理与效率优化、遥测与故障保护。选型时最该看的是它支持的协议栈——PMBus版本、AVSBus支持、能否对接SVID/SVI,以及是否兼容自家或第三方的智能功率级(SPS)。很多控制器与SPS之间的通信是私有协议,混搭会直接卡在初始化阶段。
智能功率级把驱动、上下管、电流采样和温度传感器封在一起。评估时抓这几个参数:每相连续电流与峰值电流、上下管Rds(on)、IMON电流上报精度、死区时间是否自适应、故障上报通道(过温、过流、欠压)。IMON精度尤其关键,它同时影响遥测读数和过流保护阈值;行业里±5%是常见水平,要求高的设计会做逐相校准。另外,控制器侧的非线性响应(瞬态时临时拉高占空比或加相)是抑制大跌落的主要手段,调参时不要只调PID系数而忽略它。
2.3 相数与开关频率的取舍:一张可查的参数表
相数和频率不是越多越高就好。频率上去,瞬态响应变快、电感可以变小,但开关损耗和驱动损耗线性上升;相数上去,纹波和热更好,但静态损耗、控制器复杂度和成本都涨。下面这张表是常见的落点区间,可以用来快速定位。
| 满载电流 | 典型相数 | 每相电流 | fsw | 每相电感 | 适用场景 |
|---|---|---|---|---|---|
| 150A~250A | 4~6 | 40A~50A | 600~800kHz | 220~330nH | 桌面/边缘CPU核电源 |
| 300A~500A | 6~10 | 50A~70A | 700~1000kHz | 150~220nH | 主流服务器CPU |
| 600A~1000A | 10~20 | 60A~90A | 800~1200kHz | 90~150nH | 高核数服务器/AI加速卡 |
估算不同相数组合下的输出纹波和每相损耗,用一个小脚本比手算快得多:
# 多相Buck纹波与相电流快速估算 def phase_ripple(vin, vout, l_h, fsw): d = vout / vin # 占空比 return (vin - vout) * d / (l_h * fsw) # 单相电感纹波电流 A def out_ripple(vin, vout, l_h, fsw, phases): il = phase_ripple(vin, vout, l_h, fsw) # 理想交错下输出纹波按相数衰减,实际取值需留余量 return il / phases, il for n in (6, 8, 10, 12): out, il = out_ripple(12.0, 0.75, 150e-9, 800e3, n) print(f"{n}相: 单相纹波 {il:.2f}A, 输出纹波 {out:.2f}A")这段代码只做一阶估算:phase_ripple给出单相电感电流的峰峰值,out_ripple按理想交错把输出纹波除以相数。真实设计里还要叠加占空比抖动、驱动延迟失配和电容ESR的贡献,通常在此结果上留1.5~2倍余量再选电容。
3. 核电源供电方案的计算与寄存器配置实操
拓扑定下来之后,真正决定方案能不能落地的是三件事:输出电容够不够、负载线怎么定、寄存器写得对不对。这一章按这个顺序走一遍,所有参数都可替换成你自己板子上的值。
3.1 用Python算输出电感、输出电容与最大电流斜率
输出电容的选择由瞬态指标倒推。设允许的电压跌落为ΔV,负载阶跃为ΔI,控制器和电感能提供的电流爬升斜率为di/dt,那么在环路介入之前的这段时间里,电容要独自扛住电荷:
# 由瞬态指标倒推输出电容需求 def required_cout(di, dv, di_dt, esl_h=100e-12): t_ramp = di / di_dt # 电流爬升到目标所需时间 s # 简化模型:电容承担前半段电荷,后半段由电感电流补偿 c_farad = di * t_ramp / (2 * dv) # ESL引起的瞬时跌落 dv_esl = esl_h * di_dt return c_farad * 1e6, dv_esl * 1e3, t_ramp * 1e9 c, v_esl, t = required_cout(di=400, dv=0.045, di_dt=1000e6) print(f"电容需求 {c:.0f} uF, ESL瞬时跌落 {v_esl:.1f} mV, 爬升时间 {t:.0f} ns")三个参数分别对应:di是负载阶跃幅度,dv是允许跌落,di_dt是功率级能提供的电流斜率(由电感和输入输出压差决定,μF级大电流设计常在几百A/μs到上千A/μs)。输出里的dv_esl是ESL带来的瞬时尖峰,它决定了你能不能用普通MLCC堆叠——如果这一项就吃掉了大半预算,就要考虑低ESL封装或把电容挪到更靠近socket的位置。
3.2 用PMBus读写VR13/VR14与SVI3的遥测和设定
PMBus是核电源的“窗口”。Linux下最直接的方式是通过i2c-dev暴露总线,再用i2c-tools或smbus2读写标准命令码。先确认地址和总线:
# 扫描VRM所在总线,典型地址0x60/0x61/0x62(控制器/页) i2cdetect -y 4 # 读VOUT_MODE,决定后续电压数据的格式(LINEAR16还是LINEAR11) i2cget -y 4 0x60 0x20 w # 读输出电压、输出电流、温度 i2cget -y 4 0x60 0x8b w # READ_VOUT i2cget -y 4 0x60 0x8c w # READ_IOUT i2cget -y 4 0x60 0x8d w # READ_TEMPERATURE_1命令码0x20、0x8B、0x8C、0x8D分别对应VOUT_MODE、READ_VOUT、READ_IOUT和READ_TEMPERATURE_1。i2cget返回的是小端两字节,还需要按格式解码。VOUT_MODE的低5位是带符号指数,READ_VOUT按LINEAR16解析;READ_IOUT是LINEAR11格式:高5位指数、低11位尾数,都为有符号。写成函数方便反复调用:
def linear11(word): """PMBus LINEAR11: 高5位有符号指数, 低11位有符号尾数""" exp = (word >> 11) & 0x1F if exp > 15: exp -= 32 man = word & 0x7FF if man > 1023: man -= 2048 return man * (2.0 ** exp) def linear16_vout(word, vout_mode): """PMBus LINEAR16: VOUT_MODE低5位为指数""" exp = vout_mode & 0x1F if exp > 15: exp -= 32 return (word & 0xFFFF) * (2.0 ** exp) raw_vout_mode = 0x17 # 从0x20读回的值 word_vout = 0x0190 # 从0x8B读回的值, 举例 word_iout = 0x0C80 # 从0x8C读回的值, 举例 print(f"Vout = {linear16_vout(word_vout, raw_vout_mode):.4f} V") print(f"Iout = {linear11(word_iout):.1f} A")改电压和限值走VOUT_COMMAND(0x21)、VOUT_MAX(0x24)、IOUT_OC_FAULT_LIMIT(0x46)、OT_FAULT_LIMIT(0x51)。写之前先读回原值存档,很多控制器一旦写坏限值会直接锁死输出,只能重新上电。SVI3平台上,核心电压由CPU通过SVC/SVD/ALERT三线动态请求,PMBus侧的VOUT_COMMAND通常只在初始化和VID表加载时生效,运行中改它可能被CPU的VID请求立即覆盖。
3.3 负载线与自适应电压定位(AVP)怎么定
AVP的思路是故意让输出电压随负载线性下降,把空载电压抬高、满载电压压低,这样在负载突变时电压变化量更小,输出电容需求随之下降。负载线用mV/A表示,等于允许的电压窗口除以电流窗口。例如Vout在0.75V、允许±45mV、满载800A,负载线大约取0.11mV/A的窗口宽度——实际取值还要扣掉瞬态偏移和测量误差。
配置时要知道两件事:Intel IMVP VR13/VR14允许在AVP(带负载线)和无跌落(no droop)之间选,选哪种取决于CPU侧是否需要固定的VID对应关系;AMD SVI2/SVI3同样支持负载线斜率设定,参数一般在VR控制器的配置文件中随平台方案给出。负载线设大能省电容,但会压缩CPU的电压余量,遇到AVX类重载指令时更容易触发降频保护。调优时把负载线、瞬态增强强度和相数管理阈值作为一组参数一起看,单独改一个通常只是把问题挪到别处。
4. Intel与AMD平台核电源方案的差异与落地
同一套多相Buck,放到Intel和AMD平台上不能照抄。差异不在功率级,而在电压请求协议、电压域划分和电源状态管理上。这部分搞错,轻则上电时序报错,重则VR根本没有输出。
4.1 IMVP VR13/VR14 与 SVI2/SVI3 的协议差异
Intel的IMVP系列用SVID总线,CPU作为主机下发VID、请求电源状态(PS0~PS4),VRM回报状态。VR13/VR14针对服务器平台提高了电流能力和遥测精度要求,并明确了加载线、动态电压转换速率等指标。AMD这边用SVI,物理上是SVC(时钟)、SVD(数据)、ALERT三根线,SVI3相比SVI2提高了通信速率、增加了电源状态和电压域数量。AMD EPYC平台上通常能看到VDDCR_CPU、VDDCR_SOC、VDDIO_MEM等多个由SVI管理的电压域,每个域的供电方案和负载线要分别设计。
| 对比项 | Intel IMVP VR13/VR14 | AMD SVI2/SVI3 |
|---|---|---|
| 接口 | SVID,串行VID | SVC/SVD/ALERT三线 |
| 电压域 | VCCIN等,部分产品片内再分 | VDDCR_CPU/VDDCR_SOC等多域 |
| 电源状态 | PS0~PS4 | 多档状态,SVI3更细 |
| 配置入口 | VR控制器配置+BIOS策略 | VR控制器配置+BIOS曲线 |
| 排错重点 | SVID超时、ALERT状态位 | 域间时序、VID表匹配 |
在AMD EPYC平台的BIOS里,能直接调的项目包括各电压域的负载线、P-state对应的频率电压点、以及VR的相数管理策略。改这些之前先用PMBus把各域的稳态电压和电流记一遍基线,否则出问题无法判断是BIOS策略变了还是硬件异常。CPU架构层面的核心调度特性会频繁拉起和放下核心,这会直接反映在VR的相数切换和温度曲线上,评估供电余量时要把这种调度行为算进负载模型里。
4.2 48V直降、中间总线与垂直供电在服务器CPU上的取舍
机柜里走48V母线已经是常见做法,但从48V到0.75V的转换比超过60:1,单级Buck的占空比小到无法接受。所以实际方案是两级:48V先降到12V或更低的中间总线电压(IBC),再由多相Buck降到核电压;或者用带变压器的固定变比模块把48V直接变到适合Buck的中间电压。选择哪条路,取决于板级空间、效率目标和成本。
垂直供电(VPD)是另一个方向上的优化:把电感和功率级放到socket正下方的PCB背面,让电流从背面直接穿过过孔进入封装,回路长度从几厘米缩到几毫米。带来的收益是直流压降和回路电感同时下降,瞬态表现更好;代价是背面空间被占满、散热路径变更、维修性变差。高核数服务器CPU和AI加速卡用得多,普通主板不必强上。
4.3 PCB叠层与去耦:把回路电感压到最低
核电源的很多“瞬态问题”其实是布局问题。近百安培的电流在铜皮上产生的压降和回路电感,靠调环路补不回来。几条硬经验:输出电容到socket的回路要短而宽,正反层就近打孔形成紧耦合,避免电流绕行;功率级到电感的走线按载流和温升单独算铜厚;电流采样点尽量靠近电感或直接用电感DCR采样,但要评估DCR的温度漂移;PMBus和SVID这类小信号线远离开关节点,避免串扰导致通信误码。做风扇转速和温度采集时,可以直接读Linux的hwmon节点确认板级温升,而不是只信VR上报的SPS温度。
5. 瞬态、温升与遥测:把供电方案验证到能上量
方案画完不等于能上量,验证环节决定后面会不会批量返工。核心是造出可复现的负载阶跃,再用示波器和遥测两路数据交叉确认。
5.1 用CPU压力测试构造可复现的核电源负载阶跃
用真实CPU负载比电子负载更接近实际应力,因为CPU的电流阶跃发生在片内,外部电子负载模拟不出这个速度。做法是先固定频率和功率策略,再用压力测试从单核逐步加到全核,制造从几十安培到满载的阶梯:
# 固定到8个逻辑核上跑满负载,持续60秒,制造持续大电流 stress-ng --cpu 8 --cpu-method matrixprod --timeout 60s # 读取CPU温度(hwmon节点,不同平台编号不同) for h in /sys/class/hwmon/hwmon*; do echo "$h: $(cat $h/name 2>/dev/null) $(cat $h/temp1_input 2>/dev/null)" done--cpu 8控制参与压力测试的核心数,--cpu-method matrixprod选一个能持续吃满AVX/FP单元的负载类型,--timeout控制时长。真正的阶跃来自用taskset或cgroup把核心数从1切到8、或调整P-state,而不是靠负载程序自己起停。测电压跌落时,建议用示波器在socket附近的测试点触发,而不是用程序读回来的电压——后者采样率只有几百赫兹到几千赫兹,看不到微秒级行为。
5.2 示波器与PMBus遥测的交叉验证
采样率低不等于遥测没用。测量时同时抓三路:socket附近的Vcore(差分探头,短地线)、输出总电流(电流探头或同轴分流器)、以及PMBus的READ_VOUT/READ_IOUT日志。示波器看的是初始跌落、恢复时间和环路是否有振荡;PMBus看的是平均电压、平均电流和温度是否在方案预期内。两者对不上,通常意味着测点位置不对(探头引入的寄生参数)、电流采样标定偏差,或者PMBus上报的是滤波后的平均值。把PMBus采样写成循环日志,跑完再对时间轴:
import time from smbus2 import SMBus # 简化的PMBus循环采样,用于和示波器数据对齐时间戳 with SMBus(4) as bus: base = time.time() while time.time() - base < 30: raw = bus.read_word_data(0x60, 0x8C) # READ_IOUT raw = ((raw & 0xFF) << 8) | (raw >> 8) # 字节序转换 print(f"{time.time()-base:.3f}s Iout={linear11(raw):.1f}A") time.sleep(0.005)sleep(0.005)给出约200Hz的采样率,够看趋势不够看瞬态。字节序转换是必须的:smbus2的read_word_data按小端返回,而PMBus的数据也是小端,所以这里要把两字节交换回来再套LINEAR11解析。
5.3 排错清单:从环路振荡到SVID超时
遇到问题按现象对照排查,比逐个改参数快。环路振荡看相位裕度和输出电容的ESR零点,同时确认耦合电感或TLVR的等效参数是否被控制器按普通电感处理;SVID/SVI无输出先量总线和ALERT电平,确认VR是否在CPU发出请求后的规定时间内给出电压;过流误保护多半是IMON精度或DCR温漂导致,冷机和热机各测一遍;轻载效率差通常出在相数管理阈值上,注意CPU智能核心调度会让负载在很低和很高之间来回跳,阈值设得太激进会造成相数频繁切换;上电时序异常则要回去看各电压域的时序表,确认PMBus配置和BIOS设置没有互相覆盖。把这些现象和对应的寄存器、测点记录下来,下一次改版就不用从头再来。
本文还有配套的精品资源,点击获取