【详解】SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column)
作者:crifan
联系方式:green-waste (at) 163.com
【背景】
最近在帮忙回答别人的一个问题的时候:
uboot的一个问题
http://bbs.chinaunix.net/thread-3584215-1-1.html
涉及到了SDRAM初始化时候,是配置SDRAM为BRC还是RBC。
对于BRC还是RBC,很久之前,也接触过,当时好像是懂了,不过现在又完全没概念了。
然后百度google一番,还是没找到有人解释清楚的,所以,最后只能自己一点点搜集资料整理出来了。
【什么是BRC和RBC】
BRC = Bank, Row, Column = Bank-Row-Column
RBC = Row, Bank, Column = Row-Bank- Column
是SDRAM中,两种不同的地址映射方式。
下面就针对上面的表述,来一点点解释。
1. Bank
其中Bank,是内存领域里面常用的术语,有把Bank翻译为内存库的,不过觉得不是很合适。后面会讲到,中文含义,更接近于“块,数据块”。
Bank的详细含义见后面的解释。
而关于row行和column列,很常见和很好理解,就不多说了。
2. SDRAM的物理组织结构
说明问题之前,还要简单解释一下,内存SDRAM的物理结构:
![【详解】SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column) - carifan - work and job 【详解】SDRAM的地址映射方式BRC(Bank Row Column)和RBC(Row Bank Column) - carifan - work and job](http://image55.360doc.com/DownloadImg/2012/09/1318/26811714_1.jpg)
SDRAM物理上,最小的单位,叫做一个cell单元,用于存储一个数据单位,可以是4-16bits。
而更大一点的单位,就是对应的row或column了,见上图,这个很好理解,不多解释。
然后多少行,多少列,共同组成了一个Bank,中文的含义,很像一个块,一个数据块。
根据上图中的说明可知:
常见的Bank,有4-8个;
而每个Bank中,一般包含16K的row;
而每个行中,一般又包含1024=1K的column;
而每个column中,即是我们所说的最小的单位cell了,是4-16bits。
3. 地址映射
此处所谓的地址映射,简单说就是,将一个内存地址,转换对应到相应的物理存储单元,这个过程,就叫做映射。
4. BRC和RBC的详细含义
了解了前面的知识后,再来举例说明所谓的BRC和RBC的地址映射方式。
比如有个SDRAM,对应的参数是:
512Mb (32Mx16), 4 banks(用2bit表示), row length = 13 bit, column length = 10bit
然后有个内存地址0×5010 2040,这样的地址,其实最高位的0×50是对应着SDRAM地址的最开始,所以,此处可以忽略,实际所表示的地址,就是0×0080 2040.
而这个地址,是如何映射到SDRAM的物理的Bank,Row和Column上的具体哪个位置,BRC还是RBC,是完全不同的,详见下表:
表格 1 内存地址0×0080 2040所对应的BRC和RBC的映射
| BRC (Bank-Row-Column) | ||||
|
| 2bit的Bank | 13bit的row | 10bit的column | |
|
| BB | R RRRR RRRR RRRR | CC CCCC CCCC | |
| Bit[31:25] | bit[24:23] | Bit[22:10] | Bit[9:0] | |
0×00802040 | 0000 000 | 0 1 | 000 0000 0010 00 | 00 0100 0000 | |
对应的物理单位的位置 |
| Bank=0×01 | Row=0×08 | Column=0×40 | |
Bank1的第8行的第0×40列 | |||||
| |||||
| RBC (Row- Bank-Column) | ||||
|
| 13bit的row | 2bit的Bank | 10bit的column | |
|
| R RRRR RRRR RRRR | BB | CC CCCC CCCC | |
| Bit[31:25] | Bit[24:12] | bit[11:10] | Bit[9:0] | |
0×00802040 | 0000 000 | 0 1000 0000 0010 | 00 | 00 0100 0000 | |
对应的物理单位的位置 |
| Row=0×802 | Bank=0×0 | Column=0×40=64 | |
Bank0的第0×802行的0×40列 | |||||
从上表中,很容易看懂,一个地址,是如何根据是RBC还是BRC,然后映射到了对应的物理存储单元上的,而BRC,即Bank是最高位,然后接着是Row行地址,最后是Column列地址;而RBC,即最开始的是Row行地址,接着才是Bank地址,最后当然也是Column列地址。
此两种不同的地址映射方式,使得同一个地址,被翻译成对应的不同的物理单元,因此,在SDRAM初始化,配置地址映射的时候,一定要设置对了才可以正常工作。
【如何确定将SDRAM配置为BRC还是RBC】
对于软件开发者,在拿到了一个SDRAM之后,在写SDRAM初始化的代码,去配置地址映射的时候,到底是该配置成BRC还是RBC呢。
此地址映射方式,到底是由什么决定的?
我最开始的理解,以为是SDRAM硬件本身,决定了其本身是BRC还是RBC呢,但是后来看了些资料,发现好像此理解,也不完全对。
找了资料后,也还是没完全懂,只是了解了一些:
不同的地址映射方式,导致访问某个row的时候,该row是否是有效的,会有所不同,因此会导致功耗和访问延迟,差别很大。
常见的地址映射方式有三种:
B-R-C (Bank, Row, Column)
R-B-C (Row, Bank, Column)
B-RL-CL-RH-CH (Bank, Row Low, Column Low, Row High, Column High)
BRC这种映射方式,用的最多。其优点是,功耗低;
RBC的优点是适合数据流方式去访问数据,性能好;
B-RL-CL-RH-CH适合存储视频,图像等数据,高性能。
而至于将某个SDRAM设置为BRC还是RBC,好像是SDRAM的controller来决定的。
而由于BRC和RBC,分别有不同的特点,所以,对于如何设置此地址映射方式,就是:
【总结】
如果是low-power的SDRAM(功耗相对低的,1.8V的低电压),然后就选BRC;
如果是High performance的SDRAM(高性能的,当然功耗相对高些,3.3V或2.5V的正常电压的),就选RBC。
【引用】
1. Using SDR/DDR SDRAM memories with LPC32xx
http://www.nxp.com/documents/application_note/AN10935.pdf
2. MEMORY CONTROLLER ADDRESS MAPPING SCHEME
http://www.freepatentsonline.com/y2009/0319718.html
3. 有没有人用过ddr内存K4H511638G,改如何配置参数?
http://topic.csdn.net/u/20101016/15/1ef008c1-ccc2-4243-948e-5ee1300d2ab5.html