【组成原理-存储】存储器的相关知识
1 存储器的分类
1.1 随机存储器 RAM
特点 | SRAM(静态) | DRAM(动态) |
---|---|---|
存储信息 | 触发器 | 电容 |
破坏性读出 | 否 | 是 |
需要刷新 | 不要 | 需要(分散刷新(无死区时间)、集中刷新、异步刷新) |
地址传送 | 行、列地址同时送 | 行、列地址分开两次送(地址复用技术) |
读写速度 | 快 | 慢 |
成本 | 高 | 低 |
用途 | Cache | 主存 |
1.2 只读存储器 ROM
【注】只读存储器并非“只能读而不能写”,现在的只读存储器可通过电擦除等方式写入。
- MROM(只读存储器)
- PROM(一次可编程只读存储器)
- EPROM(可编程可擦除只读存储器)
- EEPROM(带电可编程可擦除只读存储器)
- Flash(闪存、U盘):具有 EEPROM 的特点,即带电可擦除重写
- SSD(固态硬盘):
项目 | 描述 |
---|---|
原理 | Flash 芯片 |
组成 | 多个闪存芯片,每个芯片有多个块,每个块有多个页 |
读写特性 | 以“页”为单位读写,支持随机访问(读快、写慢) |
擦除特性 | 以“块”为单位擦除,一个块如果被擦除次数过多会损坏 |
磨损均衡技术 | 动态磨损均衡(优先写入擦除次数较少的块)、静态磨损均衡(自动检测并迁移分配数据,使其寿命更长) |
优点 | 噪音小,读写速度快,抗震 |
缺点 | 造价高 |
1.3 串行访问存储器
- 磁带、磁盘、光盘(CD-ROM)
【注】磁盘和光盘既可串行访问又可随机访问。
1.4 多模块存储器
- 高位交叉存储器(顺序方式):高位地址表示体号,低位地址表示体内地址
- 低位交叉存储器(交叉方式,常考四体交叉):低位地址表示体号,高位地址表示体内地址,公式:
模块号 = 单元地址 % 模块数
。对于四体交叉,低两位地址表示体号,公式:模块号 = 单元地址 % 4
存取周期 = 存取时间 + 恢复时间
- 设模块数为 m,模块存取一个字的存取时间为 t,恢复时间为 r,则连续存取 m 个字(此时 r=t)所需的时间(存取周期)为
T = t+(m-1)r = r+(m-1)r = mr
。对于四体交叉,连续存取 4 个字(此时 r=t)所需的时间(存取周期)为T = t+3r = 4r
1.4.1 例题 1
【例 1】假定一个存储器系统支持四体交叉存取,某程序执行过程中访问地址序列为 3,9,17,2,51,37,13,4,8,41,67,10,哪些地址访问会发生体冲突?
【解】第一步:根据公式:模块号 = 单元地址 % 4
可得模块号:
地址 | 3 | 9 | 17 | 2 | 51 | 37 | 13 | 4 | 8 | 41 | 67 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
访问的模块号 | 3 | 1 | 1 | 2 | 3 | 1 | 1 | 0 | 0 | 1 | 3 | 2 |
第二步:根据文章《关于交叉存储器检测访问冲突的一种算法》所介绍的方法(王婆卖瓜自卖自夸?),即可快速准确地写出冲突项:
冲突地址 | 序列 |
---|---|
开始 | _ _ _ 3 1 1 2 3 1 1 0 0 1 3 2 _ _ _ |
对应 9 和 17 | _ _ (_ 3 1 1) 2 3 1 1 0 0 1 3 2 _ _ _ |
对应 17 和 37 | _ _ _ 3 1 _ _ _ (1 2 3 1) 1 0 0 1 3 2 _ _ _ |
对应 37 和 13 | _ _ _ 3 1 _ _ _ 1 2 (3 _ 1 1) 0 0 1 3 2 _ _ _ |
对应 4 和 8 | _ _ _ 3 1 _ _ _ 1 2 3 _ 1 _ _ (_ 1 0 0) 1 3 2 _ _ _ |
结束 | 3 1 _ _ _ 1 2 3 _ 1 _ _ _ 1 0 _ _ _ 0 1 3 2 |
所以一共有四对冲突地址,访问总时间为 22r。
四体交叉存储器与地址的对应关系如下:
M0 | M1 | M2 | M3 |
---|---|---|---|
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 |
... | ... | ... | ... |
1.4.2 例题 2
【例 2】某机器采用四体低位交叉存储器,现分别执行下述操作:(1)读取 6 个连续地址单元中存放的存储字,重复 80 次;(2)读取 8 个连续地址单元中存放的存储字,重复 60 次。则(1)、(2)所花时间之比为多少?
【解】我们继续用上题方法解此题,这要比王道书中的解题思路要清晰不少。
(1)读取 6 个连续地址所花时间:1 2 3 4 1 2,总共花费 6r;
两轮读取 6 个连续地址所花时间:1 2 3 4 1 2 _ _ 1 2 3 4 1 2,总共花费 14r,第二轮(_ _ 1 2 3 4 1 2)所用时间:14r - 6r = 8r,以后每一轮都是 8r;
所以序列为:1 2 3 4 1 2 _ _ 1 2 3 4 1 2_ _ 1 2 3 4 1 2_ _ 1 2 3 4 1 2 ... 1 2 3 4 1 2 _ _ _(注意:总共时间包括所有存储器的恢复时间!所以最后给出三个空位用来恢复!)
总共时间为:80 * 8r -2r + 3r = 641r
也可以由上面序列直接算:80 * 8r + 1r = 641r
(2)读取 8 个连续地址所花时间:1 2 3 4 1 2 3 4,总共花费 8r;
两轮读取 8 个连续地址所花时间:1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4,总共花费 16r,第二轮(1 2 3 4 1 2 3 4)所用时间:16r - 8r = 8r,所以每一轮都是 8r;
所以序列为:1 2 3 4 1 2 3 4 1 2 3 4 ... 1 2 3 4 _ _ _(注意:总共时间包括所有存储器的恢复时间!所以最后给出三个空位用来恢复!)
总共时间:60 * 8r + 3r = 483r
所以时间之比为 641r : 483r = 4:3。
1.4.3 例题 3
【例 3】设存储器容量为 32 字,字长 64 位,模块数 m=4,分别用顺序方式和交叉方式进行组织。存储周期 T=200ns,数据总线宽度为 64 位,总线传送周期 r=50ns。若连续读出 4 个字,问顺序存储器和交叉存储器的读取 4 个字所需时间各是多少?
【解】连续读出 4 个字的位数 = 64b * 4 = 256b
顺序存储器连续读出 4 个字所需时间 = 4 * 200 = 800ns
交叉存储器连续读出 4 个字所需时间 = 200 + 3*50 = 350ns
2 字长和存储容量
2.1 存储单位
在计算机组成原理课程中,使用 K、M、G、T 均表示以 2 为底的单位。如 2K 个存储单元的意思是 2048 个存储单元,而不是 2000 个。但是,对于磁盘的存储容量及数据传输率,依然使用以 10 为底的单位。
单位 | 大小 | 十六进制数 |
---|---|---|
K | 210 | 400H |
M | 220 | 10,0000H |
G | 230 | ~ |
T | 240 | ~ |
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
注意!!!408 考试使用 KB、MB、GB、TB 表示 2 为底的存储单位!!!
10 为底的存储单位 | 2 为底的存储单位 |
---|---|
KB = 103B | KiB = 210B |
MB = 106B | MiB = 220B |
GB = 109B | GiB = 230B |
TB = 1012B | TiB = 240B |
【例】128 MB = 128 * 220 B = 27 * 220 B = 227 B
16MB = 16 * 220 B = 24 * 220 B = 224 B
2.2 字长
-
字长:用于表示 CPU 内部通用寄存器的宽度。字长包括机器字长、指令字长、存储字长,必须为字节(8 位)的整数倍。
-
机器字长:机器进行一次整数运算所能处理的二进制数据的位数,即 CPU 位数,或简称为字长。
【注】操作系统位数:操作系统可寻址位数(小于等于 CPU 位数)。32 位处理器只能装 32 位操作系统而不能装 64 位操作系统,64 位处理器能装 32 或 64 位操作系统。
名称 | 16 位机器(CPU)中的位数 | 32 位机器(CPU)中的位数 | 64 位机器(CPU)中的位数 |
---|---|---|---|
位 (bit, b) | 1 | 1 | 1 |
字节 (byte, B) | 8 | 8 | 8 |
半字 (1B/2B/4B) | 8 | 16 | 32 |
字 (2B/4B/8B,机器字长) | 16 | 32 | 64 |
双字 | 32 | 64 | 128 |
四字 | 64 | 128 | 256 |
-
指令字长:一个指令字中包含的二进制位数。
-
存储字长:一个存储单元存储的二进制位数。
指令字长一般取存储字长的整数倍,若指令字长等于存储字长的 2 倍,则需要 2 个访存周期来取出一条指令;若指令字长等于存储字长,则取指周期等于机器周期。
补充:不同机器下的数据类型长度
类型 | 16 位机器 | 32 位机器 | 64 位机器 |
---|---|---|---|
char | 8 | 8 | 8 |
short | 16 | 16 | 16 |
int | 16 | 32 | 32 |
long | 32 | 32 | 32 |
long long | 64 | 64 | 64 |
float | 16 | 32 | 32 |
double | 64 | 64 | 64 |
2.3 存储容量
存储容量 = 存储单元个数 * 每个存储单元的长度(位数,又称为存储字长)
【例 1】存储器容量为 2M * 8 位,表示该存储器有 2 * 220 = 221 个存储单元(若为 SRAM,则有 21 根地址线),该存储器的地址寄存器为 21 位;每个存储单元存放 8 位二进制数据(有 8 根数据线,存储字长为 8 位,即 1 字节),该存储器的数据寄存器为 8 位;存储容量为 2M * 1B = 2MB。
【例 2】存储器容量为 8K * 16 位,表示该存储器有 8 * 210 = 213 个存储单元(若为 SRAM,则有 13 根地址线),该存储器的地址寄存器为 13 位;每个存储单元存放 16 位二进制数据(有 16 根数据线,存储字长为 16 位,即 2 字节),该存储器的数据寄存器为 16 位;存储容量为 8K * 2B = 16KB。
- 设 A 存储器容量为 x1 * y1 位,B 存储芯片容量为 x2 * y2 位,则组成 A 存储器所需要的 B 芯片片数为
(x1 * y1)/(x2 * y2)
【例 3】16 片 2K * 4 位的存储芯片,可设计为多少存储容量的 16 位存储器?
设存储单元个数为 M,则有:
(M * 16) / (2K * 4) = 16
,解得 M = 8K。
【例 4】某机器的内存按字节编址,地址从 90000H 到 CFFFFH,若用存储容量为 16K * 8 位芯片构成该内存,则需要多少块芯片?
存储单元个数为 D0000H - 90000H = 40000H = 4 * 164 = 218 = 28 * 210 = 256K,且内存按字节编址(8 位),所以有:
(256K * 8) / (16K * 8) = 16
,即需要 16 块芯片。
【例 5】某 32 位机器的内存按字编址,地址从 90000H 到 CFFFFH,若用存储容量为 16K * 8 位芯片构成该内存,则需要多少块芯片?
存储单元个数为 D0000H - 90000H = 40000H = 4 * 164 = 218 = 28 * 210 = 256K,且内存按字编址(每个存储单元大小为 32 位),所以有:
(256K * 32) / (16K * 8) = 64
,即需要 64 块芯片。
2.4 存储容量的扩展
- 位扩展法:将存储芯片的存储字长(即一个存储单元的数据位数)扩充,使其数据位数与 CPU 的数据线数相等。
【例 1】8K * 1b --> 8K * 8b:
- 需要 8(
= (8K * 8b) / (8K * 1b)
)片存储芯片用来扩充。- 一个 8 位 CPU 在读取该存储器时,同时读取 8b 数据,即同时选中并读取 8 个 8K * 1b 的存储芯片。
- 字扩展法:将存储芯片的存储单元个数扩充,存储字长(数据位数)不变。
【例 2】16K * 8b --> 64K * 8b:
- 需要 4(
= (64K * 8b) / (16K * 8b)
)片存储芯片用来扩充。- 扩充后的存储器地址空间大小为 216,即地址位数为 16(A15—A0),最高两位(A15A14)指示选中 4 块存储芯片中的哪个芯片。
- 该电路设计需要一个 2/4 译码器。
- 一个 8 位 CPU 在读取该存储器时,只能选中并读取其中一个 16K * 8b 芯片。
- 字位同时扩展法:将存储芯片的存储字长和存储单元个数同时扩充。
【例 3】16K * 4b --> 64K * 8b:
- 需要 8(
= (64K * 8b) / (16K * 4b)
)片存储芯片用来扩充,每 2(= 8b / 4b
)片存储芯片组成一组,一共有 4(= 64K / 16K
)组。- 扩充后的存储器地址空间大小为 216,即地址位数为 16(A15—A0),最高两位(A15A14)指示选中 4 组存储芯片中的哪一组。
- 该电路设计仍需要一个 2/4 译码器。
- 一个 8 位 CPU 在读取该存储器时,同一时间只能读取 8b 数据,即只能选中并读取其中一组芯片(2 * 16K * 4b)。
2.5 相关例题
2.5.1 例题 1
【例 1】用一个 512K * 8b 的 Flash 存储芯片组成一个 4M * 32b 的半导体只读存储器,存储器按字编址,试回答以下问题:
(1)该存储器的数据线数和地址线数分别为多少?
(2)共需要几片这样的存储芯片?
(3)一个 32 位 CPU 使用了该存储器,请说明每根地址线、数据线的作用。
(4)一个 8 位 CPU 使用了该存储器,请说明每根地址线、数据线的作用。
【解】(1)该存储器的存储字长为 32b,因此存储器的数据线数为 32;该存储器的存储单元个数为 4M = 222,因此存储器的地址线数为 22。
(2)
(4M * 32b) / (512K * 8b) = (222 * 32b) / (219 * 8b) = 32 片
(3)将 512K * 8b 的存储容量扩展为 4M * 32b,存储单元个数和存储字长都被扩充,显然使用了字位同时扩展法。
位扩展法:
32b / 8b = 4 片/组
;字扩展法:4M / 512K = 222 / 219 = 23 = 8 组
。采用译码片选法,高位地址线(A21A20A19)通过 3/8 译码器选中访问某组芯片。剩余地址线(A18—A0)访问组内每一片 512K 芯片内部的存储单元。
这是一个 32 位 CPU,所以有 32 根数据线。每组芯片内的 4 片芯片分别连接 D31—D24、D23—D16、D15—D8、D7—D0。
(4)与上问不同,这是使用了 8 位 CPU 来访问该存储器,显然若该 CPU 欲读取 32b 数据,只能分成 4 个 8b 数据来读取。访问一次 8b 数据的顺序是:CPU 先选中某一组芯片,然后再选中该组内的某一块芯片,因此有两次选择过程,需要两个译码器。
高位地址线(A21A20A19)通过 3/8 译码器选中访问某组芯片;次高位地址线(A18A17)通过 2/4 译码器选中该组内的某块 512K 芯片;剩余地址线(A16—A0)访问该 512K 芯片内部的存储单元。
这是一个 8 位 CPU,所以有 8 根数据线,全接到每片芯片中。
2.5.2 例题 2
【例 2】地址总线 A0(高位)—A15(低位),用 4K * 4b 的存储芯片组成 16K * 8b 的存储器,则产生片选信号的译码器的输入地址线应该是?
【解】将 4K * 4b 的存储容量扩展为 16K * 8b,存储单元个数和存储字长都被扩充,显然使用了字位同时扩展法。
位扩展法:
8b / 4b = 2 片/组
;字扩展法:16K / 4K = 4 组
。所需地址线一共为 14 根(
16K = 214
),即只需使用地址总线 A2(高位)—A15(低位)。高位地址线(A2A3)通过 2/4 译码器选中访问哪一组芯片。剩余地址线(A4—A15)访问每一片 4K 芯片。
2.5.3 例题 3
【例 3】设某机中,CPU 的地址总线 A15—A0,数据总线 D7—D0(A0、D0 均为最低位),存储器地址空间为 3000H ~ 67FFH。其中 3000H ~ 4FFFH 为 ROM 区,选用 4K * 2b 的 ROM 芯片,5000H ~ 67FFH 为 RAM 区,选用 2K * 4b 的 SRAM 芯片。请问:
(1)组成该存储器需要多少片 ROM 芯片和 SRAM 芯片?
(2)ROM 芯片、SRAM 芯片各需连接 CPU 的哪几根地址线和数据线?
(3)应如何设置片选信号,分别写出各片选信号的逻辑表达式。
【解】(1)CPU 的地址总线数为 16,数据总线数为 8,可知需要扩展的存储规格为 16K * 8b。
- 对于整个存储器的存储单元个数:
67FFH + 0001H - 3000H = 3800H = 3 * 163 + 8 * 162 = 210 * (3 * 22 + 21) = 14K
,因此扩展后的存储规格为 14K * 8b。- 对于 ROM 区的存储单元个数:
4FFFH + 0001H - 3000H = 2000H = 2 * 163 = 210 * 8 = 8K
,因此扩展后的 ROM 规格为 8K * 8b,所需 ROM 芯片个数为(8K * 8b) / (4K * 2b) = 8 片
。- 对于 RAM 区的存储单元个数:
67FFH + 0001H - 5000H = 1800H = 163 + 8 * 162 = 210 * (2 + 22) = 6K
,因此扩展后的 RAM 规格为 6K * 8b,所需 RAM 芯片个数为(6K * 8b) / (2K * 4b) = 6 片
。
(2)芯片与地址线的接法要看单片芯片的容量(注意此处问的是芯片的接法而不是 CPU 的接法);数据线的接法要看“位扩展法”。
- ROM 芯片(4K = 212)的地址线:A11—A0。
- RAM 芯片(2K = 211)的地址线:A10—A0。
- ROM 芯片的分法:
8b / 2b = 4 片/组
,一共 2 组,所以每组芯片内的 4 片芯片分别连接 D7D6、D5D4、D3D2、D1D0。- RAM 芯片的分法:
8b / 4b = 2 片/组
,一共 3 组,所以每组芯片内的 2 片芯片分别连接 D7D6D5D4、D3D2D1D0。
(3)片选信号的设置与(2)中芯片分组的分法有关,采用线选法:
- 对于 ROM 区的地址空间(3000H ~ 4FFFH):ROM 分为 2 组,因此也将地址空间等分为 2 部分(3000H ~ 3FFFH、4000H ~ 4FFFH),易得以下片选信号逻辑表达式:
- 3000H ~ 3FFFH:最高位化为二进制为 0011,因此片选信号
CS0 = A15'·A14'·A13·A12
- 4000H ~ 4FFFH:最高位化为二进制为 0100,因此片选信号
CS1 = A15'·A14·A13'·A12'
- 对于 RAM 区的地址空间(5000H ~ 67FFH):RAM 分为 3 组,因此也将地址空间等分为 3 部分(5000H ~ 57FFH、5800H ~ 5FFFH、6000H ~ 67FFH),易得以下片选信号逻辑表达式:
- 5000H ~ 57FFH:最高两位化为二进制为 0101 0000 ~ 0101 0111,因此片选信号
CS2 = A15'·A14·A13'·A12·A11'
- 5800H ~ 5FFFH:最高两位化为二进制为 0101 1000 ~ 0101 1111,因此片选信号
CS3 = A15'·A14·A13'·A12·A11
- 6000H ~ 67FFH:最高两位化为二进制为 0110 0000 ~ 0110 0111,因此片选信号
CS4 = A15'·A14·A13·A12'·A11'
【注】第(3)问中默认片选信号高电平有效。若题目特别指出片选信号低电平有效,则直接对所求逻辑表达式再取一次反即可,例如:CS0' = (A15'·A14'·A13·A12)'
。