前言
如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。
文章目录
第三章 存储器
3.1 半导体存储器概述
3.1.1 半导体存储芯片基本结构
其中片选信号是 C E ‾ \overline{CE} CE 或 C S ‾ \overline{CS} CS,表示 chip select 或者 chip enable。
读/写控制线中 W E ‾ \overline{WE} WE 表示低电平写,高电平读; O E ‾ \overline{OE} OE 表示允许读, W E ‾ \overline{WE} WE 表示允许写。
3.1.2 半导体芯片的译码驱动
线选法
用一根字选择线直接选中存储单元,例如一个字节。
每个字都对应着一根地址线。
重合法
规模从 O ( n ) O(n) O(n) 缩减为 O ( n ) O(\sqrt{n}) O(n),二维片选,减少了地址译码输出线的数目。
3.1.3 主存的技术指标
存储容量
- 存储容量:主存能存放的二进制数的总位数
- 存储器容量 = 存储单元个数 * 存储字长
访存周期
相邻两次存储器访问的时间间隔
存储器带宽
单位时间内存储器存取的信息量(字节/秒、位/秒、字/秒)
3.1.4 存储器分类
按存储介质分类
- 【易失】半导体存储器:TTL、MOS
- 体积小、功耗低、存取时间短、易失
- 【非易失】磁表面存储器:磁盘、磁带、磁鼓
- 【非易失】磁芯存储器:硬磁材料的环状元件
- 【非易失】光盘存储器:激光、磁光
按数据保存方式分类
- 随机存储器(RAM)
- 易失性
- 静态随机存储器、动态随机存储器
- 只读存储器(ROM)
- 非易失性
RAM 和 ROM 是一种分类,常见的还有一种分类是 Flash 和 Hard Disk。其中 Flash 指 Solid State drives(SSDs),Hard Disk 指硬盘。
按数据存取方式分类
- 直接访问
- 访问时间不随访问位置而变化
- 内存
- 串行访问
- 访问时间随访问位置而变化
- 磁带
- 部分串行访问
- 介于上述二者之间
- 磁盘(寻道直接,等待串行)
3.2 静态随机存储器(Cache)
3.2.1 MOS 管
MOS 管工作在开关状态:饱和导通 & 截止
开关电路
在栅极加一个高电平时,MOS管就导通,低电平则截止。
NMOS 反相器(非门)
两个MOS管串联而成, T 1 T_1 T1 总是导通状态,且 T 1 T_1 T1 导通内阻是 T 2 T_2 T2 的 100 倍以上。
- T 2 T_2 T2 为高电平, T 2 T_2 T2 导通。由于分压, T 1 T_1 T1 分得大量电压,因此输出引脚变为低电平。
- T 2 T_2 T2 为低电平, T 2 T_2 T2 截止,其电阻变得非常大,因此 T 1 T_1 T1 分压极少,输出引脚变为高电平。
3.2.2 基本单元电路
基本单元电路
上述单元电路中,{ T 1 、 T 2 T_1、T_2 T1、T2},{ T 3 、 T 4 T_3、T_4 T3、T4},{ T 1 、 T 3 T_1、T_3 T1、T3},{ T 4 、 T 2 T_4、T_2 T4、T2} 均构成了一对 NMOS 反相器。
- 若 A A A 为低电平,则 T 1 T_1 T1 截止, A ′ A' A′ 为高电平,则 T 2 T_2 T2 导通, A A A 为低电平。形成了互相制约的一种关系。
- 若 A A A 为高电平,则如上述分析一致。
基本单元电路特性
- T 1 T_1 T1 ~ T 4 T_4 T4 构成互锁的触发器, A A A 和 A ′ A' A′ 点的电位总相反, A A A 点电位定义为二进制位的值。高电平则保存了逻辑 1 1 1,反之为逻辑 0 0 0。
-
T
5
T_5
T5 与
T
6
T_6
T6 也相当于一把锁,控制内部数值与外部的联系。
- 当 T 5 T_5 T5、 T 6 T_6 T6 导通时,可通过位线改变其值。
- 当 T 5 T_5 T5、 T 6 T_6 T6 截止时,只要不掉电,状态一直保持。
- 静态随机存储器靠寄存器来存储信息,因此不需要刷新。
基本单元电路扩展
在 T 5 T_5 T5 与 T 6 T_6 T6 外面再加两把锁 T 7 T_7 T7 与 T 8 T_8 T8,则保证除非两把锁都打开,互锁的触发器才可以和外界通信。否则只要不掉电,信息永久保持。
3.2.3 基本单元电路举例
读操作
先打开行、列片选信号,再另读选择有效。最后从 T 6 T_6 T6 将数据读出。
写操作
写操作要注意 A A A 与 A ′ A' A′ 均要写,因此左边的写放输出需反向。
Intel 2114 举例
每个方框都是一个六管存储单元。因此行地址译码控制 T 5 T_5 T5、 T 6 T_6 T6,列地址译码控制 T 7 T_7 T7、 T 8 T_8 T8。其中 4096 个存储单元分为四组,每组 64 行,16列,采用重合法译码。
3.3 动态随机存储器
3.3.1 三管动态随机存储器
在上述基本电路中, T 4 T_4 T4 充电,电路开始工作。
读过程
- 读选择线置1, T 2 T_2 T2 导通;读数据线也置1
- 若 C g C_g Cg 上为1,则 T 1 T_1 T1 导通,读数据线返回 0
- 若 C g C_g Cg 上为0,则 T 1 T_1 T1 截止,读数据返回 1
写过程
- 写选择线置1, T 3 T_3 T3 导通
- 写数据线置1,则写入1;置0则写入0
3.3.2 单管动态随机存储器
字线置1,表示片选到了这个单元。
读操作
- 电容上有电荷,则数据线上有电流,为1
- 电容上没有电荷,则数据线上没有电流,为0
写操作
- 数据线置为1,则给电容充电
- 数据线置为0,则对电容进行放电
3.3.3 动态随机存储器缺陷
- 上述两种电路,对这个基本单元电路的 “读” 都是一种破坏性的 “读”。
- 上述两种电路依靠电容充放电来保存信息。而电容存在漏电流,电荷会自动泄漏。
3.3.4 刷新
解决方案
- 读出放大器
- 当读取动态随机存储器的一个二进制位时,电容充放电本身的电荷量非常小,因此需要一个读出放大器进行读取和放大。
- 读出放大器会在读出数据后立刻写回到电容中,解决 “破坏性读出” 的问题。
- 刷新
- 电容漏电的时间间隔为 2 m m 2mm 2mm,因此在 2 m m 2mm 2mm 内对每一个二进制进行一次读操作,即可保证电容数值不变。
集中刷新
集中刷新即是在一个刷新周期内,前面的时间均正常工作,而将最后的时间用于刷新。
下面给出一个例子,假设存取周期为 0.5 u s 0.5us 0.5us,128*128的矩阵,按行刷新,需要刷新 128 次。刷新周期为 2 m m 2mm 2mm,即可以存取 4000 次,因此我们将 0~3871 存取周期用于正常工作,3872~3999 这 128 个周期用于刷新。
上述例子中,“死区” 为 0.5 u s ∗ 128 = 64 u s 0.5us*128=64us 0.5us∗128=64us,“死时间率” 为 128 4000 = 3.2 % \displaystyle\frac{128}{4000}=3.2\% 4000128=3.2%。
分散刷新
将存取周期 t c t_c tc 分为两段,前半段用于工作,后半段用于刷新,即 t c = t M + t R t_c=t_M+t_R tc=tM+tR,不存在停止读、写操作的死时间,但效率低下。
无时无刻不在刷新, 0.5 u s 0.5us 0.5us 用于工作, 0.5 u s 0.5us 0.5us 用于刷新,因此每 128 u s 128us 128us 就全刷新一遍,浪费的效率达到了 50 % 50\% 50%。
异步刷新
2 m m 2mm 2mm 时间内需刷新 128 次,因此每 15.6 u s 15.6us 15.6us 就刷新一行,死区时间仅为 0.5 u s 0.5us 0.5us。
指令的执行分别取指、译码、执行,因此如果把刷新安排在指令译码阶段,则不会出现 “死区”。
3.3.5 引脚复用技术
受封装技术的限制,无法保证在有限的芯片面积或周长的前提下引出这么多的引脚,因此动态随机存储器采用了一种引脚复用技术。
将芯片的地址引脚数目设置为需要数目的一半,分别通过两个时钟周期送入两批地址信号,然后在芯片内部将两批地址信号合并为完整的地址信息再去寻址。
3.4 存储器的扩展方式
3.4.1 字扩展
字扩展即是对于数据线进行扩展,具体扩展如下所示。
用 1 K ∗ 4 1K*4 1K∗4 芯片组成 1 K ∗ 8 1K*8 1K∗8 的存储器,对数据线进行扩展。
3.4.2 位扩展
位扩展即是对于地址线进行扩展,具体扩展如下所示。
用 1 K ∗ 8 1K*8 1K∗8 芯片组成 2 K ∗ 8 2K*8 2K∗8 的存储器,对地址线进行扩展。
3.4.3 字、位扩展
字、位扩展即是对数据线和地址线同时进行扩展,具体扩展方式如下图所示。
用 1 K ∗ 4 1K*4 1K∗4 芯片组成 4 K ∗ 8 4K*8 4K∗8 的存储器,利用 2-4 译码器扩展地址线,同时扩展数据线实现字、位同时扩展。
3.5 Cache 的工作原理
3.5.1 Cache 的提出
问题提出原因
- 解决 CPU 和存储器速度差异的矛盾
- 解决 CPU 访存优先级低于 I/O 的问题
- CPU 访存优先级低于 I/O 是因为,如果 I/O 中数据不及时取走,可能就会被冲刷掉。
理论基础
- 时间局部性原理
- 空间局部性原理
3.5.2 Cache 块替换算法
- 先进先出算法(FIFO)
- 最近最少使用算法
- 随机算法
3.5.3 Cache 工作过程
CPU 工作过程
3.5.4 Cache 映射方式
直接映射
最直接的映射方式,每4个对应一组进行分配。
全相连映射
多对多映射,主存中的任一块可以映射到 Cache 中的任一块。
组相连映射
结合上述两种映射方式,划一个组专门用于存储 % 4 = 0 \%4=0 %4=0 的主存块。
三种方式比较
- 直接映射:某一主存块只能映射到唯一缓存块。映射方式简单,但是不够灵活,容易导致块冲突。
- 全相联映射:某一主存块可映射到任一缓存块,最灵活,不易冲突,但需要采用相联存储器。
- 组相联映射:某一主存块可映射到某一组中的任一块,兼顾了灵活性和成本。
3.5.5 Cache 的一致性问题
写直达法(Write - through)
- 写操作时既写入Cache,也写入主存。
- 写操作时间变为访问主存所需时间。
写回法(Write - back)
- 写操作时只写入 Cache,不写入主存,当 Cache 被替换出去时才写回主存
- 命中时读写操作时间就是访问 Cache 的时间
3.6 多模块存储器
3.6.1 单体多字系统
结构概述
一个存储体,但对每次读出的字长进行扩充。一个存取周期取出 4 个字,然后逐次送至 CPU 执行,适用于指令或数据在内存中连续存放的情况。
优缺
-
取指冲突
- 例如出现了转移指令,则之后多取出的指令均浪费
-
读操作数冲突
-
需要的两个操作数分别为 0x12 和 0x34,因此读了8个字,但只有2个字有效,其余均为浪费。
-
写数据冲突
- 每次修改或写数据,都必须凑齐 n n n 个字才能写,或者 “读-改-写”
3.6.2 多体并行系统
存储体
存储体为具有独立地址寄存器、数据寄存器、地址译码、驱动电路、读写电路等功能的独立存储电路,可独立工作。
多体并行
存储器由多个存储体构成,各存储体有相同的容量和存取速度。
高位交叉编址
即对于每个体按顺序向下编址。
优缺点:
- 频繁访问单个存储体时,吞吐量无法提升
- 不同请求源可同时对各体发出请求,此时各体可同时工作
- 便于存储器扩充
低位交叉编址
即轮流依次编址。
优点:
- 在不改变存取周期和数据总线宽度的前提下,增加了存储器的带宽
- 可利用其它存储体寻址的时间继续操控其它存储体
- 连续运行时,每个时钟周期即可完成一个数据传输
3.7 数据校验码
3.7.1 码距
定义
一种编码体系中,任意两组合法编码之间不同的二进制位数的最小值,叫做这种编码的码距。
码距公式
码距决定了编码的纠错和检错能力。
L: 码距,D: 检错位数,C: 纠错位数
L
−
1
=
D
+
C
L-1=D+C
L−1=D+C
所有的校验码(如奇偶校验码、循环冗余校验码、海明码)都是通过增加码距来提高纠错和检错能力。
3.7.2 模 2 运算
模 2 加减运算规则
按位模2相加减,不考虑进位和借位。
模 2 乘
按模 2 加求部分积之和。
模 2 除
按模 2 减求部分余数。
3.7.3 多项式和编码的对应关系
M ( x ) = C k − 1 x k − 1 + C k − 2 x k − 2 + . . . + C i x i + . . . + C 1 x + C 0 M(x)=C_{k-1}x^{k-1}+C_{k-2}x^{k-2}+...+C_{i}x^{i}+...+C_{1}x+C_0 M(x)=Ck−1xk−1+Ck−2xk−2+...+Cixi+...+C1x+C0
例如 M ( x ) = x 3 + x + 1 M(x)=x^3+x+1 M(x)=x3+x+1,对应编码为 1011。
编码左移 r r r 位,对应的多项式为 M ( x ) x r M(x)x^r M(x)xr。
3.7.4 循环冗余校验码(CRC编码)
概念
- 在 K K K 位信息码后再拼接 r r r 位的校验码,整个编码长度为 N N N 位,这种编码又叫 ( N , K ) (N,K) (N,K) 码。
- 对于一个给定的码,可以证明存在一个最高次幂为 N − K = r N-K=r N−K=r 的多项式 G ( x ) G(x) G(x)。根据 G ( x ) G(x) G(x) 可以生成 r r r 位校验码,而 G ( x ) G(x) G(x) 叫做这个 CRC 码的生成多项式。
举例
总结
- 确定生成多项式 G ( x ) G(x) G(x) 的最高次数为 r r r
- 原始报文 M ( x ) M(x) M(x) 左移 r r r 位
- 用左移后的报文 M ( x ) x r M(x)x^r M(x)xr 模 2 2 2 除以生成多项式,取余数 R ( x ) R(x) R(x)
- 将余数 R ( x ) R(x) R(x) 拼接在原始报文 M ( x ) M(x) M(x) 右侧,即得 CRC 编码