存储器是计算机系统中的记忆设备,用来存放程序和数据。
构成存储器的存储介质,目前主要采用半导体器件和磁性材料。一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元,均可以存储一位二进制代码。这个二进制代码位是存储器中最小的存储单位,称为存储位元。由若干个存储位元组成一个存储单元,然后再由许多存储单元组成一个存储器。
根据存储材料的性能及使用方法不同,存储器有各种不同的分类方法。
(1)存储介质:作为存储介质的基本要求,必须有两个明显区别的物理状态,分别用来表示二进制的代码0和1。另一方面,存储器的存取速度又取决于这种物理状态的改变速度。目前使用的存储介质主要是半导体器件和磁性材料。用半导体器件组成的存储器称为半导体存储器。用磁性材料做成的存储器称为磁表面存储器,如磁盘存储器和磁带存储器。
(2)存取方式:如果存储器中任何存储单元的内容都能被随机存取,且存取时间和存储单元的物理位置无关,这种存储器称为随机存储器。半导体存储器是随机存储器。如果存储器只能按某种顺序来存取,也就是说存取时间和存储单元的物理位置有关,这种存储器称为顺序存储器。如磁带存储器就是顺序存储器,它的存取周期较长。磁盘存储器是半顺序存储器。
(3)存储内容可变性:有些半导体存储器存储的内容是固定不变的,即只能读出而不能写入,因此这种半导体存储器称为只读存储器(ROM)。既能读出又能写入的半导体存储器,称为随机读写存储器(RAM)。
(4)信息易失性 :断电后信息消失的存储器,称为易失性存储器。断电后仍能保存信息的存储器,称为非易失性存储器。磁性材料做成的存储器是非易失性存储器,半导体读写存储器RAM是易失性存储器。
(5)系统中的作用:根据存储器在计算机系统中所起的作用,可分为内部存储器、外部存储器;又可分为主存储器、高速缓冲存储器、辅助存储器、控制存储器。半导体存储器是内部存储器,磁盘是外部存储器,又是辅助存储器。
对存储器的要求是容量大、速度快、成本低,但是在一个存储器中要求同时兼顾这三方面是困难的。为了解决这方面的矛盾,目前在计算机系统中,通常采用多级存储器体系结构,即使用高速缓冲存储器( cache)、主存储器和外存储器,如图3.1所示。CPU能直接访问的存储器称为内存储器,它包括cache和主存储器。CPU不能直接访问外存储器,外存储器的信息必须调入内存储器后才能为CPU进行处理。
1、高速缓冲存储器 : 简称cache,它是计算机系统中的一个高速小容量半导体存储器。在计算机中,为了提高计算机的处理速度,利用cache来高速存取指令和数据。和主存储器相比,它的存取速度快,但存储容量小。
2、主存储器 : 主存储器简称主存,是计算机系统的主要存储器,用来存放计算机运行期间的大量程序和数据。它能和cache交换数据和指令。主存储器由MOS半导体存储器组成。
3、外存储器 : 外存储器简称外存,它是大容量辅助存储器。目前主要使用磁盘存储器、磁带存储器和光盘存储器。外存的特点是存储容量大,位成本低,通常用来存放系统程序和大型数据文件及数据库。
CPU与存储器的信息交换主要依靠系统总线来完成,根据总线传递信息的不同,系统总线被分为数据总线,地址总线和控制总线三大类。
1、数据总线DB(data bus) : 传输CPU与存储器之间的二进制数据,双向线。数据总线的位数决定了CPU一次可以和存储器交换数据的位数,是微型机的重要指标。
2、地址总线AB(address bus) : 传输CPU送出的地址信息,用来确定和CPU交换数据的存储单元,单向线。地址总线的位数决定了CPU可以直接寻址的内存空间。
可寻址空间 = 2n (n为地址总线的位数)
3、控制总线CB(control bus) : 传输CPU发出的控制信号,包括片选信号、读/写信号,访存允许信号,双向线
地址译码驱动方式:根据地址总线的信息选中存储元的过程。
(1)最初结构:
缺点:一个存储单元里面只有一个存储元(一位二进制数),每次只能读出一位二进制数,效率太低。
M R E Q ‾ \overline{MREQ} MREQ:允许访存信号。低电平0有效。只有在低电平下,读写电路才会工作。然后R / W ‾ \overline{W} W用来控制数据总线上数据的流动方向,看是读还是写。
R / W ‾ \overline{W} W: 读写控制线(Read / Write)。那么也就是说在这个控制线中,1是读信号,0是写信号。1读0写
(信号上面加横线表示0有效,1无效;不加横线表示1有效,0无效)
存储器的标准写法: M × N (字 × 字长)
M:字 。 代表有多少个存储单元。(由AB决定 : 2n (M = n))
N:字长。代表一个存储单元中含有多少个存储元。(由DB决定:N = DB)
例:
(1)256M × 32位 :表示这个存储器一共有256M个存储字,其字长为32。
256M = 28 M = 228 B
所以:n = 28
AB:28
DB:32
(2)给出计算机存储器的字和字长,很容易就能求出存储器的容量。
M:4G
N:16位(二进制数)
4G × 16 位 = 4G × 2 × 8 位 = 4G × 2 × 1B = 8GB
但是只给定存储器的容量,那么是求不出来存储器的标准格式的,M、N都不能确定。
8GB = 4G × 16位 = 2G × 32位 = 1G × 64位
目前的计算机大部分是采用按字节编址的方式。
按字节编址的方式也可以按字来访问。按字节编址优点较多
例如:1000既是第一个字节的地址,也是连续四个字节的字地址。
例:
1、某个存储器容量为 64 KB ,按字编址,存储器字长为 32 位,寻址空间是多少?
M × 32位 = 64KB = 64K × 8位 = 16K × 4 × 8位 = 16K × 32位
M(字):16K
AB :14位
最小地址:00 0000 0000 0000 0000H
最大地址:11 1111 1111 1111 3FFFH
所以寻址空间为0000H~3FFFH
2、 某个存储器容量为 16 KB ,按字节编址,存储器字长为 32 位,寻址空间是多少?
按字节编址,一个字节对应一个地址。
16KB = 16K字节 所以要有16K个地址
AB : 14位 214
转换为 M × N格式,按字编址格式
16KB = 16K × 8位 = 4K × 4 × 8位 = 4K × 32位
字:4K
字长:32位
SRAM中,用一个锁存器(触发器)作为存储元。只要直流供电电源一直加在这个记忆电路上,它就无限期地保持记忆的1状态或0状态。如果电源断电,那么存储的数据(1或0)就会丢失。
我们可以看出,SRAM的内部结构很复杂,所以它的集成度很低,容量都做不大,因此适合于作为低容量的高速缓冲存储器cache。
简述一下读写的流程:
①写 1 到存储元时,输出缓冲器关闭、刷新缓冲器关闭,输入缓冲器
打开(R / W ‾ \overline{W} W为低),输入数据DIN=1 送到存储元位线上,而行选线为高,MOS管打开,于是位线上的高电平给电容器充电,表示存储了 1 。
②写 0 到存储元时,输出缓冲器关闭、刷新缓冲器关闭,输入缓冲器
打开,输入数据DIN=0 送到存储元位线上;行选线为高,MOS管打开,于是电容上的电荷通过MOS管和位线放电,表示存储了 0 。
③从存储元读出时,输入缓冲器和刷新缓冲器关闭,输出缓冲器/读放打开(R / W ‾ \overline{W} W为高)。行选线为高,MOS管打开,若当前存储的信息为 1 ,则电容上所存储的 1 送到位线上,通过输出缓冲器/读出放大器发送到
DOUT,即DOUT=1。
读出过程破坏了电容上存储的信息,所以要把信息重新写入,即刷新。
读出的过程中可以完成刷新。读出 1 后,输入缓冲器关闭,刷新缓冲器打开,输出缓冲器/读放打开,读出的数据DOUT=1 又经刷新缓冲器送到位线上,再经MOS管写到电容上,存储元重写 1 。
①为什么要刷新?
因为靠电容存储电荷的原理保存信息,而电荷一般只能保持1~2ms,所以必须在2ms内对其所有存储单元通过读取动作(不输出读取结果)恢复一次原状态,该过程叫刷新或再生。对存储单元进行读取动作时,为了避免破坏性读出,需要对存储单元进行预充(刷新)操作。
②什么是刷新周期?
在刷新的过程中,依次使行选择线有效,每次刷新一行,即可完成对整个存储器的刷新。对整个存储器刷新一遍最短时间称为刷新周期,一般2ms。
刷新过程
行地址译码器选中某一行,数据从读数据线中被读出,经过刷新放大器刷新数据后再通过写数据线写入存储元中。
DRAM 中地址线减半。行、列地址是分开传送(分时接收)的。行地址存储在行地址寄存器,列地址存储在列地址寄存器。
例如:一个 4G × 8位的DRAM存储器
(64K × 64K)× 8位
AB:32位(16位行地址、16位列地址)
信号 R A S ‾ \overline{RAS} RAS是用来控制接收行地址的信号。
信号 C A S ‾ \overline{CAS} CAS是用来控制接收列地址的信号。
存储器芯片的容量是有限的,为了满足实际存储器的容量要求,需要对存储器进行扩展。主要方法有:
存储器的存储单元数不变,每个单元的位数(字长)增加。
例:由1K × 4位的芯片构成1K × 8位的存储器
每单元位数不变,增加单元个数。
例:用16K × 8位的芯片构成64K × 8位的存储器
字为64K,那么地址线总数为16位,如果分成四个16K的芯片,那么只会占用
14位地址线,那么还剩下2位地址线。这两位地址线通过2-4译码器正好可以表示出四个不同的地址编号用来分别表示这四个芯片。
如上图所示,四个存储器共用八位地址线。所以这四个存储器是不能够同时进行工作的。
因此,字扩展的本质是大家不能够同时的工作。
正好是一串连续的地址。
下面举出一些的例题:
6000H~67FFH:
0110 0000 0000 0000 ~ 0110 0111 1111 1111
6800H~6BFFH:
0110 1000 0000 0000 ~ 0110 1011 1111 1111
(2) 确定芯片的数量及类型
通过观察上面的二进制地址码,我们可以看出,6000H~67FFH有11位二进制数存在差异,其他的5位都保持一致。所以在这个区间能表示的地址空间就为 211 也就是 2K。所以选用一片2K × 8位的存储器即可。6800H~6BFFH有10位二进制数存在差异,其他的6位都保持一致。所以在这个区间能表示的地址空间就为 210 也就是 1K。所以选用一片1K × 8位的存储器即可。
(3) 分配地址线
由上面分析可得,系统程序区需要 2K 的存储空间(也就是需要11位地址线)。用户程序区需要 1K 的存储空间(也就是需要10位地址线)。那么我们就从中选择多的,两个存储器都需要11位地址线。
A10~ A0 接 2K × 8位 RAM 的地址线
A9 ~ A0 接 1K × 8位 RAM 的地址线(还少连一位地址线A10,下面再说)
(4) 确定片选信号
因为两个存储器都需要11位地址线,那么剩下还有5位地址线。
高两位都一样,都是01,所以让高两位地址线直接连接3-8译码器的G1和 G 2 A ‾ \overline{G~2A} G 2A信号。 M R E Q ‾ \overline{MREQ} MREQ连接 G 2 B ‾ \overline{G~2B} G 2B控制读写信号。C、B、A三个信号是3-8译码器的输入信号,用于选取对应的存储器。上面说还少连一位地址线A10,因为1K × 8位的存储器只需要10位地址线,通过观察,我们发现用户程序区的A10位地址线上信号全为0,所以加以判断,当A10上输入的信号为0,那么才为 1K 的存储器。
例题二:
分析:
CPU有16根地址线,可寻址64K空间。
系统程序区:0-8KB(8K×8),用1片8K×8的RAM。
用户程序区:8KB-24KB(28K8),用2片8K×8的RAM。
系统程序工作区:最后4K,用一片4K×8RAM。
主存地址空间分布如下图:
CDRAM(Cached DRAM)是一种附带高速缓冲存储器的动态存储器,它是在常规的DRAM芯片封装内又集成了一个小容量SRAM作为高速缓冲存储器,从而使 DRAM芯片的访问速度得到显著提升。
-CDRAM内存模块
1片CDRAM的容量为1M×4位,8片这样的芯片可组成1M×32位的存储模块。8个芯片共用片选信号CS。行选通信号RAS、刷新信号Ref和地址输入信号A0~A10。两片1M×4位的CDRAM芯片的列选通信号CAS接在一起,形成一个1M×8位(1MB)的片组。4个片组成一个1M×32位(4MB)的存储模块。
数据总线宽度为32位。为了CPU 与存储器交换数据方便,每次访存时可以由CPU选择实现字存取(32位)、半字存取(高16位或低16位)或字节存取(任意8位)。由于存储器按字节编址,因而每次访存数据总线上可能会传输4个地址(字)、2个地址(半字)或者1个地址(字节)的数据。为此,CPU送出的地址线中最低两位的A1和A0并不送出,而是送出由连续四字节组成的一个32位字的字地址(字地址的最低两位固定为00),外加4个字节允许信号 B E 3 ‾ \overline{BE3} BE3~ B E 0 ‾ \overline{BE0} BE0。例如,当进行32位存取时, B E 3 ‾ \overline{BE3} BE3~ B E 0 ‾ \overline{BE0} BE0全有效;而存取低有效半字(与数据线D15 ~ D0对应)时, B E 3 ‾ \overline{BE3} BE3~ B E 0 ‾ \overline{BE0} BE0为1100( B E 1 ‾ \overline{BE1} BE1、 B E 0 ‾ \overline{BE0} BE0有效);而当存取数据线D23 ~ D16对应的字节时, B E 3 ‾ \overline{BE3} BE3~ B E 0 ‾ \overline{BE0} BE0为1011( B E 2 ‾ \overline{BE2} BE2有效)。
只读存储器(ROM)
它的特点是可以随机的读出其中的内容,但不能写入,是一种非易失性存储器,掉电后存储在其中的信息不会丢失。一般用来存放监控程序、管理软件。
只读存储器最重要的是要保证掉电后存储在其中的信息不会丢失,内存在断电后里面的信息就会丢失,但是ROM是绝对不允许的。ROM是使用两种物理结构来保存0、1信号的。所以不会断电丢失数据。(而RAM是采用两种信号来保存0、1数据的)。
一旦生产完成后就不能再写入数据了
通过两种物理状态存储0、1信号。通路代表1。不同,不能读出数据,就为0
在生产完成后只能写入一次数据
由于CPU和主存储器在速度上不匹配,而且在一个CPU周期中可能需要用几个存储器字,这便限制了高速计算,为了使CPU不至因为等待存储器读写操作的完成而无事可做,可以采取一些加速CPU和存储器之间有效传输的特殊措施:
优化多核CPU访问一根内存条的速度。
就是有两套三总线结构,这样速度会翻一倍。采用双端口会出现一些问题。
如果对两个存储器同时读,那没问题。如果对两个存储器同时写,先保证一个端口,另一个端口先等待。上层应用可以采取加锁的实现方式。
存储器的模块化组织
一个由若干个模块组成的主存储器是线性编址的。这些地址在各模块
有两种安排方式:一种是顺序方式,一种是交叉方式。
例如:设存储器容量为32字,模块数m = 4,字长 64 位,数据总线宽度为 64 位,按照顺序方式组织存储器。存储器的存储周期T = 200ns,总线传送周期 τ = 50ns。问顺序存储器带宽是多少?
顺序存储器连续读出m=4个字的信息总量都是:q = 64位×4=256位
设连续读出的4个字在同一个模块上,所需的时间为:
t = mT =4×200ns= 800ns = 8 × 10-7 s
顺序存储器的带宽是:W = q / t = 256 ÷ (8 × 10-7) = 32 × 10-7bps