第3章:低功耗基础理论:CMOS功耗来源与权衡

各位同学,咱们今天聊聊低功耗设计的“根”。

做嵌入式,尤其是做暖通空调这种需要电池供电或者长期运行的设备,功耗就是命门。你想想看,一个温控器,如果三天两头换电池,用户不骂娘才怪。所以,搞懂功耗从哪来,怎么算,怎么降,是咱们这行的基本功。

3.1 CMOS功耗的三大来源

CMOS电路的功耗,说白了就三块:动态功耗、静态功耗、还有短路功耗。我习惯把它们比作“三座大山”,咱们得一座一座翻过去。

3.1.1 动态功耗(开关功耗)

这是最“显眼”的功耗。每次信号从0变1,或者从1变0,都要给负载电容充放电。这个电容包括门极电容、互连线电容等等。

公式很简单:P_dynamic = α × C_L × V_DD² × f

其中:

  • α:翻转活动因子(0到1之间,表示平均每个时钟周期翻转的概率)
  • C_L:负载电容
  • V_DD:供电电压
  • f:工作频率

我在项目中遇到过一件事:一个温控器,屏幕刷新率设成了60Hz,其实人眼根本不需要那么快。后来我把刷新率降到10Hz,动态功耗直接降了六分之五。你看,频率的影响就是这么直接。

核心结论:动态功耗与电压的平方成正比,与频率成正比。所以降电压是“性价比”最高的降功耗手段。

3.1.2 静态功耗(漏电流功耗)

这个就有点“阴魂不散”了。即使芯片啥也不干,只要通着电,就有电流漏过去。主要来源有:

  • 亚阈值漏电流:晶体管关不彻底,有点“半开半合”
  • 栅极漏电流:栅氧化层太薄,电子直接“穿墙”
  • PN结漏电流:源漏与衬底之间的反向漏电

公式:P_static = I_leakage × V_DD

嗯,这里要注意。以前做90nm以上工艺时,静态功耗几乎可以忽略。但现在做28nm、甚至更小的工艺,静态功耗占比越来越高。我记得有一次做低功耗项目,芯片在休眠模式下,静态功耗占了总功耗的70%!当时我整个人都懵了。

避坑指南:我曾经因为没仔细看芯片数据手册的漏电流参数,导致产品待机电流超标。后来学乖了,选型时一定先看“典型漏电流”和“最大漏电流”,尤其是高温下的漏电流,会翻好几倍。

3.1.3 短路功耗(直通功耗)

这个功耗发生在信号翻转的瞬间。当输入电压在中间值时,PMOS和NMOS会同时导通一小会儿,形成从VDD到GND的短路电流。

公式:P_short = I_short × V_DD × t_sc × f

其中t_sc是短路时间,取决于输入信号的上升/下降时间。

说白了,就是信号边沿不够陡峭,导致两个管子“打架”。我一般建议:尽量让输入信号的上升/下降时间控制在1ns以内,这样短路功耗可以忽略不计。

3.2 电压与频率的权衡

这是低功耗设计的“灵魂拷问”。

你想想看,动态功耗跟V²成正比,跟f成正比。那是不是电压越低越好?

不一定。因为频率f和电压V_DD是有关系的:

f_max ∝ (V_DD - V_th)² / V_DD

电压降得太低,频率就上不去。所以,咱们得找到一个“甜蜜点”。

策略 做法 效果 代价
动态电压频率调整(DVFS) 根据负载动态调整V和f 功耗降低30%-50% 需要DC-DC和PLL支持
多电压域 不同模块用不同电压 精细控制功耗 设计复杂度增加
时钟门控 不用的模块关掉时钟 降低动态功耗 需要额外逻辑
电源门控 不用的模块彻底断电 消除静态功耗 唤醒时间长

我个人习惯的做法是:先确定系统的最低频率需求,然后在这个频率下,找到能稳定工作的最低电压。比如一个温控器,主控只需要跑10MHz就够用了,那我会把电压降到1.2V甚至1.0V,而不是用默认的1.8V。

实战技巧:很多MCU都支持“欠压运行”模式。比如STM32L系列,在1.65V下还能跑16MHz。我做过一个项目,把电压从3.3V降到1.8V,动态功耗直接降了70%。当然,前提是外设也要能工作在低电压下。

3.3 功耗估算公式

做设计不能光凭感觉,得会算账。咱们把三个功耗加起来:

P_total = P_dynamic + P_static + P_short

展开就是:

P_total = α × C_L × V_DD² × f + I_leakage × V_DD + I_short × V_DD × t_sc × f

在实际工程中,短路功耗通常可以忽略(只要你的信号边沿够陡)。所以简化版公式是:

P_total ≈ α × C_L × V_DD² × f + I_leakage × V_DD

举个例子:

假设一个MCU:
- 负载电容 C_L = 20pF
- 活动因子 α = 0.2(典型值)
- 电压 V_DD = 3.3V
- 频率 f = 16MHz
- 漏电流 I_leakage = 10μA

动态功耗 = 0.2 × 20e-12 × (3.3)² × 16e6
         = 0.2 × 20e-12 × 10.89 × 16e6
         = 0.2 × 20 × 10.89 × 16 × 1e-6
         = 697 μW

静态功耗 = 10e-6 × 3.3 = 33 μW

总功耗 ≈ 730 μW

你看,在这个例子里,动态功耗占了95%以上。但如果把频率降到1MHz,动态功耗就变成43.6μW,静态功耗反而成了大头。

关键认知:高频时,动态功耗是老大;低频或休眠时,静态功耗才是真正的“吸血鬼”。所以低功耗设计要“两手抓”:高频时降电压降频率,低频时关电源降漏电。

3.4 我的实战经验总结

做了这么多年低功耗设计,我总结了几条“铁律”:

  1. 能关就关:不用的外设、不用的时钟、不用的电源域,统统关掉。别心疼那几行代码。
  2. 能降就降:电压能降1V就别只降0.5V,频率能跑1MHz就别跑10MHz。
  3. 能睡就睡:让MCU尽量待在休眠模式。暖通空调控制器,大部分时间都在“等”,别让它醒着耗电。
  4. 算清楚账:每次改设计,都拿公式算一算,别凭感觉。我见过太多人“感觉功耗很低”,结果一测傻眼了。

嗯,这一章的内容就到这。下一章咱们聊聊具体的低功耗硬件设计技巧,包括电源管理、时钟设计、IO口处理这些实战内容。到时候我会拿几个我踩过的坑来举例,保证让你印象深刻。