提到内存,相信大家都不陌生,几乎所有的计算机系统中都有它的身影,按照内存的工作原理
划分,可将内存分为 RAM 和 ROM 两大类。
RAM(Random Access Memory)存储器又称随机存取存储器,存储的内容可通过指令随机读
写访问,RAM 中的数据在掉电时会丢失;
ROM(Read Only Memory)存储器又称只读存储器,只能从中读取信息而不能任意写信息。ROM 具
有掉电后数据可保持不变的优点。
RAM 和 ROM 两大类下面又可分很多小类,如下图所示:
♦SRAM 简介 SRAM 即 Static RAM,也就是静态随机存取存储器,按照制造工艺可分为 NMOS
SRAM、CMOS SRAM 和双极型 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 即 Dynamic RAM,动态随机存取存储器的意思,DRAM 的种类有很多,常用的有:
1).SDRAM:Synchronous Dynamic Random Access Memory,即同步动态随机存取存储器。“同步”
是指其时钟频率与 CPU 前端总线的系统时钟频率相同,并且内部命令的发送与数据的传输都以此频
率为基准;“动态”是指存储阵列需要不断的刷新来保证所存储数据不丢失;“随机”是指数据不
是线性一次存储,而是自由指定地址进行数据的读写。
2).DDR SDRAM:Double Data Rate SDRAM,即双倍速率 SDRAM,普通 SDRAM 只在时钟信号的
上升沿采样数据,而 DDR SDRAM 在时钟信号的上升沿和下降沿都采样数据,这样,在时钟频率不变
的情况下,DDR SDRAM 的数据存取速度提高了一倍,所以叫双倍速率 SDRAM。
DDR SDRAM 最早由三星公司于 1996 年提出,之后与日本电气、三菱、富士通、东芝、日立、
TI、现代等 8 家公司协议制定规格,并得到 AMD、VIA、SIS 等公司的支持,并最终于 2005 年形成
JEDEC 标准 ESD79E。(JEDEC 即 Joint Electron Device Engineering Council,电子器件工程联合
理事会)
DDR SDRAM 在其短暂的发展史中,先后经历了 DDR SDRAM(也叫 DDR1 SDRAM)、DDR2 SDRAM、DDR3
SDRAM 三个阶段,技术越来越先进。上面是 DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM 三种内存芯片的
参数对比表:
3).RDRAM:Rambus DRAM,是美国的 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 进行读/写操作时,行
选信号与列选信号将使存储电容与外界的传输电路导通,从而可进行放电(读取)或充电(写入)。目
前的主流设计中,刷新放大器功能已经被并入读出放大器(Sense Amplifier,简称 S-AMP)中。
在《内存器件介绍之 RAM 篇(一)》中我们介绍了 SRAM 的相关知识以及 DRAM 的部分知识,下面继续
我们的 DRAM 探索之旅。
♦DRAM 的物理 BANK 与逻辑 BANK 我们在进行内存设计选型时会有两种选择:内存颗粒和内存条。
1).内存颗粒其实也就是内存芯片,数据位宽通常是 8bit,最高的也就是 16bit。
2).内存条就是将多颗内存芯片放在一起组成通用标准模块,并在模块中加入管理信号(一般为 I2C
总线,用来读取厂家信息),然后从标准标准接口引出(就是我们常说的金手指)。
常见的内存条有 SIMM 和 DIMM 两种。
SIMM 是 Single In-line Memory Module 缩写,即单列内存模组,它与主板插槽的接口只有一
列引脚(虽然两侧都有金手指),72 个 PIN,数据位宽为 32bit。
DIMM 是 Double In-line Memory Module 的缩写,即双列内存模组。所谓双列是指模组电路板
与主板插槽的接口有两列引脚,两侧的金手指各对应一列引脚。DIMM 内存条一共有 168 个 PIN,数
据位宽为 64bit。
传统内存系统为了保证 CPU 的正常工作,必须一次传输完 CPU 在一个传输周期内所需的数据,
而 CPU 在一个传输周期能接受的数据容量就是 CPU 总线的位宽。这个位宽就是物理 BANK(Physical
Bank,简称 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(Logical Bank,简称 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).Command INHIBIT(初始化);2).No Operation(无动作);3).Active(使指定 L-Bank 中的指
定行有效);4).Read(从指定 L-Bank 中的指定列开始读取数据);5).Write(从指定 L-Bank 中的指
定列开始写入数据);6).Burst Terminate(突发传输终止);7).Precharge(预充电命令,关闭指定
或全部 L-Bank 中的工作行);8).Auto Refresh(自动刷新);9).Load Mode Register(模式寄存器
加载);10).写允许/输出允许; 11).写禁止/输出屏蔽;
♦内存的初始化 一旦 VDD、VDDQ 被同时家电,并且时钟已经稳定,SDRAM 需要一个 200us 的延
迟,在这个时间段中,Command INHIBIT 和 No Operation 指令有效,这个过程实际上就是内存的自
检过程,一旦这个过程通过后,一个 Precharge 命令就会生效,在这个命令周期中,内存会处于 Idle
状态。随后执行几个 Auto Refresh 周期,之后 SDRAM 为模式寄存器编程做准备。整个初始化过程
如下图所示。
模式寄存器设置(MRS)是在 CPU 的 BIOS 控制下进行的。SDRAM 芯片内部有一个逻辑控制单元,
这个控制单元的相关控制参数是由 MR 提供的,SDRAM 芯片每次进行初始化时都要将重新写 MR 寄存
器。MR 中设置了 SDRAM 的运行模式:包括突发长度(BL)、突发类型(Burst Type)、CAS 延迟(CAS
Latency)、运行方式(Operating Mode)和写入突发模式。
MR 通过 Load Mode Register 命令进行编程。MR 中操作位 M0-M11 分别与内存芯片的地址线 A0-A11
对应。M0-M2 用来设置 BL,M3 设置突发类型,M4-M6 设置 CAS 延迟,A7-A11 设置操作模式。如上图
所示。
♦行有效 初始化完成后,要想对一个 L-Bank 中的阵列进行寻址,首先要确定行(Row),使之
处于活动状态(Active),然后再确定列。虽然之前要进行片选和 L-Bank 的地址,但它们与行有效
可以同时进行。通一个 L-Bank 中,两个相邻的 Active 命令之间的时间间隔被定义为 tRC,在不同
L-Bank 中,执行两个 Active 命令之间的时间间隔被定义为 tRRD(RAS to RAS Delay)。行有效时序
图如下所示。
♦列读写 行地址确定之后,就要对列地址进行寻址了。在 SDRAM 中,行地址与列地址线是共用
的,仍然是 A0-A11。读/写命令是通过 WE#信号的状态去区分的,当 WE#为低电平有效时是写命令,
为高电平无效时是读命令。列寻址信号与读写命令是同时发出的。虽然列地址线与行寻址共用,但
是 CAS(Column Address Strobe,列地址选通脉冲)信号则可以区分开行与列寻址的不同。列读写时
序如图所示。
在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定位为 tRCD,即 RAS to CAS
Delay(RAS 至 CAS 延迟),大家也可以理解为行选通周期。tRCD 时 SDRAM 的一个冲要时序参数,可
以通过主板 BIOS 经过北桥芯片进行调整,但不能超过厂商的预定范围。广义的 tRCD 以时钟周期为
单位,比如 tRCD=2,就代表延迟周期为两个时钟周期。
在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过 I/O 通道输出到内存总
线上了。但是在 CAS 发出之后,仍要经过一定的时间才能有数据输出,从 CAS 与读取命令发出到第