今天学习嵌入式到了存储器外设这一块,感觉SDRAM的访问是一个重点,而它的访问并不复杂,只是工序较多。
在读到BANK6以32位的宽度外接SDRAM时,我感觉很奇怪,怎么就以32位外接去了呢?为什么呢,为了解决这一问题,特意网上找了一下资料:(自己做了笔记修改)
来自:我爱研发网(52RD.com) - R&D大本营
SDRAM的寻址知识及重要的参数 详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_hndeng06_11206.html
在嵌入式行业中,经常会碰到有人问如果将开发板上32M的SDRAM换成64M的SDRAM硬件需不需要改动。答案是:不需什么改动。由于当时刚进入这个行业,对这个答案一直很迷惑,
板上用的是现代的sdram芯片4M×16b×4Bank,即32MB,按理说应该有25根地址线,(个人补充数据容量和地址线的关系:4M×16b×4Bank=32MB=25*220*8bit,而存储空间里面一个地址即占8位,所以即有5+20=25条地址线)但芯片上只提供了13根地址线,2根bank选择线(BA0,BA1),两个片选信号,这怎么寻址啊?
今天碰巧又碰到这个问题,俗话说事不过三,心一横,今天非把这个问题搞明白不可。功夫不负有心人,终于参考网上的一些SDRAM的资料把问题砌底搞明白了,现分享如下:
SDRAM的究竟是怎么寻址的?
SDRAM的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格。和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),我们就可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。对于内存,这个单元格可称为存储单元,那么这个表格(存储阵列)叫什么呢?它就是逻辑Bank(Logical Bank,下文简称L-Bank)。
SDRAM内部L-Bank示意图,这是一个8X8的阵列,B代表L-Bank地址编号,C代表列地址编号,R代表行地址编号。如果寻址命令是B1、R2、C6,就能确定地址是图中红格的位置
目前的内存芯片基本上都是4个L-Bank设计,也就是说一共有4个这样的“表格”。寻址的流程也就是——先指定L-Bank地址,再指定行地址,然后指列地址最终的确寻址单元。
---------------------------下面的内容较为复杂,而且自己是为了弄清存储空间读取而来,所以分割线内这段先略掉---------------------------------------------------
在实际工作中,L-Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行有效”或“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),大家也可以理解为行选通周期。tRCD是SDRAM的一个重要时序参数,可以通过主板BIOS经过北桥芯片进行调整。广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于PC100 SDRAM(时钟频率等同于DDR-200),tRCD=2,代表20ns的延迟,对于PC133(时钟频率等于DDR-266)则为15ns。
图中显示的是tRCD=3
接下来,相关的列地址被选中之后,将会触发数据传输,但从存储单元中输出到真正出现在内存芯片的 I/O 接口之间还需要一定的时间(数据触发本身就有延迟,而且还需要进行信号放大),这段时间就是非常著名的 CL(CAS Latency,列地址脉冲选通潜伏期)。CL 的数值与 tRCD 一样,以时钟周期数表示。如 DDR-400,时钟频率为 200MHz,时钟周期为 5ns,那么 CL=2 就意味着 10ns 的潜伏期。不过,CL 只是针对读取操作,对于 SDRAM,写入是没有潜伏期的,对于 DDR SDRAM,写入潜伏期在 0.75 至 1.25 个时针周期之间。
图中标准CL=2,tAC是有关内部信号处理的周期,可以不用关心
目前内存的读写基本都是连续的,因为与CPU交换的数据量以一个Cache Line(即CPU内Cache的存储单位)的容量为准,一般为64字节。而现有的P-Bank位宽为8字节,那么就要一次连续传输8次,这就涉及到我们也经常能遇到的突发传输的概念。突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输的周期数就是突发长度(Burst Lengths,简称BL)。
在进行突发传输时,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址(SDRAM与DDR SDRAM的突发传输对列寻址的操作数量有所不同,在此不再细说)。这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。
突发连续读取模式:只要指定起始列地址与突发长度,后续的寻址与数据的读取自动进行,而只要控制好两段突发读取命令的间隔周期(与BL相同)即可做到连续的突发传输。
在数据读取完之后,为了腾出读出放大器以供同一L-Bank内其他行的寻址并传输数据,内存芯片将进行预充电的操作来关闭当前工作行。还是以上面那个L-Bank示意图为例。当前寻址的存储单元是B1、R2、C6。如果接下来的寻址命令是B1、R2、C4,则不用预充电,因为读出放大器正在为这一行服务。但如果地址命令是B1、R4、C4,由于是同一L-Bank的不同行,那么就必须要先把R2关闭,才能对R4寻址。从开始关闭现有的工作行,到可以打开新的工作行之间的间隔就是tRP(Row Precharge command Period,行预充电有效周期),单位也是时钟周期数。
本图为一个完整的从行寻址到行关闭的时序图,图中所表示的tRCD=2、CL=2、tRP=2
-------------------------------------------------我是愉快的分割线---------------------------------------------------------------------------------------------------------------------------------------------------
实例分析:
有了以上知识后,就很容易理解了,现就以HY57V561620片子说明吧。
从芯片的数据手册中可以得知:4M×16b×4Bank,即共32MB,提供了13根地址线(行地址线RA0-RA12,列地址线CA0-CA8行列地址线共用),2根bank选择线(BA0,BA1)。
2根bank选择线(BA0,BA1)即可以选4个Bank,即我们可以分析其中一个Bank就可。
一个Bank是4Mx16bit,需23根地址线。按照上面寻址方式即:1个Bank的空间=行地址能访问的空间 *列地址能访问的空间。
1个Bank的大小=213 x 29= 222。
只有22根,怎么还差一根。J (呵呵)
这是因为芯片是以半字为一个存储单元的。也就是一次两个字,所以222 x 2=223.即可访遍整个Bank.
(感觉上面这句是有错误的,个人认为应该如下描述:因为芯片的存储空间是以一个字节为存储单元的,而这时候就牵扯到了位宽接入问题,重点来了,既然这里地址线差一根,那么一定是A0这根没有参与译码,所以接入位宽一定是16位,也就是访问一次地址线,就能访问两个8位的数据区,即2个字节,一次访问两个字节,所以222 x 2=223.即可访遍整个Bank.)
同样的,回到我最初的BANK6以32位的宽度外接SDRAM,
可以看到,韦东山老师的开发板S3C2440外接了两片并联的SDRAM,并且这个SDRAM跟上面分析的是一样的存储结构,两片加一起就是64M。
并联,所以就有16*2的32位接入。
所以,地址线不再舍弃一个A0,而是要舍弃A0和A1,就可以一次性访问32位数据啦.