天天看点

DRAM 内存结构

作者:直爽东北人在广东

工作心得体会

---DRAM的内存结构学习

日常研发工作中,如果遇到平台切换经常会遇到底层的移植,作为一名终端工程师会不可避免的遇到比如底层驱动、uboot移植等的开发过程,之前的研发工作一直围绕在应用业务逻辑层面,相比较与单纯的裸机开发,终端带操作系统的设备软件移植涉及的方面相当之多,从对编译构建本身的流程了解,到常用buildroot构建体系框架的掌握,再到系统的多级引导启动,甚至到对硬件时序如dram的精准掌控,这些困难让自己对于linux操作系统下的移植工作一直有望而生畏的情绪。但不积跬步无以至千里,没有开始就永远没有成功的可能,看似深奥复杂的理论终归到底是为了我们更好认识世界,所以经历一番心理建设后,开始逐渐学习相应知识,并有一定的心得体会,在此分享大家,以便共同进步。

大家可能都没有太关注到的dram时序原理,uboot的一个重要用途就是进行内存的初始化,然后将内核搬移到dram中进行运行,所以在uboot中做dram初始化控制就是必须了解掌握的内容。说实话,关于dram的介绍资料是比较少的,初学者看到datasheet也大都如看天书一般,很多基础的概念都不了解,这样是无法进行后续的uboot移植工作的。

Dram的组成结构,嵌入式中dram的组成结构和pc机器中的类似。Dram中最小的物理存储单位是一个电容,充电标识1,放电后标识0。由若干微小的电容构成的矩阵称之为memory array。Array 外接行解码器、列解码器、感应放大器,以及最终的数据缓存。当读取内存时候,地址信号被解码器解码,导致行(world line)选通,此时电容内存储的0/1数据被存储到行缓存中,随后列地址被解码,最终确定哪一位被读取,所以一个地址只能从一个array单元中获取一个bit位。Array结构的示意图如下:

DRAM 内存结构

Array结构示意图

当多个array并联(地址线共用,数据缓存单独)在一起后就可以实现一个地址读取8bits,也就是一个字节的数据,这样就出现了bank的概念。Bank的示意图如下:

DRAM 内存结构

Bank逻辑示意图

Bank的x2,x4,x8种类的,x8比较常见,也就是上面所说的一次可读取一个字节的存储结构。多个bank组合构成一个memory device,pc机内存插槽上的内存条上有一块一块的芯片就是一个memory device(后简称MD),多个MD则构成一个rank。至此一个完整的内存结构节可以按照下图进行描述。由示意图中可看出,多个bank共用I/Os,内部的地址线相互独立,在mux的作用下,MemoryDevice 公用地址线,控制总线,一个MD可读取出一个字节。所以当发送地址后,每个memoryDevice都有效,都会有一个字节(8I/O为例)输出。值得注意的是,memoryDevice中bank的选通同样是有控制信号的。

DRAM 内存结构

Rank结构示意图

DRAM 内存结构

内存整体结构示意图

内存插条上由多个memory device 排列构成一个rank,内存插条又分单面rank和双面rank,rank上的device地址线、控制线共用,数据线相互独立,这样由图中的示例就可以看出接在memory controller上的rank可以一次被读取4*8=32bits=4bytes。而多个rank之间的逻辑也是地址线、控制线共用,由片选决定读取哪个rank中的数据。

继续阅读