在这两种类型中,BRAM通常功耗要大一些。启用后的BRAM静态功率是其功耗的最大部分,跳变带来的功耗居于第二位。设计人员可以采取一些步骤来优化BRAM的功耗。例如,可以仅在读或写周期才启用BRAM。对于较小的存储器模块可以使用LUTRAM来代替BRAM,将 BRAM留给较大的存储器模块使用。此外,还可以尝试将BRAM用于多个大型模块。另一种技术是合理安排存储器阵列来减少其占用的延迟面积、使性能最大化并尽量降低其功耗。图1左侧给出了一个针对速度和面积而优化的2K x 36bit存储阵列。
我们利用四个2K x 9bit模块并行构成这一存储阵列,并在需要新值时启用(Enable)所有四个模块。另一方法是采用四个512 x 36bit模块来安排2K x 36bit,但利用低两位地址解码来选择访问哪个512 x 36bit模块。在后一种情况下,某个时间仅访问一个存储器块,功耗将比第一种方法降低75%。
图1右侧显示的是Xilinx公司的块存储器生成器(Block Memory Generator),利用它可以生成任意大小的存储器阵列并可以针对速度或功率对其进行优化。图2则给出了具体应用中的Xilinx Power Estimator,比较了在给定的使能速率下N个模块同时启动与N/4模块启动时的功耗情况。结果显示动态功率降低了75%。
Xilinx工具可帮助选择适合的存储器阵列。考虑某个设计中需要两组存储器区域。一种情况下需要运行在300MHz的16组64 x 32bit存储器结构(总位数为32K),另一种情况下需要16组512 x 36bit 存储器架构 (总位数为294K)。
看一下16组64 x 32bit存储器结构的功率比较,XPE工具显示出小存储器阵列最好用LUTRAM来实现,这样比用BRAM节约85%的功耗(如图3)。这是因为如果采用BRAM的话,只能用16个18K位的模块来实现16个极小(64 x 32bit)的存储器,有很多空间被浪费了。而第二种情况16组18K位阵列的功率比较,XPE显示情况正好相反,应当采用大一些的存储器阵列来实现(图 4)。这种情况下,采用BRAM比采用LUTRAM可以节约28%的功耗,这是因为如果采用LUTRAM就需要启用更多的小粒度对象并增加更多的互连。