2. 低功耗设计基础:CMOS功耗来源与核心控制技术
做嵌入式系统,尤其是ARM架构的芯片,功耗问题迟早会找上门。我最早接触低功耗设计是在一个手持设备项目上,电池容量就那么大,客户还要求续航翻倍。那时候我才真正意识到——功耗不是附属指标,它是硬约束。
这一章我们就把功耗的底牌翻出来看看。搞懂了功耗从哪来,你才能知道怎么省电。
2.1 CMOS功耗的两大来源
CMOS电路的功耗,说白了就两块:动态功耗和静态功耗。一个跟干活有关,一个跟闲着有关。
2.1.1 动态功耗
动态功耗是芯片在“干活”时消耗的能量。它又分两部分:
- 开关功耗:每次信号从0变1或从1变0,都要给负载电容充放电。频率越高、电压越高、负载越大,这部分功耗就越猛。
- 短路功耗:信号翻转的瞬间,PMOS和NMOS会同时导通一小会儿,形成从电源到地的直流通路。虽然时间短,但频率高了也不能忽视。
公式很简单:P_dynamic = α × C × V² × f
α是翻转率,C是负载电容,V是电压,f是频率。你看,电压是平方项,动它一下效果最明显。
关键结论:动态功耗与电压的平方成正比。降低电压是减功耗最狠的手段,但代价是性能会下降。
2.1.2 静态功耗
静态功耗是芯片“闲着”也在耗的电。以前工艺老的时候,这玩意儿几乎可以忽略。但现在28nm以下,静态功耗已经成了大头。
主要来源是漏电流,包括:
- 亚阈值漏电:晶体管关不彻底,还是有微弱电流流过。阈值电压越低,漏电越大。
- 栅极漏电:栅氧化层太薄,电子直接隧穿过去。高k金属栅工艺就是为解决这个问题的。
- 源漏穿通漏电:沟道太短,源漏之间直接漏电。
静态功耗公式:P_static = I_leak × V
I_leak是漏电流总和。温度每升高10°C,漏电差不多翻一倍。所以散热不好的设备,静态功耗会恶性循环。
注意:我曾经在一个IoT项目上踩过坑——常温下功耗测出来没问题,放到高温箱里一测,静态功耗直接飙了3倍。后来才意识到,漏电流的温度敏感性被我们忽略了。
2.2 电压与频率缩放(DVFS)
DVFS是动态电压频率缩放。说白了就是:活多的时候跑快点,活少的时候跑慢点。
为什么要把电压和频率绑在一起调?因为频率高了,电压也得跟着高,否则信号传不过去。频率降下来,电压就可以跟着降。
我习惯把DVFS分成三个层级:
| 层级 | 实现方式 | 典型场景 | 功耗节省 |
|---|---|---|---|
| 芯片级 | P-State / OPP | Linux cpufreq | 30-50% |
| 模块级 | 独立电压域 | GPU/CPU独立调频 | 20-40% |
| 指令级 | 自适应电压缩放 | ARM Intelligent Energy | 10-20% |
实际项目中,我建议你关注两个关键点:
- 电压跳变速度:从低电压升到高电压需要时间,太快了电源会不稳。一般要留几十微秒的稳定时间。
- 频率切换时机:不能在关键任务执行到一半的时候切频率,否则可能造成时序违例。
实战技巧:在ARM Cortex-M系列上做DVFS,我一般用WFI(Wait For Interrupt)指令配合PLL重配置。先让CPU休眠,再改PLL分频比,唤醒后自动跑在新频率上。这样能避免频率切换时的毛刺问题。
2.3 电源门控技术
电源门控比DVFS更狠——直接把不用的模块断电。ARM架构里常用的叫Power Gating,用高阈值电压的开关管(Header/Footer)来控制电源通断。
核心结构就两种:
- Header开关:放在电源和模块之间,关断时模块浮空到GND。
- Footer开关:放在模块和GND之间,关断时模块浮空到VDD。
ARM Cortex-A系列处理器里,每个核心都有自己的电源域。休眠时整个核心断电,只留一个很小的Always-On域来响应唤醒事件。
关键数据:电源门控能把静态功耗降到接近0。但代价是唤醒时间较长(几十到几百微秒),而且断电后寄存器内容全丢,需要做状态保存和恢复。
2.3.1 电源门控的三大挑战
- 浪涌电流:模块重新上电时,瞬间充电电流可能很大。我见过一个项目因为没做软启动,每次唤醒都把电源电压拉掉0.3V,导致其他模块复位。
- 状态保持:断电后寄存器内容丢失。ARM的解决方案是Retention Flip-Flop——一种带影子寄存器的触发器,断电时用低漏电的慢速寄存器保存状态。
- 隔离逻辑:断电模块的输出不能影响其他还在工作的模块。需要加Isolation Cell,在断电时将输出钳位到固定电平。
避坑指南:我曾经在一个SoC项目上,电源门控的隔离单元没加全,结果一个断电的SPI模块输出浮空,把隔壁还在工作的I2C总线给干扰了。排查了两天才找到原因。从那以后,我每次做电源门控都会用形式化验证工具跑一遍隔离检查。
2.4 三种技术的协同使用
实际项目中,DVFS和电源门控是配合使用的。我一般这样分层:
- 运行态:用DVFS根据负载动态调压调频。
- 空闲态:降频降压到最低运行点,或者进入WFI状态。
- 休眠态:直接断电,用电源门控把模块关掉。
ARM的Big.LITTLE架构就是这套思路的典型代表——大核跑重负载,小核跑轻负载,不用的核直接断电。
下面这张图展示了三种技术的协同关系:
2.5 小结
这一章我们把CMOS功耗的底牌翻了个遍。动态功耗靠DVFS来控,静态功耗靠电源门控来灭。两者配合,才能做到真正的低功耗。
嗯,这里要注意:没有银弹。每种技术都有代价——DVFS需要稳定的电源和精确的负载预测,电源门控需要额外的隔离和状态保存逻辑。选什么方案,取决于你的应用场景和成本预算。