第3章存储器层次结构 存储器是计算机系统的重要组成部分,主要用来存储程序和数据。存储系统指的是包括存储器以及管理存储器的软硬件和相应的设备。本章主要介绍存储器的分类、层次化结构、各种类型的存储器的基本组成和工作原理。 3.1存储器的分类 随着计算机系统结构和存储技术的发展,存储器的种类日益繁多,根据不同的特征可以对存储器进行分类。 3.1.1按存储器在计算机系统中的作用分类 1. 高速缓冲存储器 高速缓冲存储器(Cache)是位于主存和CPU之间高速且容量相对较小的存储器,用来存放当前正在执行的程序和数据,以便CPU能高速地访问它们。高速缓冲存储器的存取速度可以与CPU的速度相匹配,但是存储容量较小,价格较高。目前PC普遍使用的CPU都集成了Cache,例如Intel的i3 530集成了4MB的Cache。 2. 主存储器 主存储器简称主存,用来存放计算机运行期间所需要的程序和数据,CPU可直接随机地进行读/写访问。主存具有一定的容量,存取速度较高。由于CPU要频繁地访问主存,所以主存的性能在很大程度上影响了计算机系统的性能。 3. 辅助存储器 辅助存储器简称辅存(又称外存),用来存放当前暂不参与运行的程序和数据以及一些需要永久性保存的信息。辅存容量极大且成本很低,但存取速度较低,而且CPU不能直接访问它。辅存中的信息必须调入主存后,CPU才能使用。 3.1.2按存取方式分类 1. 随机存取存储器(Random Access Memory,RAM) 如果存储器中任何存储单元的内容都能被随机存取,且存取时间与存储单元的物理位置无关,则这种存储器称为随机存储器。RAM读/写方便,使用灵活,主要用做主存,也可用做高速缓冲存储器。 2. 只读存储器(Read Only Memory,ROM) ROM是一种对其内容只能随机读出而不能写入的存储器。这类存储器通常用来存放那些不需要改变的信息。由于信息一旦写入存储器就固定不变了,即使断电,写入的内容也不会丢失。ROM除了存放某些系统程序外,还用来存放专用的子程序,或用作函数发生器、字符发生器以及微程序控制器中的控制存储器。 3. 串行访问存储器(Serial Access Storage,SAS) 如果存储器只能按某种顺序来存取,也就是说,存取时间与存储单元的物理位置有关,则这种存储器称为串行访问存储器。串行存储器又可分为顺序存取存储器(Sequential Access Memory, SAM)和直接存取存储器(Direct Access Memory, DAM)。顺序存取存储器是完全的串行访问存储器,如磁带,信息以顺序的方式从存储介质的始端开始写入(或读出); 直接存取存储器是部分串行访问存储器,如磁盘存储器,它介于顺序存取和随机存取之间。 3.1.3按存储介质分类 1. 磁芯存储器 采用具有矩形磁滞回线的铁氧体磁性材料,利用两种不同的剩磁状态表示“1”和“0”。一颗磁芯存放一个二进制位,成千上万颗磁芯组成磁芯体。磁芯存储器的特点是信息可以长期存储,不会因断电而丢失; 但磁芯存储器的读出时破坏性读出,即不论磁芯原存的内容为“0”还是“1”,读出之后磁芯的内容一律变为“0”,因此需要再重写一次,这就额外地增加了操作时间。从20世纪50年代开始,磁芯存储器曾一度成为主存的主要存储介质,但因磁芯存储器容量小、速度慢、体积大、可靠性低,从20世纪70年代开始已被半导体存储器逐渐取代。 2. 半导体存储器 采用半导体器件制造的存储器主要有MOS型存储器和双极型(TTL电路或ECL电路)存储器两大类。MOS型存储器具有集成度高、功耗低、价格便宜、存取速度较慢等特点; 双极型存储器具有存取速度快、集成度较低、功耗较大、成本较高等特点。半导体RAM存储的信息会因为断电而丢失。 3. 磁表面存储器 在金属或塑料基体上,涂覆一层磁性材料,用磁层存储信息,常见的有磁盘、磁带等。由于它的容量大,价格低,存取速度慢,一般作为辅助存储器。 4. 光存储器 采用激光技术控制访问的存储器,一般分为只读式、一次写入式、可改写式3种,它们的存储容量很大,是目前使用非常广泛的辅助存储器。 3.1.4按信息的可保存性分类 断电后存储信息即消失的存储器,称为易失性存储器,例如,半导体RAM。断电后信息仍然保存的存储器称为非易失性存储器。例如,ROM、磁芯存储器、磁表面存储器和光存储器。 3.2存储器的层次化结构 计算机系统中存储器设计的目标之一是以较小的成本使存储器的容量尽可能大,且与CPU的速度相匹配。因此,容量、速度和价格是存储器设计时应考虑的主要因素。由于这三者间存在相互制约关系,目前在计算机系统中,采用多级存储器体系结构来解决大容量、高速度和低成本的问题。 存储器的速度、容量和位价的关系如图3.1所示,越往上层,位价比越高,速度越快。处于最上层的是寄存器,它的容量很小,访问时间是几个纳秒, 图3.1存储器的速度、容量 和位价的关系 可以满足CPU的要求。第二层是高速缓冲存储器,它的容量可以是几兆字节,访问时间是寄存器访问时间的几倍。第三层是主存,在各种不同类型的存储器中,主存是最重要的部分,因为计算机当前正在执行的程序和处理的数据都是存放在主存中的,任何程序如果要在计算机中执行,首先必须将其调入主存。通常,容量越大,速度越快的存储器给计算机带来越高的性能。主存容量一般在几十到数千兆字节之间,它的访问时间是几十纳秒。最后一层是辅存,它的容量更大,包括硬盘、软盘、光盘等,位价比较低,但是速度较慢。 为了充分发挥各种存储器的优点,通过管理软件和相应的辅助硬件把各种存储器合理地组织起来,形成一个具有层次结构的存储系统,才能满足计算机在存储容量、速度和价格等性能方面的要求。存储系统的层次结构主要有两个层次: 一个是高速缓冲存储器和主存层次; 另一个是主存和辅存层次。 高速缓冲存储器和主存层次主要解决CPU和主存速度不匹配的问题。由于CPU处理指令和数据的速度比主存读写指令和数据的速度要高一个数量级,使得CPU的能力因存储器的速度问题而受到限制。为了改进存储器的速度性能,可以采用两种方法: 一种方法是提高主存储器的速度,其技术是将主存储器划分为若干个模块,采用多模块交叉技术,实现多个模块的并行存取,从而达到提高速度的目的; 另一种方法是在CPU和主存储器之间增加高速缓冲存储器,该缓存容量小而速度快,可将主存储器中要用的指令和数据调入其中,使CPU可以与高速缓冲存储器直接交换信息。因为对速度的要求较高,所以对CPU和高速缓冲存储器之间的信息交换的控制管理由硬件来实现。 主存和辅存层次主要解决存储系统的容量问题。主存和辅存层次采用虚拟存储技术,以大容量的辅助存储器为依托,把当前要用到的或经常要用到的部分信息存放在容量小但速度较快的主存储器中,而把尚未使用或不常用到的信息存放在速度较慢但容量较大的辅助存储器中,当CPU需要用到这些信息时,再把它们从辅存中调入主存,供CPU访问。虚拟存储器的这种调度工作是由软件(操作系统)和硬件共同实现的,也就是通过软硬件结合的方法把主存和辅存统一成一个整体,构成主存辅存层次,并使得它的速度接近于主存,而程序员可使用的存储空间是一个比主存容量大得多的虚拟存储空间。 图3.2存储系统层次结构 存储系统的层次结构如图3.2所示,Cache主存层次之间的信息调度由辅助硬件完成,主存辅存层次之间的信息调度是由辅助硬件和操作系统来完成,该结构发挥了整个存储系统的最大效能,具有最佳的性价比。存储系统的工作原理是: CPU首先访问Cache,如果Cache中没有所需要的内容,则存储系统通过辅助硬件到主存中查找; 如果主存中没有CPU要访问的内容,则存储系统通过辅助硬件或软件到辅存中查找; 然后把找到的数据逐级调入到相应的存储器中。 3.3半导体随机存储器 半导体随机存储器(RAM)按存储元件在运行中能否长时间保存信息来分,有静态存储器(SRAM)和动态存储器(DRAM)两种。前者利用双稳态触发器来保存信息,只要不断电,信息就不会丢失; 动态存储器利用MOS电容存储电荷来保存信息,使用时需不断给电容充电才能使信息保持。静态存储器的集成度低,但功耗较大; 动态存储器的集成度高,功耗小,它主要用于大容量存储器。 3.3.1SRAM 1. 存储单元 图3.3是MOS静态存储器的存储单元的线路,它由6个管子组成。T1~T4组成两个反相器,两反相器是交叉耦合连接的,它们组成一个触发器。为了使触发器能成为读出和写入信息的存储单元,还需要T5,T6把它和字线、位线连接起来。T5,T6是读写操作的控制门,它们的栅极和字选择线相连。和T5,T6相连的还有两条位线,用来传送读、写信号。当单元未被选中时,字选择线保持低电平,两条位线保持高电平,T5,T6截止,触发器和位线隔开。读出操作过程如下: 图3.3MOS静态存储器的存储单元 字选择线来高电位,单元被选中。若原来单元处于1态(T1导通、T2截止),就有电流来自位线1经T5流向T1,从而在位线1上产生一个负脉冲。因T2截止,因此位线2不产生负脉冲。若触发器处于0态,即T1截止,T2导通,则与上述情况相反,在位线2将产生负脉冲。这样,可根据两条位线中哪一条有负脉冲来判断触发器的状态。写入时,只要位线1、位线2分别送高电位和低电位,或分别送低电位和高电位,便可迫使触发器状态发生变化,从而把信息写入单元。例如,位线1送低电位、位线2送高电位,当单元被选中时,位线2便通过T6向T1栅极充电,使T1导通,而T2栅极通过T5和位线1放电,使T2截止,从而单元便处于1态。只要SRAM不断电,存放在里面的数据将会一直被保存。SRAM的速度很快,一般来说访问时间是几个纳秒,因此,SRAM被广泛应用于Cache中。 2. SRAM的结构和组成 图3.4是用图3.3所示单元组成的16×1位静态存储器的结构图。16个存储单元排成4×4矩阵。写入电路和读数均经T7,T8和单元的位线1,2相连。地址码A0~A3分成两组,A0,A1和A2,A3分别驱动X译码器和Y译码器,X译码器的每个输出和一条字选择线相连,去选择存储矩阵中的一个字; Y译码器的每个输出(称为列选择线)去控制每一列单元的T7,T8管。图中字线和列线相交处的单元即为选中存储单元。当某单元被选中,字选择线把该单元的T5,T6打开,列选择线使T7,T8导通。若写允许信号WE=0,电路执行写操作,写入数据DIN经T7,T8以及T5,T6进入单元; 若WE=1电路执行读操作,单元的状态经位线1,2和T7,T8传至读放。 图3.4静态存储器结构图 图3.5所示是1K×1位静态存储器的框图。地址码分两组,A0~A3经X地址译码器和字驱动器选择32×32存储阵列的某一行,而A5~A9经Y地址译码器选择32列中的某一列读/写电路,再通过控制逻辑把读/写电路与数据输入、数据输出端(DIN,DOUT)相连。该存储器有两个控制输入端,允许写信号WE和片选信号CS。当CS=0,且WE=0时进行写操作; WE=1时进行读操作。当CS=1时不进行读/写操作。 图3.51K静态存储器框图 静态存储器包括存储体、读写电路、地址译码器和控制电路等。其中存储体是所有存储单元的集合; 地址译码电路对访存时来自地址总线的内容译码,把用二进制代码表示的地址转换成输出端的高电平,驱动相应的读写电路,以便选择所要访问的存储单元。 地址译码有线性译码和双向译码两种方式。在图3.6所示的存储单元中,每一行代表一个字,每一列对应于这个字的一个位,这种译码方式称为线性译码。在这种方式中,地址译码器只有一个,译码器的输出称为字选线,字选线选择某个字(即某个存储单元)的所有位。线性译码方式适用于小容量的存储器。 图3.7则给出了双向译码方式的SRAM存储器结构。双向译码方式适用于二维译码矩阵,它将存储器的地址分为X和Y两段,分别用水平和垂直两个译码器进行译码,每个译码器各自输出若干条选择线,每个基本的存储单元位于X和Y选择线交点,当两条选择线都处于有效电位时,该存储单元被选中。整个存储器由若干个这样的集成片组成一个立体结构,每一片的X地址和Y地址相同的位组成存储器的一个字。双向译码方式适用于大容量的存储器。 图3.6线性译码方式 图3.7双向译码方式 相比较而言,线性译码方式的优点是结构简单,缺点是所用的选择线太多,而双向译码方式就可以很好的解决这个问题。一个n位地址的存储器,如果按照线性译码方式,那么共有2n根选择线,若按照双向译码方式则每个译码器只有n/2个地址输入,2n/2个输出,于是整个存储器共有2n/2+1根选择线。例如,一个10位地址的存储器,按照线性译码方式共有1024根选择线,按照双向译码方式只需2×25=64根选择线。 3. SRAM的读/写过程 一般地,对SRAM的读操作顺序是: 先加上需要访问的地址,并在读/写端加上有效信号,等信号稳定后再加上片选信号。经过一段时间的延时,数据被读到输出端的缓冲寄存器中,至此方可撤去片选信号,然后再撤去地址和其他控制信号。读操作时序如图3.8(a)所示,其中,tR是读操作所需的最小周期,在此周期内,地址不能改变; tA是取数时间,定义为从地址线上的信号稳定到数据能从存储器读出所需的最短时间; tCO定义为从片选信号CS有效到数据能被读出所需的最短时间。 对SRAM的写操作顺序是: 先加上地址和读/写信号,同时数据信号也加到数据总线上,等信号稳定后,再加上片选信号。经过一段时间的延时,数据被写入存储器的相映单元中,至此方可撤去片选信号,然后再撤去地址和其他控制信号。写操作时序图如图3.8(b)所示,其中,tW是写操作所需的最小周期,tCW定义为片选信号CS必须有效的最短时间。 有些RAM的读/写过程与此不同,读操作的顺序是: 先加上地址和片选信号(有的片选信号是地址的一部分),再加上读/写信号(读),经过一段时间的延时,数据被读到输出端的缓冲寄存器中; 写操作的顺序是: 先加上地址、片选信号和数据信号,再加上读/写信号(写),经过一段时间的延时,数据被写入存储器的相应单元中。 图3.8典型SRAM读/写时序图 计算机实际运行时,分配给读/写操作的周期应大于上述时间,以保证操作的正确执行。 4. SRAM实例 以2114芯片的读/写周期给出SRAM的一个实例。2114是1K×4位的SRAM存储芯片,片上的4096个6管存储单元排列成64×64的矩阵。1K字对应的10根地址线中的6根用于行地址译码,4根用于列地址译码,列地址译码生成16条列选择线,每条同时连接4位。 图3.9(a)给出了2114的读周期时序,读周期与读出时间是两个不同的概念。读周期时间tRC表示存储器进行两次连续读操作必须间隔时间,它总是大于或等于读出时间。读出时间tA指给出地址后到外部数据总线上读到可靠数据,连续两次读操作必须保留间隔时间tRC。除此而外,图中tCO表示片选到数据输出延迟的时间,tCX表示片选到输出有效的时间,tOTD表示从断开片选到输出变为三态的时间,tOHA表示地址改变后的维持时间。 图3.9(b)给出了2411的写周期时序,为保证数据总线上的信息能准备无误地写入存储器,片选CS和写信号WE同时有效的时间至少为tW。WE在地址变化期间必须为高电平,只有在地址有效一段时间后,写信号WE才能有效,且WE变为高电平后一段时间,地址信号才允许改变。除tW以外,图中tDW表示写周期时间,tWR表示写恢复时间,tDTW表示从写信号有效到输出三态的时间,tDW表示数据有效时间,tDH表示写信号无效后的数据保存时间。 图3.92114的读/写周期时序 3.3.2DRAM 1. 存储单元 动态MOS存储器的存储单元有多种构成方式,其中单管结构的存储单元所占用芯片面积小,且消耗的功耗也极小,因此得到了广泛的应用,单管结构的存储单元如图3.10所示。 图3.10动态MOS存储器单管 结构的存储单元 当该存储单元未被选中时,字线是低电位的,电容C上有电荷,则该存储单元存储的信息是“1”; 反之,存储单元的信息是“0”。 读操作时,字线上是高电位,选中该存储单元,T导通。存储在电容C上的电荷通过T输出到数据线上,读出放大器电路输出。电容上有电荷表示原来存的信息是“1”,无电荷表示原来存的是“0”。写操作时,字线上送高电位,T管导通,写入信息由数据线存入电容C。 由此可见,对DRAM存储单元的读操作就是对电容C的放电过程,是破坏性读出,因此,有必要再读完以后再把原来的数据写回存储单元中,这个过程称为“再生”。事实上,为了节省芯片面积,DRAM都用小电容来存储数据,电容存放着漏电阻,因此电容中的电荷很快就会通过漏电阻放电而中和,为了长时间保存信息,就必须定时补充电荷,这就是所谓的“刷新”。其实刷新与再生是一回事,都是将电容上的信息重写一遍,只不过再生是配合读操作进行的,而刷新则是定期对存储矩阵进行扫描,扫描至哪一个单元,就将给存储单元读/写一次,所以刷新与再生的执行过程都是先读后写。 DRAM集成度高、功耗低、成本低。由于必须要进行刷新操作,所以要增加相应的电路,还需要解决读/写操作和刷新操作的时间冲突。不过这些问题现在已经很好地解决了。因此,现在的微型计算机中大都采用DRAM作为主存。 2. DRAM存储器的组成 图3.11为4M×4位的DRAM的常用结构。在图3.11中,22位的存储器地址被分为两组,每组都从这11根地址线输入,第一次选择高11位地址(行地址),第二次选择低11位地址(列地址),这种方法称为时分复用。在时分复用的情况下,行地址选通信号(RAS)和列地址选通信号(CAS)为芯片提供时序控制信号。 图3.114M×4位的DRAM 由于现在的DRAM的容量很大,需要的地址线很多,为了节省外引线,降低成本,分时复用是常用的方法。地址线的分时复用和方阵型行列结构使得每出现新一代存储器芯片。其容量就以4倍的速度增长。每增加一个专用的地址引脚,便使得行地址和列地址的寻址范围加倍,因此存储器芯片的容量以4的倍数增长。 图3.11中的行地址译码器有11根地址输入线,输出211=2048根译码信号,每一根行译码输出信号可选择控制一行存储单元(共2048个,即连接到2048个存储单元的字线)。同样列译码器有11根地址输入线,输出2048根译码信号,每一根列译码信号连接控制某一列2048个存储单元的数据的输入输出。只有被行、列译码信号同时选中的存储单元才被激活。由于存储器矩阵是由4个2048×2048模块组成的,每个模块有一根数据线Di相连,4个模块组成4位数据线。在每个模块中,行、列译码信号同时选中的位只可有一位,则4个模块共有4位被选中,组成4位数据位。在“写”存储器时,选中的位线根据相应的数据线值经放大器放大后写入存储单元中; 在“读”存储器时,选中的每一个存储单元值读出后经放大器输出到数据线上。因为所示的DRAM只有4位存储单元参与读/写,因此必须将多片DRAM连接到DRAM控制器上才能在总线上读/写一个字,其中还包含了刷新电路,每几个毫秒,DRAM对所有存储单元刷新一次,防止数据丢失。 3. DRAM的读/写过程 典型的DRAM的读/写时序如图3.12所示,图中操作过程是一个读周期后面接一个写周期。在读周期中,行地址选通信号RAS的下降沿时送行地址,列选通信号CAS的下降沿时送列地址,读/写控制信号R/在列地址信号出现之前加入(R/=1),等到被行、列地址所选中单元的数据读出有效后,RAS和CAS同时上升沿返回,此时将数据输出到MDR。与写周期类似。同样是在RAS下降沿时送行地址,在CAS下降沿时送列地址,在列地址信号出现之前加入读/写控制信号R/(R/=0),但在R/的上升沿将MDR中的数据写进指定的单元。 图3.12典型的DRAM的读/写时序 4. DRAM实例 以2116芯片的读/写周期给出DRAM的一个实例。2116是16K×1位的DRAM存储器芯片,如图3.13所示,该芯片是16引脚封装,其中7条地址引线采用分时复用的方法寻访128×128的存储矩阵,同时7条行地址线也用作刷新地址,即刷新时地址计数,实现对每一行的刷新。图3.14(a)给出了2116的读周期时序,其中tCYC是读周期时间,tRAS是RAS脉冲宽度,tCAS是CAS脉冲宽度,tRCS是读命令建立时间,tRCH是读命令保持时间,tDOH是数据输出保持时间。行地址必须在RAS有效前建立,且在RAS有效后保持一段时间; 列地址必须在CAS有效前建立,且在CAS有效后保持一段时间,这样才能保证行、列地址能正确送入相