多模块存储器
多模块存储器(Multi-module Memory)是指利用多个结构相同的存储模块(或存储芯片)共同构成一个主存系统。
采用多个存储模块主要有两类目的:
- 提高主存的访问性能
- 单体多字存储器
- 多体交叉存储器
- 高位交叉编址
- 低位交叉编址
- 扩大主存容量
- 位扩展
- 字扩展
- 字位扩展
虽然这两类技术都使用多个存储模块,但它们的设计目标完全不同:
- 单体多字存储器 和 多体交叉存储器 的目的是提高主存的带宽和吞吐率;
- 位扩展、字扩展和字位扩展 的目的是扩大主存的字长或容量。
因此,本节也将分别介绍这两类技术。
单体多字存储器
在介绍单体多字存储器之前,需要先明确一个概念。
通常情况下,一个地址只能对应一个存储字(Word)(这里假设采用 按字编址)。例如,一个字长为 32 位 的存储器:
| 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 |
|---|---|---|---|---|---|---|---|
| 0 | Word0 | 1 | Word1 | 2 | Word2 | 3 | Word3 |
CPU 每发出一个地址,只能读出 一个字(32 位)。
单体多字存储器 则是在一个地址下,同时存放多个连续的存储字。
假设每个字仍然为 m 位,但每个地址对应 n 个连续的字,则:
| 地址 | 数据 |
|---|---|
| 0 | Word0、Word1、Word2、Word3 |
| 1 | Word4、Word5、Word6、Word7 |
| 2 | Word8、Word9、Word10、Word11 |
例如,当 n=4 时,CPU 发出一次地址访问,就能够一次读出 4 个连续的字(共 4m 位)。
因此:
- 每个地址对应 n 个连续的字;
- 一个地址访问即可返回 n 个字;
- 数据总线宽度需要扩大为 n×m 位;
- 理论上,存储器带宽可以提高 n 倍。
这种方式本质上是扩大一次访问的数据宽度,而不是让多个存储模块并行处理不同的访问请求。
由于单体多字存储器一次返回的是 固定连续的 n 个字,因此它只能提高顺序访问时的数据传输效率,对于多个独立地址的访问无法提高并行性。
考试中一般只需了解其基本思想即可,真正的重点是 多体交叉存储器,它利用多个存储模块并行工作来提高主存的访问带宽。
多体交叉存储器
在 多体交叉存储器 的设计中,为了提高存储系统的并行性和带宽,常采用 交叉编址 的方式将主存划分为多个 存储体(memory bank)。根据地址在各存储体之间的分布方式,交叉编址又分为 高位交叉编址 和 低位交叉编址 两种。
高位交叉编址
在 高位交叉编址 中,地址的高位 用于选择 存储体,低位 表示在该存储体中的偏移地址。
例如:若系统有 4 个存储体,地址空间大小为 4n,则:
- 地址 0 ~ n−1 存储在 M0;
- 地址 n ~ 2n−1 存储在 M1;
- 地址 2n ~ 3n−1 存储在 M2;
- 地址 3n ~ 4n−1 存储在 M3。
也就是说,一整个存储体连续存储一段地址空间,相邻地址数据往往在同一个存储体中。如下图所示:
由于这种方式下,相邻数据集中在一个存储体中,多个存储体无法并行工作,而是 串行工作:
- 所有存储体共用一个 地址寄存器(AR) 和 数据寄存器(DR);
- 每次只能访问一个存储体,其它存储体处于空闲状态。
这种串行访问的结构较为简单,适用于对并行性能要求不高的场景,但 无法提升带宽或访问效率,无法发挥出多体结构的优势。
高位交叉编址 尽管名称中带有"交叉",但实际上地址在各存储体之间是按连续区间分布的,因此不少教材也称其为 高位连续编址。
国内《计算机组成原理》教材(如唐朔飞、白中英、王道等)通常都是这样分类:
多体存储器
- 高位交叉编址
- 低位交叉编址
这里的"交叉"实际上指的是:
多体存储器的一种编址方式
而不是说数据一定是交替存放的。
低位交叉编址
在 低位交叉编址 中,地址的低位 用于选择 存储体,高位 用于标识该存储体内的偏移地址。
以 4 个存储体为例,地址 0~3 分别对应 M0、M1、M2、M3,地址 4~7 也分别映射到 M0~M3,以此类推。这样就实现了 相邻地址分散存储在不同存储体中 的效果:
在这种方式下,多个存储体可以 并行工作,大大提高了访问效率。但为了支持并行,每个存储体 都需配备自己的地址寄存器和数据寄存器,如下图所示:
并行性
在 低位交叉编址 中,相邻地址的数据分布在不同的存储体中,因此多个存储体可以交替处理连续的访存请求。这种工作方式与 指令流水线 十分相似,可以显著提高主存的访问带宽。
要理解低位交叉存储器为什么能够实现这种并行访问,首先需要了解 存储周期 的概念。
存储周期 是指某个存储体从开始一次读/写操作,到能够再次接受下一次访问请求所需要的最短时间。
例如,一个存储体的存储周期为 40 ns,意味着:
- 第 0 ns 开始访问该存储体;
- 在接下来的 40 ns 内,该存储体一直处于忙碌状态,不能再次被访问;
- 只有到 40 ns 后,才能再次访问该存储体。
如果系统只有 一个存储体,那么 CPU 连续访问相邻地址时,就必须等待该存储体完成当前访问后才能开始下一次访问,因此连续两次访存之间的最短间隔就是 存储周期。
而在 低位交叉编址 中,连续地址会被轮流分配到不同的存储体。例如对于四体交叉存储器:
- 地址 0 → M0
- 地址 1 → M1
- 地址 2 → M2
- 地址 3 → M3
- 地址 4 → M0
- …
这样,当 M0 正在执行一次访存时,CPU 可以立即向 M1、M2、M3 发起新的访存请求,而无需等待 M0 完成。当再次轮到访问 M0 时,它通常已经完成了上一轮访问,因此不会发生冲突。
设主存共有 个存储体,每个存储体的存储周期为 ,则在理想情况下,系统可以实现:
也就是说:
- 为单个存储体的存储周期;
- 为存储体数量;
因此,整个主存系统可以平均每 秒连续输出一个字的数据,主存带宽相比单体存储器提高了约 倍。
这种并行访问之所以能够实现,是因为一次访存过程实际上可以 划分为多个阶段。为了便于分析,通常将一次读取操作抽象为三个阶段:
- :送地址和读命令(将地址送入存储器 AR)
- :存储体内部完成读操作(数据读入 DR,该阶段耗时最长,也是存储周期的主要组成部分)
- :将数据从 DR 传送给 CPU
由于不同存储体相互独立,当一个存储体仍处于 阶段时,CPU 已经可以开始向另一个存储体执行 。于是多个存储体的不同阶段便可以相互重叠执行,其执行过程与指令流水线十分相似。
假设 CPU 的时钟周期为 ,其中:
- 耗时 ;
- 耗时 ;
- 耗时 。
则对于四体交叉存储器,连续读取八个字的数据时,其流水线执行过程如下图所示:
可以看到,虽然每个存储体仍然需要较长的存储周期才能完成一次访问,但多个存储体的访问过程彼此交错、重叠执行,因此主存能够持续不断地向 CPU 输出数据,从而显著提高整体的吞吐率。
主存容量的扩展
在设计计算机存储系统时,单个存储芯片的容量和字长往往无法直接满足系统需求。例如,CPU 可能要求主存具有更大的存储容量,或者一次能够读写更宽的数据,而单个存储芯片只能提供有限的 存储字数 和 字长。因此,需要将多个存储芯片按照一定方式组合起来,构成满足要求的主存,这一过程称为 主存容量的扩展。
设某存储芯片具有:
- 存储字数:
- 字长:
则该存储芯片可表示为:
即共有 个存储单元,每个存储单元存放 数据。

根据扩展目标的不同,主存容量扩展主要分为三种方式:
- 位扩展:保持存储字数不变,扩展每个存储字的位数(字长)。
- 字扩展:保持字长不变,扩展存储字数(地址空间)。
- 字位扩展:同时扩展字长和存储字数。
位扩展法

字扩展法

字位扩展法

主存扩展和多体交叉存储器有什么关系
多体交叉存储器 和 主存扩展 都需要使用多个存储模块(或存储芯片),因此都会涉及 高位编址 和 低位编址 的地址分配方式。但两者的设计目标完全不同:
- 多体交叉存储器:通过将地址分布到多个存储体,提高主存的访问带宽和吞吐率。
- 主存扩展:通过连接多个存储芯片,扩大主存的容量或字长。
由于地址映射方式相同,因此主存扩展中也可以借用前面介绍的 高位编址 和 低位编址 来理解:
- 位扩展 采用 低位编址。多个存储芯片并行工作,共同组成一个更宽的数据字。
- 字扩展 采用 高位编址。高位地址用于选择存储芯片,低位地址作为芯片内部地址。
- 字位扩展 同时进行位扩展和字扩展,因此同时采用高位和低位编址。
位扩展
位扩展 是指:在 存储字数不变 的前提下,增加每个存储字的 位数,也就是扩展存储器的 字长。
例如,要用若干片 的存储芯片构成 的存储器:
- 原芯片:共有 个存储单元,每个单元 。
- 目标存储器:仍然有 个存储单元,但每个单元变为 。
因此,存储字数没有变化,只是每个存储字从 扩展到 ,这就是 位扩展。
需要的芯片数量为:
也就是说,需要 4 片 的芯片并行工作,共同组成一个 的存储器。
由于是 位扩展,所以 4 片芯片在逻辑上对应同一个地址范围。CPU 每访问一个地址,4 片芯片都要同时被选中:
- 4 片芯片的 片选信号连接在一起,并处于常有效状态;
- 4 片芯片的 地址线连接相同的地址信号;
- 每片芯片提供 数据中的 。
因此,一次访问时:
- 第 1 片芯片提供 ;
- 第 2 片芯片提供 ;
- 第 3 片芯片提供 ;
- 第 4 片芯片提供 。
这样,4 片芯片并行输出,就能共同组成一个 的存储字。
需要注意的是,如果目标存储器按 字节编址,那么 的存储器总容量为:
所以 CPU 需要 根地址线,即 。
但是,每片 的芯片内部只有 个存储单元,因此只需要:
根地址线。
由于目标存储器每个存储字为 ,CPU 地址中的低两位 用来表示一个 32 位字内部的 4 个字节偏移,因此不接入芯片地址端。
所以,芯片实际使用的地址线是:
也就是说:
- :用于选择芯片内部的 个存储单元;
- :表示字内字节偏移,不参与芯片内部寻址;
- 4 片芯片并行工作,共同扩展数据位宽。
需要注意的是,位扩展只是多个芯片共同组成同一个存储字,并不是一次返回多个连续的存储字,因此与单体多字存储器不同。CPU 一次访问仍然只读出一个 Word,只不过这个 Word 的位数变宽了。
字扩展
字扩展 是指:在 每个存储字位数不变 的前提下,增加存储器的 存储字数,也就是扩展存储器的地址范围。
例如,要用若干片 的存储芯片构成 的存储器:
- 原芯片:共有 个存储单元,每个单元 。
- 目标存储器:共有 个存储单元,每个单元仍然是 。
因此,存储字长没有变化,只是存储字数从 扩展到 ,这就是 字扩展。
需要的芯片数量为:
也就是说,需要 4 片 的芯片分别负责不同的地址范围。
目标存储器共有 个地址单元,因此需要:
根地址线,即 。
每片 芯片内部有 个存储单元,因此每片芯片内部寻址只需要:
根地址线。
所以:
- 低 14 位地址线 接到每片芯片的地址端,用于芯片内部寻址;
- 高 2 位地址线 接到片选译码器,用于选择当前访问哪一片芯片。
由于 4 片芯片分别对应 4 个连续的 地址空间,所以高两位地址可以区分这 4 片芯片:
| 高位地址 | 被选中的芯片 | 地址范围 |
|---|---|---|
| 第 1 片 | ||
| 第 2 片 | ||
| 第 3 片 | ||
| 第 4 片 |
因此,在 字扩展 中:
- 数据线位数不变,仍然是 ;
- 地址范围扩大;
- 同一时刻只有一片芯片被片选信号选中;
- 高位地址线通常用于产生片选信号。
字位扩展
字位扩展 是指:同时扩展存储器的 存储字数 和 存储字长。
也就是说,目标存储器相比原存储芯片:
- 地址范围更大;
- 每个存储字的位数也更宽。
例如,要用若干片 的存储芯片构成 的存储器:
- 原芯片:共有 个存储单元,每个单元 。
- 目标存储器:共有 个存储单元,每个单元 。
因此,这里既要把存储字数从 扩展到 ,又要把字长从 扩展到 ,所以属于 字位扩展。
需要的芯片数量为:
可以把这 4 片芯片分成两组:
- 每组 2 片芯片并行工作,用来把字长从 扩展到 ;
- 共 2 组芯片,用来把存储字数从 扩展到 。
也就是说:
其中:
- 一个 用于 位扩展;
- 一个 用于 字扩展。
目标存储器容量为:
如果按 字节编址,则 CPU 需要:
根地址线,即 。
每片 芯片内部有 个存储单元,因此每片芯片内部寻址需要 14 根地址线。
由于目标存储器每个存储字为 ,所以最低位地址线 用来表示一个 16 位字内部的字节偏移,不接入芯片地址端。
因此,芯片内部地址线使用:
高位地址线 用来区分两组芯片,产生片选信号:
| 高位地址 | 被选中的芯片组 | 地址范围 |
|---|---|---|
| 第 1 组 | 前 个 16 位字 | |
| 第 2 组 | 后 个 16 位字 |
每组内部的两片芯片并行工作:
- 一片提供 ;
- 一片提供 。
因此,在 字位扩展 中:
- 通过并联芯片的数据线实现 位扩展;
- 通过高位地址线和片选译码实现 字扩展;
- 同一时刻只选中一个芯片组;
- 被选中的芯片组内部,多个芯片并行工作,共同组成更宽的数据字。