基本公式就是P=IV,不过要考虑到不同状态下的不同电流(平均电流),还有不同状态在整个工作过程中所占比例,还有电压,频率的变化等等。下面我举个内存芯片的功耗计算的例子,不一定完全准确,但从实际测量结果看来相差不大。
计算内存电源消耗的最重要的参数是操作电流IDD参数,这些值在标准的内存芯片参考手册上都可以查到。下面的列表介绍了DDR内存芯片的各种IDD电流的具体含义:
电流标称 工作的条件/参数
IDD0 操作电流,Active到Precharge,一个Bank工作,Active指令最小持续周期TRC = TRC (min),DQ,DM,DQS每个时钟内状态变化一次,地址和控制信号每两个时钟改变一次。
IDD1 操作电流,Active-Read-Precharge,一个Bank工作,突发长度为2,Active指令最小持续周期TRC = TRC (min),地址和控制信号每个时钟改变一次。
IDD2P 静态电流,预充电状态中,节电模式,CKE为低电平,所有Bank空闲。
IDD2F 静态电流,预充电状态中,Standby模式,CKE高电平有效,片选信号未选中,所有 Bank空闲。
IDD3P 静态电流,激活状态中,节电模式,CKE为低电平,一个Bank激活,其它Bank空闲
IDD3N 静态电流,激活状态中,Standby模式,Active到Precharge,CKE为高电平,一个Bank工作,Active指令最大持续周期TRC = TRAS (max),DQ,DM,DQS每个时钟内状态变化两次,地址和控制信号每个时钟改变一次。
IDD4R 操作电流,读操作,突发长度为2,连续突发,一个Bank工作,地址和控制信号每个时钟改变一次。
IDD4W 操作电流,写操作,突发长度为2,连续突发,一个Bank工作,地址和控制信号每个时钟改变一次,DQ,DM,DQS每个时钟内状态变化两次。
IDD5IDD6 最大自动刷新电流,TRC = TRC (min)。
正常自动刷新电流,TRC = 7.8125us,8K/64ms刷新率(有的Datasheet上只有IDD5)
IDD7 内部自刷新电流,分为标准芯片和低功耗芯片两种情况。
IDD8 操作电流,所有Bank交错读操作,突发长度为4,TRC = TRC (min),地址和控制信号只在执行Read和Write指令时才改变状态。
了解了这些电流的含义之后,我们就可以进行具体的功耗计算了。详细的分析可参见Micron公司的技术资料Calculating Memory System Power For DDR,TN-46-03。
后台电源消耗(Background Power):
l CKE低电平节能状态的预充电模式:P (Pre_PND)= IDD2P*VDD
l CKE有效Standby状态的预充电模式:P (Pre_STBY)= IDD2F*VDD
l CKE低电平节能状态的激活模式:P (ACT_PND)= IDD3P*VDD
l CKE有效Standby状态的预充电模式:P (ACT_STBY)= IDD3N*VDD
l 自动刷新电流:P (REF)= (IDD5/6- IDD2P)*VDD。
激活时操作电流(Activate Power):
l Active到Precharge操作过程中的消耗:
P (ACT)= (IDD0- IDD3N)*VDD*[TRC(spec)/TACT(actual)]。
读写操作电流(Read/Write Power):
l 写操作的功耗:P (WR)=(IDD4W- IDD3N)*VDD*WR%
l 读操作的功耗:P (RD)=(IDD4W- IDD3N)*VDD*RD%
l 读操作时I/O功耗:P (DQ)=(Vout* I out)*N*RD%
其中WR%和RD%指写/读操作在ACT周期中占的比重,Vout和I out指DQ管脚的输出电压和电流,N指芯片上DQ和DQS的数目。
需要注意的是,芯片厂商的Datasheet上提供的数据通常都是在比较苛刻的
条件下测量的结果,比如VDD是工作在额定最大电压下(对DDR来说一般为2.7V)。遇到这种情况我们就要采取一些处理措施,办法就是根据实际电压和频率的变化,对计算的结果通过乘上变化因子进行调整,功率和频率及电压的平方成正比:
2
P2=(V2/V1)(f2/f1)P1
经过调整之后,得到的就是在实际工作电压和频率下的功耗。当然,这时候计算出来的仅仅是各部分工作状态下相对独立的电源消耗情况,如果综合起来计算整个芯片的功耗,则不是简单地把各项相加就行,还要合理考虑各种状态所占的比例等实际问题,比如:所有Bank预充电占的时间比例BNK_PRE%,处于预充电状态中CKE低电平占的比例CKE_LO_PRE%,处于激活状态中CKE处于低电平的比例CKE_LO_ACT%等等。这时,相应的公式要调整为:
l P (Pre_PND)= IDD2P*VDD* BNK_PRE%* CKE_LO_PRE%
l P (Pre_STBY)= IDD2F*VDD* BNK_PRE%* (1-CKE_LO_PRE%)
l P (ACT_PND)= IDD3P*VDD*(1- BNK_PRE%)* CKE_LO_ACT%
l P (ACT_STBY)= IDD3N*VDD*(1- BNK_PRE%)* (1-CKE_LO_ACT%)
单个芯片电源消耗的计算方法学会之后,我们还可以类推到整个内存模块的
功耗计算。下面我们就举例来分析一下4根1G的DIMM正常工作时的电源消耗,芯片采用Samsung K4H560838D DDR333 64MX4的芯片。
假设的系统工作条件如下:
带入相应的公式即可算出芯片的功耗:
要提出说明的是,在计算自动刷新电流值的时候,没有直接取Datasheet上提供的电流,因为那是在TRC = TRC (min)的条件下测量的平均电流,而我们一般取一个刷新周期内的平均电流来计算刷新电源功耗。(对于8K/64ms刷新率来说,每次刷新的间隔为 7.8125us)。如果Datasheet上只给出了最大的平均刷新电流,就需要估算出折合的正常刷新电流,上面的例子中,实际计算的刷新电流取给定IDD5的5%即9mA。
一条1G的Registered内存模块(带ECC)需要由36块64MX4的内存芯片和1个PLL,两块Register构成,分为两个物理Bank。当一块Bank工作的时候另外一块处于空闲(Idle)状态,每隔一段时间需要进行自动刷新。处于Idle状态的Bank大部分时间处于Power Down模式,只有在需要自动刷新的时候CKE才会有效,所以它消耗的电源主要为P (Pre_PND)和P (REF)。仍然以Samsung芯片为例,则空闲状态的Bank中每个芯片平均消耗的电源为:P (Idle)= P (Pre_PND)+P (REF)=9mA*2.7V*86%=20.9mW。通过测量,正常工作在166MHz下的PLL和Register的操作电流分别为400mA和600mA,这样,模块总的电源消耗为:P1G=18*265.6mW+18*20.9mW+2.5V*(400+600) mA=7657mW。
以次类推,对于4条 DIMM的内存模块组,当一个DIMM工作的时候,其他的DIMM都处于Idle状态,所以总的电源消耗为:
l P4G= P1G+3*2.5V*(400+600) mA+108*20.9mW=17414mW
以上的计算中做了很多的假设,和实际工作不可能完全符合,但我们尽可能考虑地较为保守,所以这样的结果还是具有一定的参考价值。
SDR的功耗计算和DDR基本相似,主要的区别在于以下几个方面:
1) SDR芯片的Datasheet中没有提供IDD2F和IDD3P的值,只有IDD2和IDD3,在计算Power Down模式下的静态功耗都使用电流IDD2,而计算Active状态下都使用IDD3电流。
2) SDR没有IDD0电流参数,只提供了IDD1,我们可以近似的估算IDD0的值:
IDD0= [IDD1-(IDD4-IDD3)*2*tCK]/tRC
3) SDR参数中读写操作电流只有一个值IDD4,在计算读和写操作时均使用这个电流值。
4) SDR和DDR数据信号输出端的匹配不同,DDR中直接通过一个电阻接VTT,计算时取最坏的直流负载情况,而SDR通常是接一个容性的负载。
P (perDQ)=Cload*VDD2*fCK/2
[此贴子已经被作者于2003-1-20 16:45:26编辑过] |