提到内存,相信大家都不陌生,几乎所有的计算机系统中都有它的身影,按照内存的工作原理划分,可将内存分为RAM和ROM两大类。RAM(RandomAccessMemory)存储器又称随机存取存储器,存储的内容可通过指令随机读写访问,RAM中的数据在掉电时会丢失;ROM(ReadOnlyMemory)存储器又称只读存储器,只能从中读取信息而不能任意写信息。ROM具有掉电后数据可保持不变的优点。RAM和ROM两大类下面又可分很多小类,如下图所示:♦SRAM简介SRAM即StaticRAM,也就是静态随机存取存储器,按照制造工艺可分为NMOSSRAM、CMOSSRAM和双极型SRAM(用的是TFT)。SRAM的基本存储单元是数字锁存器,只要系统不掉电,它就会无限期地保持记忆状态。掉电时,存储数据会丢失。并且SRAM的行列地址线是分开的(DRAM的行列地址线是复用的)。SRAM地特点是读写速度极快,在快速读取和刷新时能够保持数据地完整性,并且非常省电。所以在一些高速和高可靠性要求电路中,基本上是SRAM地天下,如CPU的Cache。但是SRAM的存储单元电路结构非常复杂,它内部采用的是双稳态电路的形式来存储数据,制作一个bit存储位通常需要6个MOS管(4个MOS管组成两个交叉耦合反相器,用来锁存数据,另外2个用于对读写操作过程的控制)。由于SRAM的复杂电路结构,使得成本要比DRAM高很多,而且其集成度低,很难做成大容量,一般只有几十KByte到几百KByte的容量,最大也就几MByte。上图为6个NMOS构成的基本SRAM存储单元,Xi和Yj为字线;I/O为数据输入/输出端;R/W为读/写控制端。当R/W=0时,进行写操作;当R/W=1时,进行读操作。图中红色虚线框中的T1、T2、T3、T4、T5、T6六个NMOS管构成一个基本的存储单元。T1、T3和T2、T4两个反相器交叉耦合构成触发器。电路采用二元寻址,当字线Xi和Yj均为高电平时,T5-T8均导通,则该单元被选中,若此时R/W为1的读操作,三态门G1、G2关闭,G3打开,存储的数据从数据线D,经过G3,然后从I/O输出。若R/W为0的写操作,则G1、G2打开,G3关闭,I/O上的数据经G1、G2写入存储单元。下图为32KByte容量的SRAM结构示意图,该SRAM有8位行地址,译码后生成256根行地址线;列地址线为7位,译码后生成128根列地址线。对SRAM进行读操作时,OE#和CS#为低电平,WE#为高电平,G1输出低电平将输入控缓冲器关闭,G2输出高电平将输出缓冲器打开,通过行列地址线选中的存储单元数据经I/O和输出缓冲器,最后从I/O[0:7]输出;写操作时,WE#和CS#为低电平,OE#为高电平,G1输出高电平将输入缓冲器打开,G2输出低电平将输出缓冲器关闭,I/O[0:7]上的输出经输出缓冲器和内部I/O总线,最后写入行列地址选中的存储空间中。♦DRAM介绍DRAM即DynamicRAM,动态随机存取存储器的意思,DRAM的种类有很多,常用的有:1).SDRAM:SynchronousDynamicRandomAccessMemory,即同步动态随机存取存储器。“同步”是指其时钟频率与CPU前端总线的系统时钟频率相同,并且内部命令的发送与数据的传输都以此频率为基准;“动态”是指存储阵列需要不断的刷新来保证所存储数据不丢失;“随机”是指数据不是线性一次存储,而是自由指定地址进行数据的读写。2).DDRSDRAM:DoubleDataRateSDRAM,即双倍速率SDRAM,普通SDRAM只在时钟信号的上升沿采样数据,而DDRSDRAM在时钟信号的上升沿和下降沿都采样数据,这样,在时钟频率不变的情况下,DDRSDRAM的数据存取速度提高了一倍,所以叫双倍速率SDRAM。DDRSDRAM最早由三星公司于1996年提出,之后与日本电气、三菱、富士通、东芝、日立、TI、现代等8家公司协议制定规格,并得到AMD、VIA、SIS等公司的支持,并最终于2005年形成JEDEC标准ESD79E。(JEDEC即JointElectronDeviceEngineeringCouncil,电子器件工程联合理事会)DDRSDRAM在其短暂的发展史中,先后经历了DDRSDRAM(也叫DDR1SDRAM)、DDR2SDRAM、DDR3SDRAM三个阶段,技术越来越先进。上面是DDRSDRAM、DDR2SDRAM、DDR3SDRAM三种内存芯片的参数对比表:3).RDRAM:RambusDRAM,是美国的RAMBUS公司开发的一种内存。与DDR和SDRAM不同,它采用了串行的数据传输模式。RDRAM的数据存储位宽是16位,远低于DDR和SDRAM的64位。但在频率方面则远远高于前者,可以达到400MHz乃至更高。同样也是在一个时钟周期内传输两次次数据,能够在时钟的上升期和下降期各传输一次数据,内存带宽能达到1.6Gbyte/s。普通的DRAM行缓冲器的信息在写回存储器后便不再保留,而RDRAM则具有继续保持这一信息的特性,于是在进行存储器访问时,如行缓冲器中已经有目标数据,则可利用,因而实现了高速访问。另外其可把数据集中起来以分组的形式传送,所以只要最初用24个时钟,以后便可每1时钟读出1个字节。一次访问所能读出的数据长度可以达到256字节。下图为SDRAM与RDRAM系统结构对比。DRAM的存储单元结构与SRAM的锁存器存储结构不同,DRAM是利用电容来存储数据信息的,电容中有电荷代表逻辑“1”,没有电荷代表逻辑“0”,如下图所示。DRAM进行读/写操作时,行选信号与列选信号将使存储电容与外界的传输电路导通,从而可进行放电(读取)或充电(写入)。目前的主流设计中,刷新放大器功能已经被并入读出放大器(SenseAmplifier,简称S-AMP)中。在《内存器件介绍之RAM篇(一)》中我们介绍了SRAM的相关知识以及DRAM的部分知识,下面继续我们的DRAM探索之旅。♦DRAM的物理BANK与逻辑BANK我们在进行内存设计选型时会有两种选择:内存颗粒和内存条。1).内存颗粒其实也就是内存芯片,数据位宽通常是8bit,最高的也就是16bit。2).内存条就是将多颗内存芯片放在一起组成通用标准模块,并在模块中加入管理信号(一般为I2C总线,用来读取厂家信息),然后从标准标准接口引出(就是我们常说的金手指)。常见的内存条有SIMM和DIMM两种。SIMM是SingleIn-lineMemoryModule缩写,即单列内存模组,它与主板插槽的接口只有一列引脚(虽然两侧都有金手指),72个PIN,数据位宽为32bit。DIMM是DoubleIn-lineMemoryModule的缩写,即双列内存模组。所谓双列是指模组电路板与主板插槽的接口有两列引脚,两侧的金手指各对应一列引脚。DIMM内存条一共有168个PIN,数据位宽为64bit。传统内存系统为了保证CPU的正常工作,必须一次传输完CPU在一个传输周期内所需的数据,而CPU在一个传输周期能接受的数据容量就是CPU总线的位宽。这个位宽就是物理BANK(PhysicalBank,简称P-Bank)位宽。如32位的CPU与内存进行数据交换时,一个时钟周期内必须是32bit,要是用普通8bit位宽的内存颗粒的话,就需要4片并联起来才能满足要求。记得Pentium系列CPU刚上市时,需要在主板上插两条SIMM才能使CPU正常工作,这是因为Pentium系列CPU是64位的,而SIMM只能提供32bit位宽,所以必须要用两条并联起来才能满足其64bit的位宽要求。直到后来64bit位宽的DIMM上市后,才可以使用一条内存配合CPU正常工作。早期的内存条,无论是SIMM,还是DIMM,都只有一个P-Bank。随着计算机应用的发展,一个系统只有一个P-Bank已经不能满足容量的需求。所以就出现了支持多个P-Bank的内存条,一次选择一个P-Bank工作,这就有了内存条支持多少个物理BANK的说法(Intel将P-Bank称为Row,比如845G内存条宣称支持4个Row,其实就是支持4个P-Bank,另外,在一些文档中,也把P-Bank称为Rank)。DRAM的逻辑BANK概念是针对内存颗粒内部的。大家都知道DRAM内部的存储单元是以阵列形式排列的。如下图所示。行列地址总线分别经过行列地址译码器译码后分别指向一行和一列,行列重叠的单元就是我们所寻找的存储单元,这就是内存芯片寻址的基本原理。对于内存颗粒来说,这个阵列就是逻辑Bank(LogicalBank,简称L-Bank)。但是,在实际应用中,由于技术、成本等原因,不可能只做一个全容量的L-BANK,而且最重要的是,由于DRAM的工作原理限制,单一的L-Bank将会造成严重的寻址冲突,大幅降低内存效率。所以人们在DRAM内部分割成多个L-Bank,每个L-Bank形状相同,彼此独立,可以独立工作。早期的DRAM芯片内部分为2个L-Bank,后来是4个,DDR3内存芯片为8个。在进行寻址时需要先确定是哪个L-Bank,然后再在这个选定的L-Bank中选择相应的行与列进行寻址。对内存的访问,一次只能是一个L-Bank,而每次与CPU交换的数据就是L-Bank存储阵列中一个“存储单元”的容量。SDRAM内存芯片一次传输的数据量就是芯片的位宽,那么这个存储单元的容量就是芯片的位宽(也是L-Bank的位宽)。上图为4BANK内存颗粒内部结构示意图。内存芯片容量的计算方法为:存储单元数量=行数×列数(得到一个L-Bank的存储单元数量)×L-Bank的数量。在很多内存产品介绍文档中,都会用M×W的方式来表示芯片的容量。M是该芯片中存储单元的总数,单位是兆,W代表每个存储单元的容量,也就是SDRAM芯片的位宽(Width),单位是bit。计算出来的芯片容量也是以bit为单位,但用户可以采用除以8的方法换算为字节(Byt)。《内存器件介绍之RAM篇(二)》中我们介绍了DRAM逻辑BANK和物理BANK以及容量的计算方法,下面我们来学习下SDRAM芯片的初始化及读写时序。针对内存的操作指令有如下几种:1).CommandINHIBIT(初始化);2).NoOperation(无动作);3).Active(使指定L-Bank中的指定行有效);4).Read(从指定L-Bank中的指定列开始读取数据);5).Write(从指定L-Bank中的指定列开始写入数据);6).BurstTerminate(突发传输终止);7).Precharge(预充电命令,关闭指定或全部L-Bank中的工作行);8).AutoRefresh(自动刷新);9).LoadModeRegister(模式寄存器加载);10).写允许/输出允许;11).写禁止/输出屏蔽;♦内存的初始化一旦VDD、VDDQ被同时家电,并且时钟已经稳定,SDRAM需要一个200us的延迟,在这个时间段中,CommandINHIBIT和NoOperation指令有效,这个过程实际上就是内存的自检过程,一旦这个过程通过后,一个Precharge命令就会生效,在这个命令周期中,内存会处于Idle状态。随后执行几个AutoRefresh周期,之后SDRAM为模式寄存器编程做准备。整个初始化过程如下图所示。模式寄存器设置(MRS)是在CPU的BIOS控制下进行的。SDRAM芯片内部有一个逻辑控制单元,这个控制单元的相关控制参数是由MR提供的,SDRAM芯片每次进行初始化时都要将重新写MR寄存器。MR中设置了SDRAM的运行模式:包括突发长度(BL)、突发类型(BurstType)、CAS延迟(CASLatency)、运行方式(OperatingMode)和写入突发模式。MR通过LoadModeRegister命令进行编程。MR中操作位M0-M11分别与内存芯片的地址线A0-A11对应。M0-M2用来设置BL,M3设置突发类型,M4-M6设置CAS延迟,A7-A11设置操作模式。如上图所示