Skip to content

主存和 CPU 之间的连接

2026 大纲 三(四)3 主存和 CPU 之间的连接

手里的芯片总是不够大,问题是往哪个方向补

一片存储芯片的规格写成 c×bc 个单元、每单元 b 位。而系统要的主存是 M 个单元、每单元 w 位。两者对不上时,缺口只可能出现在两个方向上——每个单元的位数不够b<w),或者单元的个数不够c<M)。前者要位扩展,后者要字扩展,两个都缺就两个都做。

这两种扩展的物理连接差别很大,而差别的根源只有一句话:

🔴 位扩展是"所有片一起出力、各出一部分位",字扩展是"每次只有一片工作、其余不选中"。所以前者不需要片选译码,后者必须译码。 记住这一条,接线怎么接、片选怎么给、地址线怎么分,都能推出来。

在动手算之前,先把一个最容易翻车的地方钉死:

🔴 规格里的 c 是单元数,不是字节数。 4K×4 的芯片总容量是 2 KB,但 c=4096 个单元,片内地址需要 log24096=12 位。若误把 c 当成 2 KB 去取对数会得到 11 位,片选逻辑和地址范围会全盘错位。片内地址位数只由单元数决定,与每单元多少位无关。

一、位扩展:把字长补够

b<w,即单片的位数不够,片数 =w/b。以 4K×4 的芯片构成 4K×8 的存储器为例,需要 2 片,接法是:两片的地址线完全相同(都接 A11A0);数据线各接一段(片 0 接 D3D0,片 1 接 D7D4);片选接同一个信号,两片同时被选中。因为它们总是一起工作,所以这一层不需要任何译码。

图 7.10 DRAM 芯片的扩展

图 7.10 DRAM 芯片的扩展(袁春风《计算机组成与系统结构(第 3 版)》p216)

教材这张图是 8 片 16M×8 位扩展成 64 位:同一组行列地址 (i,j) 广播到全部 8 片,DRAM0 出第 07 位、DRAM1 出第 815 位,直到 DRAM7 出第 5663 位,由存储控制器拼成一个 64 位的双字。

它同时揭示了一件事:这样的结构一次只能读出地址连续且对齐的 8 个字节(第 8k8k+7 单元)。所以若一个 4 字节的 int 起始地址为 6(占第 6、7、8、9 单元),它跨越了两组,必须访问两次存储器;起始地址是 4 的倍数则一次即可。这就是数据需要对齐的硬件原因——不是编译器的偏好,而是主存物理组织方式的直接后果,详见 数据对齐与大小端

二、字扩展:把容量补够

c<M,即单片的单元数不够,片数 =M/c。以 4K×8 的芯片构成 16K×8 的存储器为例,需要 4 片:片内地址 log24K=12 位,各片都接 A11A0;高 2 位 A13A12 送 2-4 译码器,四个输出分别接四片的 CS;数据线各片都接 D7D0(位数已够,无须扩展)。

A13A12选中地址范围
00芯片 00000H ~ 0FFFH
01芯片 11000H ~ 1FFFH
10芯片 22000H ~ 2FFFH
11芯片 33000H ~ 3FFFH

这张表反过来用,就能回答"某个地址落在哪一片、该片的最小地址是多少":拿地址除以单片的单元数,商就是片号,商乘回单片单元数就是该片的最小地址。例如 4 片 2K 的结构下,地址 0B1FH =28472847÷2048=1 余 799 ⇒ 落在片 1,片 1 的最小地址是 1×2048=2048= 0800H

三、字位同时扩展

b<wc<M 时两者都要做,顺序是先按位扩展分组、再按字扩展在组间译码。以 4K×4 的芯片构成 16K×8 为例:每组片数 8/4=2,组数 16K/4K=4,总片数 2×4=8。组内 2 片地址线相同、数据线分高低 4 位、片选相同;组间 4 组由高 2 位地址经 2-4 译码器产生 4 个片选,每个片选同时接到该组的 2 片上。

总片数=wb位扩展倍数×Mc字扩展倍数,地址线=[ 片选译码log2(M/c) 位,高位  片内地址log2c 位,低位 ]

算片数之前先把两个口径对齐

真题里的片数题很少直接给你 M×w,通常要先从题面条件换算出来,这里有两个独立的坑:

坑一:编址单位。 "按字节编址"时地址空间的单位是字节,"按字编址"时地址空间的单位是,要乘上字长才是字节容量。例如 24 位地址线、按字编址、字长 32 位,则地址空间是 224 个字 =224×4 B=64 MB,不是 16 MB。用这个数去除单片容量才对。

坑二:分区。 题面常把主存分成 ROM 区和 RAM 区,问某一区要几片。先把该区的容量单独算出来(总容量减去另一区,或按给定的比例分),再除以单片容量、再乘位扩展倍数。位扩展倍数千万别漏——8K×4 的芯片要两片才凑出 8K×8 的一组。

⚠️ 还有一个与片数无关但常同题出现的量:MAR 的位数看的是地址空间,不是实际装了多少。地址空间 64 MB 而只装了 32 MB 主存时,MAR 仍需 26 位——它要能表达整个地址空间。

四、控制信号与译码方式

画主存与 CPU 的连接图时只画地址线和数据线是不完整的:

信号方向接到哪里作用
MREQ(访存请求)CPU → 存储器译码器的使能端只有 CPU 确实要访存时,译码器才输出片选
R/WCPU → 各芯片读写控制端决定本次是读还是写
OE(输出使能)CPU → 各芯片输出三态门读操作时打开数据输出,避免总线冲突
WE(写使能)CPU → 各芯片写控制端写操作时有效

🔴 译码器的使能端必须接 MREQ 地址总线上任何时刻都有电平,CPU 执行不访存的指令时地址线上残留的也是某个值。若译码器一直使能,它就会持续输出某个片选,导致 CPU 并未访存却选中了某片。

如果还要把某段地址空间留给 I/O 或其他芯片,可以在使能端再串一个由更高位地址构成的门电路(例如仅当 A15A14 A13 有效时才使能)。

高位地址怎么参与译码,有三种做法:全译码让高位地址全部参与,每个地址唯一对应一个单元、无地址重叠,代价是译码电路较复杂;部分译码只用部分高位地址、其余悬空,电路简单但存在地址重叠——悬空的那几位取任何值都不影响选片,于是若干不同地址落到同一个物理单元上;线选法用单根高位地址直接作片选(低电平有效),最简单但浪费地址空间,且任何时刻只能选中一片。三者不是好坏问题而是取舍:在地址空间远大于实际需求的小系统里,重叠并不构成实际问题。

五、为什么片选用高位地址

高位地址接译码器(常规做法)使同一片内的地址连续:片 0 占 0000H~0FFFH、片 1 占 1000H~1FFFH……地址范围是整齐的区间,便于分区管理。

低位地址接译码器则相反:相邻地址落在不同芯片上,地址 0 在片 0、地址 1 在片 1……每片内部的地址不再连续。这不是接错了,而是另一种有意的设计——交叉编址,目标是并行带宽而不是连续性,详见 多体交叉存储器

⚠️ 无论怎么扩展,主存的存取周期都不变。存取周期由单个芯片的特性决定,与片数无关。想缩短有效存取时间得靠多体交叉、Cache 这些别的手段。

由一段给定地址范围反求连接的三步走查:容量、片选逻辑、各片地址范围(想核对"恒定高位"是怎么找出来的时展开)

某 8 位机主存地址 16 位(A15A0),按字节编址。要在 8000H ~ 9FFFH 这段地址上用 2K×8 的 RAM 芯片构建存储区。

第一步,求容量。

9FFFH8000H+1=2000H=213 B=8 KB

第二步,找出恒定不变的高位——它就是片选条件。 把区间两端写成二进制对齐比较:

8000H = 100 0 0000 0000 0000
9FFFH = 100 1 1111 1111 1111
        ↑↑↑
      A15 A14 A13 恒为 100,其余各位跑遍全 0 到全 1

区间内恒有 A15=1, A14=0, A13=0,故片选(低电平有效)为

CS=A15A14A13

第三步,确定片数与地址线分配。 片数=8 KB/2 KB=4 片:

  • 片内地址 log22K=11 位,接 A10A0
  • 剩下的 A12A11 送 2-4 译码器区分四片
  • 译码器使能端接第二步得到的 A15A14 A13
芯片A12A11地址范围
0008000H ~ 87FFH
1018800H ~ 8FFFH
2109000H ~ 97FFH
3119800H ~ 9FFFH

这三步的顺序是通用的:容量由区间长度定 → 恒定高位定片选 → 变化位从高到低依次分给译码器和片内地址

考点速记

  1. 芯片规格 c×bc 是单元数不是字节数,片内地址位数 =log2c位扩展补字长(地址线共享、数据线分段、片选相同,不需要译码),字扩展补容量(高位地址经译码器产生片选,每次只选一片),总片数 =wb×Mc,字位同扩要先分组再译码
  2. 地址线划分为低 log2c 位接片内、高 log2(M/c) 位接译码器;译码器使能端要接 MREQ;全译码无地址重叠、部分译码简单但有重叠、线选法最浪费。
  3. 高位选片使片内地址连续,低位选片则退化为交叉编址;位扩展的物理结构决定了一次只能读出对齐的若干字节,这是数据需要对齐的硬件原因;扩展多少片都不改变存取周期。

这一节在真题里被考过的形式(下方「真题练习」里属于本篇的那几道):

  • 给主存总容量与 ROM / RAM 的划分,问各需多少片:先把该区的容量单独算出来,再除以单片容量、乘上位扩展倍数8K×4 要两片才凑成一组 8K×8)。⚠️ 漏乘位扩展倍数是这类题最主要的失分点。
  • 给地址线位数与编址方式,问需要多少片:先按编址单位换算出字节容量——按字编址时地址数要乘字长,24 位地址线按字编址、字长 32 位是 64 MB 而不是 16 MB。
  • 给地址空间大小与实装主存容量,问 MAR 至少多少位:看地址空间,不看实装容量。地址空间 64 MB ⇒ 26 位,哪怕只装了 32 MB。
  • 给一个具体地址,问它所在芯片的最小地址:地址 ÷ 单片单元数 = 片号,片号 × 单片单元数 = 该片最小地址。
  • 给地址线位数与两个区的容量比例,问某区的地址范围:总空间由地址线位数定,按比例切出该区大小,再按"谁在低地址"排出区间端点。

易错:把 c×b 里的 c 当成字节容量取对数。4K×4 的片内地址是 12 位(log24096),不是 11 位。

易错:按字编址当成按字节编址。地址空间 × 字长才是字节容量。

易错:MAR 位数按实装容量算。它看的是地址空间。

易错:只做字扩展忘了位扩展倍数,片数少算一半甚至更多。

教材出处
  • 袁春风《计算机组成与系统结构(第 3 版)》§7.2.5 存储器芯片的扩展:位扩展 / 字扩展 / 字位同时扩展的定义与实例、图 7.10 DRAM 芯片的扩展及数据对齐的成因(p215~216)
  • 连续编址与交叉编址的地址划分方式:同上 §7.2.6,印刷页 p217

相关知识

半导体随机存取存储器DRAM 芯片与内存条多模块存储器数据对齐与大小端

真题练习