SDRAM/DDR是怎么寻址的?
为了读取特定单元格的数据,在寻址时要首先确定是哪一个bank,然后在这个选定的bank中进行行列的寻址。在实际工作中,bank的地址与相应的行地址是同时发出的,此时这个命令称之为"行有效"或者“行激活”。在此之后,发送列地址寻址命令和具体的操作命令(读或写),这两个命令也是同时发送的。行列地址是可以复用的,一般来说DDR芯片的地址线为A0~A15,低地址线会被行列复用。以K4B4G1646B 4Gbit 256MB x 16bit内存芯片为例,A0~A14用做行地址,A0~A9用做列地址,这款芯片同时含有B0~B2用来选择bank。
在实际工作中,Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=3,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,DDR3-800,tRCD=3,代表30ns的延迟。 图中显示的是tRCD=3 接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的 CL
下面来看一个具体例子。该例子中,用两个16bit的DDR3内存拼成了一个32bit的DDR3.每块16bit DDR3的大小为512M Bytes.看看硬件上连接,我们这儿只关心地址线和数据线,CS, CK, CKE, CAS, RAS等暂时不考虑。第一片16bit DDR3的BA0, BA1, BA2连接到了CPU的BA0, BA1, BA2。第二片16bit DDR3的BA0, BA1, BA2也连接到了CPU的BA0, BA1, BA2。第一片16bit DDR3的A0~A14连接到了CPU的A0~A14。第二片16bit DDR3的A0~A14连接到了CPU的A0~A14。第一片16bit DDR3的D0~D15连接到了CPU的D0~D15。第二片16bit DDR3的D0~D15连接到了CPU的D16~D31。
分析下该实例。bank address有三个bit,所以单个16bit DDR3内部有8个bank.表示行的有A0~A14,共15个bit,说明一个bank中有2^15个行。表示列的有A0~A9,共10个bit,说明一个bank中有2^10个行。来看看单块16bit DDR3容量:2^3*2^15*2^10=2^28=256M我们的内存是512M,到这儿怎么变成256M了?被骗了?呵呵,当然没有。忘了我们前面一直提到的16bit。16bit是2个byte对吧。访问一个地址,内存认为是访问16bit的数据,也就是两个字节的数据。256M个地址,也就是对应512M的数据了。真相大白。卖内存的没骗俺。
再来看看两个16bit是如何组成一个32bit的。有一个概念一定要清楚,这儿所说的两个16bit组成一个32bit,指的是数据,与地址没有关系。我开始这一块没搞清楚,一直认为是两个16bit的地址组成了一个32bit的地址。然后高位地址,地位地址,七七八八。。。之后没一点头绪。将16bit/32bit指的是数据宽度之后,就非常明了了。每一块16bit DDR3中有8个bank,2^15个row,2^10个column。也就是有256M个地址。看前面的连线可知,两块16bit DDR3的BA0~BA2和D0~D14其实是并行连接到CPU。也就是说,CPU其实认为只有一块内存,访问的时候按照BA0~BA2和D0~D14给出地址。两块16bit DDR3都收到了该地址。它们是怎么响应的呢?两块内存都是16bit,它们收到地址之后,给出的反应是要么将给定地址上2个字节送到数据线上,要么是将数据线上的两个字节写入到指定的地址。再看数据线的连接,第一片的D0~D15连接到了CPU的D0~D15,第二片的D0~D15连接到了CPU的D16~D31。CPU认为自己访问的是一块32bit的内存,所以CPU每给出一个地址,将访问4个字节的数据,读取/写入。这4字节数据对应到CPU的D0~D31,又分别被连接到两片内存的D0~D15,这样一个32bit就被拆成了两个16bit.反过来,也就是两个16bit组成了一个32bit.CPU访问的内存地址有256M个,每访问一个地址,将访问4个字节,这样CPU能访问的内存即为1G.