4、电源门控技术:电源开关单元(PSW)设计,隔离单元与状态保持

好,咱们接着聊电源门控。这玩意儿说白了就是「哪块用不上,就把哪块的电给掐了」。听起来简单吧?但实际做起来,坑可不少。我个人习惯把电源门控拆成三个核心部件来看:电源开关单元(PSW)、隔离单元、还有状态保持逻辑。今天咱们一个一个说透。

4.1 电源开关单元(PSW)设计

PSW 是什么?就是那个负责「开闸」和「关闸」的开关。它通常用高阈值的 PMOS 管来做。为什么用 PMOS?因为 PMOS 对地导通,控制起来方便,漏电也小。

我遇到过不少新手,一上来就问:「直接用个普通 MOS 管不行吗?」嗯,理论上行,但实际功耗会很难看。高阈值管在关断时漏电流能低到 pA 级,普通管可能就跑到 nA 级了。你想想看,一个芯片上几百个开关,每个多漏几纳安,那总漏电就失控了。

核心要点: PSW 的尺寸选择要权衡导通电阻和面积。太大,面积浪费;太小,IR drop 会压垮你的时序。

这里给个简单的设计参考表:

负载电流范围 PSW 宽度建议 典型导通电阻
< 1 mA 2~5 μm ~100 Ω
1~10 mA 10~20 μm ~20 Ω
10~100 mA 50~200 μm ~2 Ω

注意,这只是个粗略的参考。实际项目中,我习惯先跑个 IR drop 仿真,再回头调尺寸。别指望一次搞定。

4.2 隔离单元:别让信号「串门」

电源关了,但信号线还连着,会出什么事?

想象一下:一个关电的模块,输出引脚还连着另一个上电模块的输入。关电模块内部电压掉到 0V,但上电模块还在 1.2V 工作。这时候,上电模块的输入引脚会通过 ESD 保护二极管往关电模块「灌电流」。轻则逻辑混乱,重则烧管子。

隔离单元就是干这个的——把「活的」和「死的」隔开。

常用的隔离方式有两种:

  • AND 门隔离: 在输出路径上加一个 AND 门,一端接信号,另一端接隔离控制信号(ISO)。ISO=0 时,输出强制为 0。
  • 电平转换隔离: 适用于跨电压域的场景,同时完成隔离和电平转换。
我的小技巧: 隔离控制信号本身要小心处理。它必须来自「永远不掉电」的域,否则隔离自己先挂了,那就尴尬了。

我曾经在一个项目中,隔离信号用了掉电域的输出。结果掉电瞬间,隔离信号先于被隔离模块变成 X 态,导致整个总线数据全乱套。那次 debug 花了我整整两天……嗯,从那以后,我所有隔离信号都强制用 always-on 域的寄存器来驱动。

4.3 状态保持:掉电不丢「记忆」

有些模块掉电后,我们希望它恢复时能回到之前的状态。比如一个配置寄存器,你设好了工作模式,一掉电全丢了,再上电又得重新配一遍。这显然不行。

状态保持的常用方案是「寄存器 + 影子寄存器」:

  • 主寄存器在掉电域里,正常工作用。
  • 影子寄存器在 always-on 域里,掉电前把关键状态拷过去。
  • 上电后,影子寄存器再把状态写回主寄存器。

代码示例(Verilog 风格):

// 状态保持逻辑示例
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        main_reg <= 'b0;
        shadow_reg <= 'b0;
    end else if (save_en) begin
        // 掉电前保存
        shadow_reg <= main_reg;
    end else if (restore_en) begin
        // 上电后恢复
        main_reg <= shadow_reg;
    end else begin
        main_reg <= next_state;
    end
end
注意: save_en 和 restore_en 不能同时有效。而且 save_en 必须在掉电前至少一个时钟周期就拉高,给影子寄存器留足写入时间。

我个人习惯在状态保持逻辑里再加一个「保持完成标志」。上电后,影子寄存器恢复完毕,这个标志才拉高,通知系统「我准备好了」。这样能避免上电初期读到脏数据。

4.4 三个部件的协同工作

PSW、隔离单元、状态保持,这三者不是各自为战的。它们需要一套完整的控制时序:

  1. 准备掉电: 先触发状态保持(save_en 拉高),等保存完成。
  2. 隔离使能: 拉高 ISO 信号,把输出强制到安全电平。
  3. 关断电源: 拉低 PSW 控制信号,模块掉电。
  4. 上电恢复: 先拉高 PSW,等电源稳定。
  5. 解除隔离: 拉低 ISO,让信号正常流通。
  6. 恢复状态: 触发 restore_en,把影子寄存器的值写回。

这个顺序不能乱。我曾经见过一个设计,先关电源再拉隔离,结果关电瞬间信号毛刺直接穿到了 always-on 域,把隔壁模块的寄存器给冲乱了。嗯,这种 bug 最难查,因为它是偶发的,跟温度、电压都有关。

总结一下: 电源门控不是简单「断电」就完事了。PSW 管好电源,隔离单元管好信号,状态保持管好数据。三个环节缺一不可,时序配合更是关键。

好了,这一节就聊到这儿。下一节咱们讲多电压域的设计,那个更刺激——不同电压域之间怎么通信?电平转换怎么选?到时候再细说。