存储器
- 存储器的分类:
- 存储器的层次结构:
- 三级存储器结构:由高速缓冲存储器、主存储器和外存储器组成
- 内存储器:CPU能直接访问的存储器
- 外存储器:CPU不能直接访问的存储器
- 外存储器的信息必须调入内存后才能由CPU进行处理
- 缓存——主存层次(Cache存储系统):使用硬件(主存储器)控制,解决了速度的问题
- Cache存储系统是为了解决主存速度不足而提出的
- 在Cache和主存之间增加辅助硬件,让他们构成一个整体
- Cache存储系统全部由硬件来调度,对于系统程序员和应用程序员是透明的
- 主存——辅存层次(虚拟存储系统):使用软件(虚拟存储器)控制,解决了容量的问题
- 虚拟存储器是为了解决主存容量不足而提出的
- 在主存和辅存之间,增加辅存的软硬件,使其称为一个整体
- 虚拟存储系统需要通过硬件、操作系统来调度,对于系统程序员为非透明,对于应用程序员是透明的
虽然虚拟存储将主存和辅存统一成了一个整体,但是实际上,CPU仍然只与主存交换信息,由操作系统和硬件共同实现主存和辅存之间的信息自动交换
- 三级存储器结构:由高速缓冲存储器、主存储器和外存储器组成
主存储器
- 主存的基本组成:
- 主存与CPU的关系:
- 主存中存储单元地址的分配:
- 按字寻址:以高位字节或低位字节作为字地址
- 按字节寻址
假设地址线有24根: 若以字节寻址:\(2^{24}=16M\) 若字长16位,按字寻址:\(2^{23}=8M\)(利用1位寻址字中的两个字节) 若字长32位,按字寻址:\(2^{22}=4M\)(利用2位寻址字中的四个字节)
数据的存储和排列顺序
- 想要知道如何取出内存中存放的一个数据,需要知道这个数据在内存中是如何存放的:
- 大端方式:数据低位在高地址
- 小端方式:数据低位在低地址
虽然大端方式的存储便于人类阅读,但是对于计算机来说,处理起来复杂,所以在计算机中,一般都采用小端方式存储数据 如果在存放方式不同的机器间移植程序或数据通信时,会出现字节顺序相反的问题
对齐
- 在各种不同长度的数据存放时,有两种处理方式:
- 按边界对齐
- 字地址:4的倍数
- 半字地址:2的倍数
- 字节地址:任意
- 不按边界对齐:逐字节排序
- 按边界对齐
- 如果不按边界进行对齐,可能会增加访存的次数
主存的性能指标
- 存储容量:主存所能存放二进制代码的总数量
- 存储速度:
- 存取时间\(T_A\):从CPU送出内存单元的地址码开始,到主存读出数据并送到CPU所需要的时间
- 存取周期\(T_{MC}\):连续两次访问存储器所需要的最小时间间隔
- 其中,包括了存取时间
\(T_{MC}>T_A\): 因为存储器在读写操作过后,需要有一段恢复内部状态的时间。 对于破坏性读出的DRAM,存取周期往往比存取时间要大得多,甚至可以达到\(T_{MC}=2T_A\),因为存储器中的信息读出后需要进行重写
- 其中,包括了存取时间
- 存储器带宽:单位时间内存储器存取的信息量
提高主存带宽的措施: 1. 缩短存取周期 2. 增加存储字长 3. 增加存储体
- 可靠性
- 功耗
半导体存储芯片简介
半导体存储芯片的基本结构
- 存储芯片的基本结构: - 译码驱动:把地址总线送来的地址信号翻译成对应存储单元的选择信号 - 配合读写电路,完成对被选中单元的读写操作 - 读写电路:包括读出放大器和写入电路 - 存储芯片通过地址总线、数据总线和控制总线与外部链接 - 控制线: - 读写控制线:决定芯片的行为 - 片选线用来选择存储芯片 - 需要片选线的原因是,半导体存储器是由许多芯片组成的,需要使用片选线来选中某个芯片
其中,地址总线是单向总线,位数与芯片的容量大有关,数据线是双向的,位数与芯片一次可以读写的数据位数有关。 存储芯片容量由地址线和数据线共同决定。 若地址线有10根,数据线有4根,则存储芯片容量为\(2^{10}\times 4 = 4K\)
片选线的作用: - 由于集成芯片容量有限,想要组成一个大的存储器一般需要将多个芯片连接使用。如想要使用\(16K\times 1位\)的存储芯片组成\(64K\times 8位\)的存储器,需要按照如下方式组成一个存储器: - 当芯片的片选信号(\(\bar{CS}\))有效时,芯片才被选中,才能对其进行读写操作
地址译码器的设计
- 线选法:地址译码器只有一个,用一根字线直接选中一个存储单元的各个位
- 缺点:当地址线数量较大,译码器复杂、开销大,使存储器成本迅速增加
- 重合法:使用两个译码器(X地址译码器,Y地址译码器)来选择一个地址
随机存取寄存器(Random Access Memory)
SRAM
六静态MOS管电路
信息存储的原理:可以将其看作是一个带时钟的RS触发器 - 写入时: - 位线上的数据为即将被写入的二进制信息(0/1) - 置字线为1 - 存储单元按位线的状态设置数据 写入时,不论触发器原状态如何,只需要将写入的数据送入\(D_{IN}\)端。通过写放大器后,会使两端输出为相反电平 - 读出时: - 置两个位线为高电平 - 置字线为1 - 存储单元状态不同,位线的输出不同 由于静态RAM使用触发器的工作原理存储信息,因此即使信息被读出后,它仍然保持原有的状态,无须再生。 但是,电源断电后,原存储的信息丢失,故属于易失性半导体存储器。
[!note] SRAM在进行读写的时候,必须要先接收地址信号,在接收片选信号,最后接收读写信号 - SRAM基本电路的读操作: - SRAM基本电路的写操作:
DRAM
- 常见的动态RAM基本单元电路有三管式和单管式两种
- 共同特点:靠电容存储电荷的原理来寄存信息
- 电容上有足够多的电荷:1
- 电容无电荷:0
电容上的电荷一般只能维持1~2ms,因此及时电源不掉电,信息也会自动消失。因此,必须在2ms内对其所有的存储单元恢复一次原状态,这个过程被称为再生或刷新
- 共同特点:靠电容存储电荷的原理来寄存信息
- 三管MOS动态RAM基本单元电路:
- 特点:
- 读出的信息与原信息相反
- 写入与输入的信息相同
- 特点:
- 单管MOS动态RAM基本单元电路:
- 构造:
- 信息记忆在记忆电容\(C_S\)中
- T为门控管,控制数据的进出
- 栅极接读写选择线(字线)
- 漏和源分别接数据线和记忆电容
- 读写原理:在选择线上加高电平,使T管导通
- 写入时:
- 充电为1
- 放电为0
- 读出时
- 有电流为1
- 无电流为0
- 写入时:
- 构造:
DRAM时序
- 行与列地址分开传送
因为DRAM的行、列地址是分别传送的,因此在分析其时序时,需要特别注意\(\overline{RAS}\)、\(\overline{CAS}\)与地址的关系: 1. 先送入\(\overline{RAS}\),在送入\(\overline{CAS}\),因此,需要设置滞后的时间 2. \(\overline{RAS}\)、\(\overline{CAS}\)正负电平的宽度应大于规定值,保证芯片内部正常工作 3. 在两个信号的传输间隔,需要有足够的地址建立时间和地址保持时间,确保地址能够准确的写入芯片
- 读时序:
- 写时序:
DRAM的刷新
- 刷新:将原有的信息读出,在由刷新放大器行程原信息并重新写入的再生过程
- 刷新对于CPU是透明的
- 刷新是按行进行的,每行中的记忆单元同时被刷新
- 因此刷新操作时,仅需要行地址,不需要列地址
- 刷新类似于读操作,但刷新时没有信息的输出
- 刷新无须加片选,整个存储器中所有芯片同时被刷新
- 刷新周期:从上次对整个存储器刷新结束到下次对整个存储器全部刷新一遍为止的时间间隔
- \(2ms\)
- 刷新周期为电容数据有效保存期的上限
[!note] 需要刷新是因为存储电荷的电容会放电,需要不断的刷新,来保持数据
-
计组重点 三种刷新方式:
- 集中刷新:前一段时间正常读写,后一段时间停止读写,集中逐行刷新
- 集中刷新时间长,无法进行正常的读写操作(死区)
- 分散刷新:一个存储周期分为两段,前一段用于正常读写操作,后一段用于刷新操作
- 不存在死区,但每个存储周期加长
- 异步刷新:结合了集中刷新和分散刷新。
假如有4096行,并使用异步刷新的方式对DRAM进行刷新,在64ms的时间内必须轮流对每一行刷新一次,即每\(64ms/4096=15.625\mu s\)刷新一行
- 集中刷新:前一段时间正常读写,后一段时间停止读写,集中逐行刷新
DRAM vs SRAM
- 存储原理:电容vs触发器
- 集成度:高vs低
- 集成度指的是单一芯片中所含有的晶体管数量
- 芯片引脚:少vs多
- DRAM的芯片集成度高
- 功耗:小vs大
在静态的情况下,DRAM的功耗实际上是大于SRAM的,因为DRAM需要将进行刷新,而SRAM不需要,但是在动态的情况下,SRAM的功耗要大于DRAM,因为SRAM中有六个晶体管来存储一个位,二DRAM只需要一个晶体管和一个电容。因此,SRAM在读写操作时,会消耗更多的能量。并且,SRAM的工作电压一般高于DRAM。
- 价格:低vs高
- 速度:慢vs快
- 刷新:有vs无
只读存储器ROM
- ROM:一旦注入原始信息即不能改变
虽然叫做ROM,但是随着用户的需要,后来可读也可写 但是,在进行写操作之前,仍然需要先擦除单元上原有的数据
几种ROM类型
- 掩膜ROM(MROM)
- 以元件的有无表示1/0
- 内容由半导体制造厂按照用户提出的要求在芯片的生产过程中直接写入,写入后无法更改内容
- 有MOS管为1,无MOS管为0
- 优缺点:
- 优点:可靠性高,行程批量之后价格便宜
- 缺点:用户对制造厂的依赖性过大,灵活性差
- PROM(Programmable ROM)
- 允许用户利用专门的设备写入自己的程序,一旦写入后,其内容无法改变
- 熔丝断——0,熔丝未断——1
PROM有两种结构,一种是熔丝烧断型,另外一种是PN结击穿型
- 熔丝断——0,熔丝未断——1
- 允许用户利用专门的设备写入自己的程序,一旦写入后,其内容无法改变
- EPROM(Erasable Programmable ROM)
- 目前使用较多的是由浮动栅雪崩注入型MOS管构成
- 可以由用户利用编程器写入信息,可以多次改写
- 浮栅晶体管:
- 写入:
- 读0:
- 浮栅层中没有电子
- 读1:
- 破坏:
- 分类:
- UVEPROM:用紫外线灯制作的擦除器照射存储芯片上的透明窗口
- 使用紫外线进行擦除的方式,只能对整个芯片进行擦除
- EEPROM:采用电气方法来擦除
- 既可以用字擦除的方式,也可以用数据块擦除方式擦除
RPROM不能取代RAM 原因: 1. EPROM的编程次数有限:隧穿层会磨损 2. 写入时间过长 - 写入过程:先擦除,在写入
- 既可以用字擦除的方式,也可以用数据块擦除方式擦除
- UVEPROM:用紫外线灯制作的擦除器照射存储芯片上的透明窗口
- Flash Memory(闪存)
- 既可以在不加电的情况下长期保存信息,又能在线快速擦除与重写
- 具备了EEPROM和RAM的优点
目前,大多数微型计算机的主板采用闪存来存储BIOS程序,由于BIOS的数据和程序非常重要,不允许修改,早期主板BIOS一般采用PROM或EPROM存储
- 具备了EEPROM和RAM的优点
- 既可以在不加电的情况下长期保存信息,又能在线快速擦除与重写
#计组重点 存储器与CPU的连接
存储器容量的拓展: 由于单个芯片的存储器容量有限,为了组成较大容量的存储器,需要多个芯片进行组合
注意,在画图的过程中,忽略了ROM芯片和RAM芯片的电源和接地端 - 三种拓展方式: - 位拓展:增加存储字长 - 字拓展:增加存储字数量 - 字位同时拓展: - 存储器与CPU的连接 - 地址线的连接:内部地址线、芯片选择线 - CPU地址线往往比存储器地址线多,所以将CPU地址线低位与存储芯片地址相连,CPU地址线高位或作存储芯片扩充,或做他用 - 数据线的连接:数据线对应连接 - 读/写线的连接:对应连接 - 合理选用芯片 - 其他:时序、负载 - 例题4.1: 1. 主存地址分配: - 根据地址范围写出二进制代码,再进行划分操作 2. 选取存储芯片:根据已有芯片,进行选择 3. 画出存储芯片的片选逻辑图 - 分配地址线 - 确定片选信号 地址线上的信号需要做到物尽其用 - 例题4.2 1. 主存地址分配: 2. 存储芯片选择: 3. 画图:
存储器的校验
- 校验码:一种常用的带有发现某些错误或带有自动纠错能力的数据编码系统
- 码距:一种码制中,任意两个合法码字之间的最小距离
- 例子:8421码的码距为1,两个合法码字2(0010)与3(0011)之间的距离为1
- 合理的增大码距能提高检错和纠错的能力
- 常用的校验码:
- 奇偶校验码
- 海明校验码
- 循环冗余校验码
[!一些码距与检错纠错能力的举例] 1. {000, 001, 010, 011, 100, 101, 110, 111} - 码距1 - 无检错纠错能力:0, 0 2. {000, 011, 101, 110} - 码距1 - 检1位错,纠0位错 - 无法确定出错位置在哪一位上 3. {000, 111} - 码距3 - 检1位错,纠1位错 - 100->000, 110->111 4. {0000, 1111} - 码距4 - 检2位错,纠1位错 - 0001->0000, 1110->1111, 0011->? 5. {00000, 11111} - 码距5 - 检2位错,纠2位错 - 00001->00000, 00111->11111.... 由上述案例,可以得出:\(\(L-1=D+C\)\) L:码距 D:检错能力 C:纠错能力
- 码距:一种码制中,任意两个合法码字之间的最小距离
奇偶校验码
海明校验码
循环冗余校验码
提高访存速度的措施
- 采用高速器件
- 采用[[高速缓冲存储器]]
- 采用并行存储器
- 采用多端口存储器
- 采用相联存储器,加长存储器字长
本节所选取的方法主要在于调整主存的结构
单体多字并行主存系统
思想: 由于程序和数据在存储体内是连续的,因此CPU访存取出的信息也是连续的,如果在一个存取周期中,取出连续的多个指令或数据交由CPU,可以增大存储器的带宽,提高单体存储器的工作速率
- 缺点:
- 写入的时候,并不能确定相邻的数据是否合法或有效
- 由于指令和数据在内存中是连续存放的,如果遇到了跳转指令,会导致多取出的指令无效
- 如果想要解决,则需要额外的电路来进行判断
- 写入的时候,并不能确定相邻的数据是否合法或有效
多体并行系统
- 多体并行系统:采用多体模块组成的存储器,这样的系统可以并行工作,也可以交叉工作
- 每一个模块拥有相同的容量和存取速度
- 每一个模块有各自独立的地址寄存器(MAR)和数据寄存器(MDR)、地址译码、驱动电路和读写电路
- 高位交叉:
- 概念:将程序连续存放在同一体中,每个体的的地址空间是主存空间的一部分
- 使用低位地址表示体内地址,高位地址为体号
- 优点:
- 存储器扩充容易
- 适合顺序访问程序,减小切换开销
- 缺点:
- 不适合并行处理多个程序
- 因为不同程序段可能在不同体中,造成冲突和延迟
- 不适合并行处理多个程序
- 低位交叉:
- 概念:将程序连续存放在相邻体中,每个体的地址空间为主存地址空间的一个周期
- 使用高位地址来表示体号,低位地址表示体内地址
- 优点:
- 适合并行处理多个程序,因为不同程序段在相邻体中,可以同时访问
- 缺点:
- 不适合顺序访问程序,因为统一程序段在不同体中
[!对于低位交叉的一些讨论] 如果联想到总线中的总线通信控制中的分离式控制,我们可以很好的利用空闲时间,在取前一个存储体数据时,后一个存储体可以同时在准备数据,提高效率 假设每个体的存储字长和数据总线宽度一致,假设模块数为n,存取周期为T,总线传输周期为\(\tau\),则应该满足:\(T = n\tau\) - 在第一个存储周期的开始时刻启动模块M0,在Tm/4、Tm/2、 3Tm/4时刻分别启动模块M1、M2、M3 - 在理想的情况下,数据传送的平均速度可以提高到原来的四倍 但是就像单体多字一样,如果遇到程序转移或随机访问少量数据,访问地址就不一定均匀分布在多个存储模块之间,这样的冲突降低了使用率
- 不适合顺序访问程序,因为统一程序段在不同体中
- 存储器控制部件
- 功能:合理安排各个部件请求访问的顺序,控制主存读写操作
- 排队器:
- 易发生代码丢失的请求源,优先级最高
- 严重影响CPU工作的请求源,优先级次高
[!排队器举例 ] 写数请求高于读数,读数请求高于读指令 如果运算部件不能尽快送走已经算出的结果,会严重影响后续指令的执行,因此,发生这种情况时,写数的优先级比读数、读指令都高。 若没有操作数参与运算,取出更多的指令也无济于事,因此,读数的指令比读指令高
多端口SRAM
单端口存储器任一时刻只能接收来自CPU和IO中一方的访存请求,是串行工作模式 - Multi-SRAM:进行数据共享的多个不同设备需要异步访问保存在同一存储体的信息 - 具有两个或多个端口,不同端口分别连接不同的设备 - 仲裁的情况: - 两个端口同时读,不进行仲裁 - 一个端口读,另一个端口写,需要进行仲裁 - 两个端口同时读,需要仲裁 读写冲突使数据不可预测: 解决方法:增加额外的读周期,使写操作的多组指定地址只通过一个端口输入
双端口存储器
- 读端口随机存储器由两个访问端口,即两套MAR、MDR、地址译码器和读写电路,两个端口分别连续两套独立总线,同时接收来自两方的访存请求,使存储器并行工作
- 两个访问端口独立工作互不干扰
- 只有当两个端口视图在同一时间访问同一地址单元,才会发生冲突