1. 功耗分析基础:功耗的物理定义、动态功耗与静态功耗、CMOS电路功耗模型、功耗与能量的区别
做嵌入式系统这么多年,我见过太多工程师一上来就闷头调代码、降频率,结果功耗死活降不下来。为什么?说白了,连功耗的“根”都没摸清楚。今天咱们就把功耗分析的基础打牢,后面优化起来才能有的放矢。
1.1 功耗的物理定义
功耗,从物理上讲,就是单位时间内消耗的能量。公式很简单:P = dE / dt。但在芯片里,这个能量是怎么“花”掉的?
我习惯把芯片想象成一个微型城市。电流就是城市里的车流,电压就是道路的宽度。车流越大、道路越宽,消耗的“油”(能量)就越多。功耗,就是单位时间里的“油耗”。
核心公式:
P = V × I
其中 V 是供电电压,I 是总电流。这个公式虽然简单,但它是所有功耗分析的起点。
嗯,这里要注意:芯片里的电流不是恒定的。它随着时钟翻转、数据变化而剧烈波动。所以功耗分析,本质上是在分析电流的“行为”。
1.2 动态功耗与静态功耗
芯片的功耗,可以拆成两大部分:动态功耗和静态功耗。这两者的物理机理完全不同,优化手段也天差地别。
1.2.1 动态功耗
动态功耗,就是芯片“干活”时消耗的功耗。它又分两块:
- 开关功耗:门电路翻转时,给负载电容充放电消耗的能量。这是动态功耗的大头。
- 短路功耗:翻转瞬间,PMOS和NMOS同时导通,形成从VDD到GND的直流通路。虽然时间极短,但电流不小。
动态功耗的公式:
P_dynamic = α × C_L × V_DD² × f
其中:
- α:翻转活动因子(0到1之间,表示每个时钟周期翻转的概率)
- C_L:负载电容
- V_DD:供电电压
- f:时钟频率
你看,电压是平方项!这意味着降低一点点电压,功耗下降非常明显。我在项目中遇到过,把电压从3.3V降到1.8V,动态功耗直接砍掉70%。当然,代价是速度变慢了,需要权衡。
1.2.2 静态功耗
静态功耗,就是芯片“闲着”的时候也在消耗的功耗。以前工艺老的时候,静态功耗几乎可以忽略。但现在工艺到了28nm以下,静态功耗已经成了“心头大患”。
静态功耗主要来自:
- 漏电流:晶体管关断时,仍然有微弱的电流流过。包括亚阈值漏电流、栅极漏电流、源漏穿通漏电流等。
- 偏置电流:模拟电路、I/O电路中的恒定偏置电流。
静态功耗公式:
P_static = I_leak × V_DD
我曾经调试过一个低功耗产品,待机时电流总是降不下去。查了三天,最后发现是某个GPIO上拉电阻没关,漏了十几微安。嗯,这种坑,踩过一次就记住了。
个人经验:动态功耗和静态功耗的占比,取决于芯片的工作状态。全速运行时,动态功耗占90%以上;深度睡眠时,静态功耗就是主角。优化时一定要区分场景,别搞混了。
1.3 CMOS电路功耗模型
CMOS电路的功耗模型,是咱们做功耗分析的理论基础。我习惯把它画成一张图,方便理解:
这张图把CMOS功耗模型拆得很清楚。你想想看,动态功耗和静态功耗的优化方向完全不同:动态功耗靠降电压、降频率、降活动因子;静态功耗靠工艺选择、电源门控、漏电流控制。
1.4 功耗与能量的区别
这个问题,我见过太多人搞混了。功耗和能量,不是一回事。
- 功耗(Power):单位时间消耗的能量,单位是瓦特(W)。它描述的是“消耗速度”。
- 能量(Energy):一段时间内消耗的总能量,单位是焦耳(J)。它描述的是“总消耗量”。
公式关系:
E = P × t
举个例子:
- 一个芯片功耗100mW,运行10秒,消耗能量1J。
- 另一个芯片功耗200mW,运行5秒,消耗能量也是1J。
你想想看,哪个更好?这取决于你的需求。如果是电池供电,能量决定了续航时间,所以更关心能量。如果是散热设计,功耗决定了发热量,所以更关心功耗。
避坑指南:我曾经设计一个物联网终端,客户要求“功耗低于10mW”。我吭哧吭哧把待机功耗做到了5mW,结果客户说续航不够。后来才发现,客户真正关心的是“每天消耗的能量”,而不是瞬时功耗。因为设备大部分时间在休眠,偶尔才工作几秒钟。所以,一定要搞清楚对方说的是功耗还是能量,不然白忙活。
在低功耗设计中,我们经常用“能量效率”这个指标,比如每MHz消耗多少微瓦,或者每MIPS消耗多少毫瓦。这样可以把频率和电压的影响归一化,方便比较不同方案的优劣。
我的习惯:做功耗分析时,我会同时记录峰值功耗、平均功耗和总能量。峰值功耗决定电源和散热设计,平均功耗决定电池续航,总能量决定充电频率。三个指标缺一不可。
好了,功耗分析的基础就这些。记住:动态功耗是“干活”的代价,静态功耗是“活着”的代价。能量是总账,功耗是流速。搞清楚了这些,后面咱们聊优化方案时,你就能明白为什么有些招数管用,有些只是心理安慰。