3. 上电时序基础:多电源域系统的上电顺序要求

做硬件设计这些年,我见过最惨的一次事故,是某款FPGA板卡在客户现场批量起不来了。排查到最后,就是内核电压比IO电压晚到了那么几十毫秒——芯片内部闩锁了。从那以后,我对上电时序就再也不敢马虎了。

说白了,现在的FPGA、SoC、MCU,内部都不是一个电压域。核心逻辑跑低压,IO接口跑中压,模拟PLL可能还要单独的电压。这些电压谁先来、谁后到、间隔多久,芯片手册里写得明明白白。你要是没按规矩来,轻则启动失败,重则烧芯片。

3.1 为什么需要上电顺序?

多电源域芯片内部,不同电压域之间是有接口电路的。如果IO域先上电了,但核心域还没电,那IO侧的输入缓冲器就可能通过ESD保护二极管,反向给核心域漏电。更严重的是,CMOS电路里的寄生SCR结构可能被触发,形成闩锁——电流不受控地猛增,芯片直接冒烟。

⚠️ 闩锁效应不是闹着玩的
我曾经在调试一块SoC板时,因为3.3V IO先于1.1V核心上电,芯片表面温度在5秒内从室温飙到85°C。断电后芯片虽然没烧,但已经出现了功能异常。从那以后,我所有多电源域设计都强制加时序控制。

除了闩锁,还有一个常见问题:上电顺序不对会导致芯片内部寄存器的初始状态不确定。FPGA的配置逻辑、SoC的PLL锁定过程、MCU的Flash读取,都对电源建立时间有严格要求。

3.2 典型芯片的上电时序约束

不同厂家的芯片,要求不太一样。我整理了几类常见芯片的典型约束,你设计时一定要以具体型号的datasheet为准。

芯片类型 典型电压域 上电顺序要求 关键时序参数
FPGA (Xilinx 7系列) VCCINT (1.0V), VCCAUX (1.8V), VCCO (1.8V/2.5V/3.3V) VCCINT → VCCAUX → VCCO 各域间隔 ≤ 100ms,斜坡时间 0.2~50ms
FPGA (Intel Cyclone V) VCC (1.1V), VCCIO (1.8V/2.5V/3.3V), VCCPD (1.8V/2.5V) VCC → VCCIO 和 VCCPD 同时或之后 VCC 稳定后至少 2ms 再给 IO 上电
SoC (TI AM335x) VDD_CORE (1.1V), VDD_MPU (1.1V), VDDS_DDR (1.5V), VDDS_IO (3.3V) VDD_CORE → VDDS_DDR → VDDS_IO 各域间隔 ≥ 0μs,斜坡时间 0.1~100ms
MCU (STM32H7) VDD (1.8V/3.3V), VDDA (模拟), VDDUSB (3.3V) VDD 先于 VDDA 和 VDDUSB VDD 稳定后至少 1ms 再给模拟域上电
📌 我的经验法则
不管芯片手册怎么写,我个人习惯把核心电压放在最前面上电,IO电压放在最后。如果芯片有独立的模拟电源(比如PLL供电),我会让它在核心电压之后、IO电压之前上电。这个顺序在绝大多数情况下都是安全的。

3.3 上电时序的量化指标

光知道顺序还不够,还得看几个关键参数。你想想看,如果两个电压域之间的间隔只有1μs,但你的电源芯片启动延迟是2ms,那顺序控制就形同虚设了。

  • 斜坡时间 (Slew Rate):电压从10%上升到90%的时间。太快了可能引起过冲,太慢了芯片可能处于欠压状态太久。一般要求0.1~50ms。
  • 顺序间隔 (Sequencing Delay):前一个电压稳定到后一个电压开始上升的时间。有些芯片要求严格单调上升,不允许有平台期。
  • 电压建立时间 (Settling Time):电压进入标称值±5%范围后,到芯片允许开始工作的等待时间。FPGA的配置逻辑通常需要这个时间来完成内部复位。
  • 掉电顺序 (Power Down Sequencing):很多芯片要求掉电顺序与上电顺序相反。如果只控制上电不管掉电,热插拔或突然断电时照样出问题。
💡 一个小技巧
我习惯在原理图上把每个电源域的时序要求直接写在电源网络旁边。比如 "VCCINT: 1st, ramp < 10ms, settle > 2ms"。这样Layout工程师和测试工程师一眼就能看到关键信息,不用反复翻datasheet。

3.4 上电时序的实现方式

实现上电顺序,常见的有三种方法。我按推荐程度排个序:

  1. 专用电源时序芯片:比如TI的TPS3808、ADI的ADM1184。这些芯片有使能引脚和延迟设置,可以精确控制每个电源轨的启动时间。我个人最推荐这种方式,尤其是FPGA和SoC这种对时序要求严格的场景。
  2. 电源模块的使能级联:把前一级电源的Power Good信号接到后一级的Enable引脚。成本低,但延迟精度受电源芯片本身响应时间影响。我一般在MCU系统里用这种方式。
  3. 分立RC延迟+比较器:用电阻电容产生延迟,再用比较器或施密特触发器触发下一级。这种方式精度差、温漂大,我只有在极低成本且时序要求宽松的项目里才用。
// 一个典型的电源时序控制伪代码(基于GPIO控制)
void power_sequence_init(void) {
    // 1. 使能核心电压 (VCCINT)
    GPIO_WriteLow(PIN_EN_CORE);
    delay_ms(5);  // 等待核心电压稳定
    
    // 2. 检查核心电压 Power Good
    while(GPIO_Read(PIN_PG_CORE) == 0);
    
    // 3. 使能辅助电压 (VCCAUX)
    GPIO_WriteLow(PIN_EN_AUX);
    delay_ms(2);
    
    // 4. 检查辅助电压 Power Good
    while(GPIO_Read(PIN_PG_AUX) == 0);
    
    // 5. 最后使能IO电压 (VCCO)
    GPIO_WriteLow(PIN_EN_IO);
    delay_ms(1);
    
    // 6. 等待所有电源就绪
    while(GPIO_Read(PIN_PG_ALL) == 0);
    
    // 7. 释放芯片复位
    GPIO_WriteHigh(PIN_RESET_N);
}
⚠️ 注意:Power Good 信号的处理
有些电源芯片的Power Good是开漏输出,需要外部上拉电阻。我遇到过因为上拉电阻选太大,导致Power Good信号上升沿太慢,后级电源误判为未就绪的情况。建议上拉电阻选4.7kΩ~10kΩ,不要超过47kΩ。

3.5 上电时序的验证方法

设计做完了,怎么验证时序对不对?我一般用示波器抓四个关键点:

  • 每个电源轨的上升波形(看斜坡时间和单调性)
  • Power Good信号的时序关系(看间隔是否满足要求)
  • 芯片复位信号与最后一个电源轨的关系(复位必须在所有电源稳定后释放)
  • 芯片启动后的状态指示(比如FPGA的DONE引脚、SoC的UART输出)

嗯,这里要注意:示波器要用差分探头或者隔离通道,避免共地干扰。我见过有人用普通探头测两个不同地平面的电源,结果示波器地线夹把两个地短接了,烧了电源模块。

多电源域上电时序流程图 多电源域上电时序流程图 系统上电开始 步骤1:使能核心电压 (VCCINT 1.0V) 斜坡时间 0.2~50ms,等待 Power Good 步骤2:使能辅助电压 (VCCAUX 1.8V) 间隔 ≥ 0μs,等待 Power Good 步骤3:使能 IO 电压 (VCCO 3.3V) 间隔 ≥ 2ms,等待 Power Good 步骤4:释放芯片复位信号 所有电源稳定后延迟 1~10ms 芯片正常启动 关键时序参数 • 斜坡时间:0.1~50ms • 顺序间隔:≥ 0μs • 建立时间:1~10ms • 掉电顺序:反向 常见芯片要求 • FPGA:核心→辅助→IO • SoC:核心→DDR→IO • MCU:VDD→VDDA→VDDUSB • 模拟域:核心之后,IO之前

这张图展示了一个典型的多电源域上电流程。你注意看,每个步骤之间都有明确的等待条件——不是简单延迟,而是等待前一级的Power Good信号确认。这样才能保证在电源波动或负载变化时,时序依然可靠。

📌 核心要点总结
  • 多电源域芯片必须按datasheet要求的顺序上电,否则可能引发闩锁或启动失败
  • 核心电压最先上电,IO电压最后上电,模拟电压在中间
  • 斜坡时间、顺序间隔、建立时间、掉电顺序,四个参数缺一不可
  • 专用时序芯片最可靠,级联使能次之,RC延迟最不推荐
  • 验证时用示波器抓波形,注意探头接地问题