4、电源门控技术:电源开关单元(PSW)设计,隔离单元与状态保持
好,咱们接着聊电源门控。这玩意儿说白了就是「哪块用不上,就把哪块的电给掐了」。听起来简单吧?但实际做起来,坑可不少。我个人习惯把电源门控拆成三个核心部件来看:电源开关单元(PSW)、隔离单元、还有状态保持逻辑。今天咱们一个一个说透。
4.1 电源开关单元(PSW)设计
PSW 是什么?就是那个负责「开闸」和「关闸」的开关。它通常用高阈值的 PMOS 管来做。为什么用 PMOS?因为 PMOS 对地导通,控制起来方便,漏电也小。
我遇到过不少新手,一上来就问:「直接用个普通 MOS 管不行吗?」嗯,理论上行,但实际功耗会很难看。高阈值管在关断时漏电流能低到 pA 级,普通管可能就跑到 nA 级了。你想想看,一个芯片上几百个开关,每个多漏几纳安,那总漏电就失控了。
这里给个简单的设计参考表:
| 负载电流范围 | 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
我个人习惯在状态保持逻辑里再加一个「保持完成标志」。上电后,影子寄存器恢复完毕,这个标志才拉高,通知系统「我准备好了」。这样能避免上电初期读到脏数据。
4.4 三个部件的协同工作
PSW、隔离单元、状态保持,这三者不是各自为战的。它们需要一套完整的控制时序:
- 准备掉电: 先触发状态保持(save_en 拉高),等保存完成。
- 隔离使能: 拉高 ISO 信号,把输出强制到安全电平。
- 关断电源: 拉低 PSW 控制信号,模块掉电。
- 上电恢复: 先拉高 PSW,等电源稳定。
- 解除隔离: 拉低 ISO,让信号正常流通。
- 恢复状态: 触发 restore_en,把影子寄存器的值写回。
这个顺序不能乱。我曾经见过一个设计,先关电源再拉隔离,结果关电瞬间信号毛刺直接穿到了 always-on 域,把隔壁模块的寄存器给冲乱了。嗯,这种 bug 最难查,因为它是偶发的,跟温度、电压都有关。
好了,这一节就聊到这儿。下一节咱们讲多电压域的设计,那个更刺激——不同电压域之间怎么通信?电平转换怎么选?到时候再细说。