前置概念
译码器:
输入n 输出2^n个结果 ,本质上是将输入的n位二进制位转化为对应的十进制 ,决定了2^n线中哪根唯一的线变为高电平
多路选择器(MUX): 从多路输入数据 中选择其中一路 送至输出端 ,将每个输入通路标号 ,并由控制选择信号 控制输出哪一路的数据
锁存器: 在数字电路中,可以存储一个二进制位的器件 称为存储单元电路
存储单元电路又分为:
锁存器: 用于存储一位二进制数据
与非门电路 :先 && 再!,
Reset-Set锁存器
S=0 R=0:无效状态
S=1 R=0:R=0,Q一定为1,G1输入两个1,Q`为0,写入1
S=0 R=1:S=0,Q`一定为1,G2输入两个1,Q为0,写入0
S=1 R=1:读取存储器中保存的数据
门控D锁存器: 解决了BS锁存器无效状态的缺陷,并引入同步控制机制
C =1 D =1:写入1 C =1 D=0:写入0
C=0 D=x:读取存储器中保存到数据
**或非门电路:**先 || 再 !
触发器: 将门控D锁存器的控制信号换成时钟信号,并且只有在时钟信号发生跳变的那一瞬间读取并保存数据。
边沿D触发器:将两个D锁存器串联起来,当C
在下降沿到来之前 ,就先将数据保存好 。当下降沿到来时,数据输入保持一段时间。并经过一定的延迟时间 ,将数据保存并输出
寄存器
暂存寄存器
一个边沿D触发器 可以保存一位二进制位,那么多个边沿D触发器组合在一起就可以存储一系列二进制数据

这样组合的弊端是,每次遇到时钟下降沿,并且信号输入端有稳定的信号,那么就会更改触发器中的值,为了避免这种情况,可以引入**"写使能信号"**

当WE=1并且达到时钟下降沿才会修改数据
通用寄存器组
多个暂存寄存器组合到一起 ,形成通用寄存器组 ,每个寄存器都有自己的设备编号

每个通用寄存器组有两个读口 ,通过多路选择器MUX 来控制要读取哪个寄存器中的值,两个读口可以并行输出
通用寄存器有一个写口 ,通过译码器 来选择要写入的寄存器编号,并由写使能信号WE 和时钟信号CLK,来控制写入时机
机器字长 表示CPU一次能够处理数据的位数 ,通常与CPU寄存器位数有关
半导体存储芯片
只读存储器
在正常工作时只能读取数据
切断电源,信息也不会丢失
存储那些不经常改变的信息
固定ROM(掩膜只读存储器)
内部的数据是在出场时就设置好的,无法进行修改

由地址译码器和储存阵列两部分组成,储存阵列又由地址线和字选择线组成。
位线通过下拉电阻接地 ,表示默认为低电平0
N根地址线 可以传输N位二进制位 ,经过译码器可以输出2^N 个结果,每个结果只对应一根字选择线 。被选择的字选择线输出高电平 ,其余字选择线输出低电平
某些位线与字选择线通过二极管相连,相连的 位线可随字选择线输出高电平1
一次性读出来的M位二进制 称为一个存储字 (存储单元),存储字长 就是M
图中位线与字选择线的交叉点 称为一个存储元,有的存储元有二极管,有的没有
优点:存储信息固定,可靠性高
缺点:灵活性差,生产周期长
可编程ROM
可编程ROM与固定ROM大体结构相同,只是存储元结构不同
可编程只读存储器(Programmable ROM)
PROM的每个交叉点都连接着二极管和熔丝 ,所以位线与字线每一个连接点都是联通的 ,出场时读取默认都是1。如果需要将某一位写入0 ,就需要使用烧录器 将那个连接点的熔丝熔断。因为只能写入一次,也称为一次编程型ROM

可擦除可编程只读存储器(EPROM)
EPROM的每个交叉点都连接着叠层栅注入MOS管 ,每个MOS管由浮栅和控制栅 组成。控制栅 连接字选择线 ,浮栅 被绝缘的二氧化硅 包裹,源极S接地 ,漏极D接位线 。这里的位线没有接地,而是接在了"灵敏放大器"的控制电路
当要读取数据时 ,灵敏放大器会给位线进行加压,当字选择线给G端加上正电压时。控制栅会将P型硅衬底的电子吸引到表层去,使S(源极)和D(漏极)接通 。使得漏极的电压下降 ,控制电路检测到电压下降 ,判定这个管子是通的 ,于是输出逻辑1
写入0 :给控制栅、漏极D 同时施加高压 ,击穿绝缘的二氧化硅,使电子进入浮栅 。撤掉电压,电子无法逃逸。浮栅的负电荷大幅提高了管子的开启电压 ,使常规的读取电压无法 形成导电通道。位线保持高电压,控制电路判断这个管子是断的 ,输出逻辑0
使用紫外线(擦除器) 可以将浮栅中的负电子消除
优点:反复擦除,多次写入缺点:写入耗时久 。并且擦除时,所有数据都会消除

电擦除电改写只读存储器(EEPROM)
使用电来擦除 ,可以选择只擦除一个字

总结

随机存取存储器RAM
随机:按地址访问存储单元,随机就是指每个地址译码时间是一样的,是一个常数。
非随机访问(顺序访问): 像是顺序表,要想访问下标为10的元素,就要遍历前10个元素
线性译码法
存储矩阵是一维数组结构,n根地址线,对应2^n选择线
一个存储字的大小是8B(64位)
4GB=4*1024*1024*1024 B / 8B = 2^29个存储字
也就是说需要29根位线,位线数目太多

二维译码法
存储矩阵是二维数组结构
1 X地址译码器有三根地址线 ,对应8根行选择线 ;Y地址译码器有三根地址线 ,对应8根列选择线 。XY就可以定位到64个存储元的位置。
2 每个存储元都有一根线与读写控制器 相连,负责读取二进制位
- 选择线个数:2*log(n/2)

这样的一个单元每次只能读取一个二进制数,当八个这样的模块连在一起,就可以一次性读取八个相同位置的存储元中的二进制数。

二维译码结构存储器芯片内部结构图:
- CPU将目标地址存放在**MAR(内存地址寄存器)**中
2.片选CS: MAR中最高位 的几根红线连到了一个单独的译码器 ,在实际计算机内部有很多快内存芯片。这根线决定当前这块芯片是否被选中
3.**读写WE:**CPU发出控制信号,告诉芯片是读还是写
- 列线只负责选择 ,行线(字线 )负责激活存储单元 。所以行线需要很强的电信号 ,驱动器则负责增强电信号

静态RAM(SRAM)
静态随机存取选择器,只要持续供电 ,将数据就永久保持 。读写的本质是通过开关联通外部电路,要么强行改写双稳态状态,要么无损读取双稳态状态
基本结构:
一根字线,两根列线
T3 T4(PMOS,低电平 导通**):门控管,** 负责控制数据读写与保存
T5 T6 (NMOS管,高电平 导通**):负载管,** 接在高压电源Vcc上,负责为AB提供高电平
T1 T2(NMOS管,高电平 导通**):工作管,**负责形成双稳态
如果A为高电平 ,顺着连线,导致T2导通 ,使B接地 ,B为低电平。
B为低电平,所以T1不导通 ,以至于A无法接地 ,保持高电平

SRAM写:
假设现在A为低电平,B为高电平。
首先字选择线W置为高电平,使T3,T4打开
读写控制器向位线D1输入低电平,T4门控管导通,使得B点位下降。
由于B点电位下降,T1不接通 。T5连接VCC,导致A变成高电平
由于A变为高电平,使得T2接通 ,B点接地,维持低电平

SARM读:
首先字选择线W置为高电平 ,使T3,T4打开
读写控制向两根线输入高电平 (预充电 ),由于T2是通的 ,导致B点接地 ,使得位线D1电压下降
读写控制器在D1上检测到电压下降 ,判断读0 ,没有电压下降则读1

SRAM存储阵列:
写数据:
每个存储单元有一根行线,两根位线
字线 负责激活存储单元 ,列线 负责选择存储单元
控制端收到WE=0 表示要写数据 ,数据线传输要写的数据
根据数据线,判断向哪根位线输入低电平

读数据:
WE=1,向两根位线传输高电平
通过读写控制器中 的灵敏放大器 来判断哪根位线出现差分电压
根据微小方法器的结果判断输出0还是1

SRAM存储阵列:
读周期: 是对芯片进行两次连续读操作的最小间隔时间
1. 地址有效
- 片选CS,读写WE开始读取内存中的数据
片选CS: 负责定位要操作的存储器芯片 ,片选有效
读写WE: 保持高电平,写读信号有效
- 经过Ta时间,数据开始稳定,开始输出
存储器在读完一次数据后,内部电路需要一点时间恢复原状,才能进行下一次读取所以:
Trc读周期 > Ta(读出时间/存取时间)
- 地址或片选失效 后,数据依旧保持一段时间的稳定,保证数据有效
5 最后输出驱动器关闭,Dout回到高阻态,本次读周期结束

写周期:是对芯片进行两次连续写操作的最小间隔时间
**地址有效:**首先保证地址有效,经过Taw时间译码完成后,片选器,读写器开始输出有效信号。
**数据有效:**Din 写入数据在写信号结束前准备好,写信号结束后,保持一段时间。因为从WE指令停止到内部晶体管关闭有一定物理延迟,要确保这段时间数据存在。
3.**WE/CS有效:**当CS WE输出低电平时,开始写入,写入时间长度为Tw
保证地址有效后,Dout线上显示的是上一个地址的残余数据或者由于内部电路开始翻转而产生的无效数据

特点:
使用双稳态触发器表示0 / 1
电源不掉电 的情况下,信息稳定保持(静态)
存取速度快 ,容量小 ,价格高
常用作Cache高速缓冲存储器
动态RAM(DRAM)
电容内有电荷 :存储1
电容内无电荷 :存储0
再生 :读出后,信息可能被破坏,需要重写
刷新:经过一段时间后 ,电容会缓慢放电,信息可能会丢失,需要重写

写操作
字选择线激活存储元 ,使MOS管导通
位线(数据线)输出高电平 ,写入1
位线(数据线)输出低电平 ,原本电容内有电荷则会流入Cd ,写入0

读操作:
1. 字选择线激活存储元,使MOS管导通
2. 如果电容没有电荷,则位线上没有电流 ,判断为0
如果电容内存在电荷,则位线上出现电流 ,判断为1 。因为电容内的电荷流出,所以叫破坏性读出。电容内的电荷重新充入,称为再生

DRAM存储芯片
存储芯片读/写:
WE=0, 触发写操作。根据数据线判断是充电还是放电
WE=1, 触发读操作,位线输出低电平,根据是否有电流流过,来判断是1还是0

存储芯片结构:
行地址译码器和列地址译码器连接到的是地址缓冲器,行列地址分时送入
CPU给出RAS低电平信号 ,表示此时地址缓冲器内存储的是行地址
CPU给出的CAS低电平信号 ,表示此时地址缓冲器存储的是列地址
先行有效,再列有效
采用地址复用技术

DRAM读周期:
RAS下降沿 读取行地址,确保行地址有效
行地址稳定后,在读周期内WE始终保证高电平1,确保芯片处于读模式
3.下降沿 读列地址 , 确保列地址有效,然后数据开始有效
最后列地址,WE,行地址依次失效
行地址失效后,数据仍保证一段时间的有效
因为DRAM是破坏性读出,所以读周期内芯片内部会自动重写

写周期:
RAS下降沿 读取行地址,确保行地址有效
WE在列地址之前给出低电平 ,表示写操作 。然后数据有效
CAS下降 沿读取列地址 ,确保列地址有效,然后开始写入
先撤销读写信号 ,然后撤销列地址 ,最后撤销行地址。

刷新操作:
刷新: 经过一段时间后,电容会缓慢放电,信息可能会丢失,需要重写
刷新周期: 上次对整个存储器刷新结束时 作为起点,到下次对整个存储器全部刷新一遍为止的时间间隔
刷新计数器负责提供行地址 ,二路选择器负责判断是使用刷新计数器提供用于刷新的行地址 ,还是行地址缓冲器提供用于读写的行地址
刷新行数: 单个芯片的单个矩阵的行数 ,同一行同步被刷新 。刷新一行的时间就是一个存储周期 ,读即刷新
单元刷新时间间隔 :DRAM允许的最大信息保持时间 ,一般为2ms
现代公认为64ms
集中刷新:
集中刷新时间: 128*500ns=64us
**死时间:**在这64us内,不允许访存
分散式刷新: 将系统存储周期 分为访存(存储器存储周期)和刷新 两个子周期 。使刷新周期可以大幅减少**:刷新行数*系统存储周期**
缺点:存储周期变长,不必要刷新次数太多
异步刷新: 在2ms内分散地把各行刷新一遍
避免了分散式刷新中不必要的多次刷新,提高了整机速度
刷新信号的周期:2ms/存储器行数
两者对比

主存储器与CPU连接
存储芯片
不考虑内部的存储结构:
地址复用
地址:11位
数据:4位(存储字长)
容量:2^11 * 2^11 * 4位

交互方法
存储器容量=存储字数量*存储字长=2^地址总线 * 数据总线
CPU通过主存控制器与存储芯片交互,一般来说主存控制器集成在CPU内部
CPU地址线低位 连接存储芯片地址线,高位地址线参与形成存储芯片的片选信号
扩展主存储器容量
位扩招:增大存储字长
字扩展:增加存储字数量
字位扩招:同时增大存储字长,增加存储字数量
位扩展
1K*4 -> 1K*8

连在一起:地址线,读写信号WE线,片选信号CS线
并联:数据线
字扩展
1K*8 -> 2K*8

连在同一根数据线,地址线,读写信号WE上
存储器地址线剩余的高位,通过译码器产生片选信号
字位扩展
先对每一组进行位扩展,然后通过片选译码器对整个进行字扩展

提高主存储器的速度
提高存储芯片的速度
同步RAM(SDRAM)
早期的计算机,CPU和主存之间就是采用异步的方式进行通信
CPU向主存储器发送要访问内存的地址,以及读命令
主存储器从接到命令到准备好数据的这段时间,CPU进入等待状态 ,并检测MFC信号
主存储器准备好数据之后,发送MFC指令,通知CPU
CPU接到指令后开始接收数据
浪费了CPU的时间,在存储器读取数据的区间,CPU完全可以做其他的事
同步DRAM
采用同步通信 ,T1 T2 发送地址和指令,T3~T6主存储器准备数据,这段时间CPU可以执行别的操作,T7CPU开始接收数据
行缓冲器:
地址线给出行地址 ,将那一行的所有数据保存到更快的SRAM中 ,然后给出列地址,这时就是从SRAM中读取数据

突发传输:
由行缓冲器 实现,先将一行中所有的数据缓存到行缓冲器 中,然后在行缓冲器中读取需要的列,不需要重新传地址和命令。
在行缓冲器 中保存了BL:突发长度
CL :CSA(列地址信号)潜伏期 ,表示从发送CAS命令开始 ,到第一个数据字出现在数据总线上 所需要的时钟周期数
DDR
根据同步DRAM改进,增加数据预取功能
预取深度: 每次从内存阵列中一次性读取的数据位数
总线传输频率: 将数据以二倍于核心频率的速率 ,分两次通过数据线传输给CPU

寻址方式
按字节寻址: 最小可寻址单元为1字节,每个字节都有独立的地址
按字寻址: 最小的寻址地址为一个字 ,最低两位是0,用来存储字内偏移
在CPU和主存之间添加高速缓存(Cache)
为什么使用Cache
CPU运行速度太快,而内存的存取速度太慢,为了避免CPU空等。在CPU和内存之间加一层Cache(静态RAM)作为缓冲,让CPU尽量不使用内存。Cache的速度接近CPU,存放CPU最近最常使用的指令和数据
Cache能够生效的原因:局部性原理
**时间局部性原理:**现在用到的数据,短时间内可能会再用
**空间局部性原理:**如果用到某个数据,其附近的数据可能马上会使用
基本工作原理
CPU发出访存地址 ,同时发给Cache和主存。
如果数据在Cache中,则命中,将Cache中的数据送到CPU中;
如果未命中 ,则从主存 中读取,把该数据所在的一块数据 复制到Cache中,同时将要的数据,发送给CPU。
如果Cache满了,按淘汰算法,淘汰掉指定的块
主存和Cache的映射方式
Cache每次读取的都是一个主存块 ,这个每个主存块的大小是Cache出厂前就设定好的。Cache中每个主存块称为一个Cache行。
直接映射: Cache行号 =主存块号%Cache行数 ,每个主存块映射到一个固定的Cache行
一个主存地址可分为三个部分:
**块内地址位数:**log(Cache块大小),如果主存块大小为32B,块内地址长度就为5
**Cache行号位数:**log(Cache行数),如果Cache行数为4,Cache行号就为2位
标记:除去Cache行号和块内地址,剩下的就是标记号
有效位: 用于标记块内数据是否有效
标记位: 用于标记存放的主存块号
优点: 实现简单 ,命中时间短
缺点:不够灵活,Cache存储空间不能得到充分的利用
全相联映射:一个存储块可装入Cache的任意一行中
每次检查所有的Cache行 ,如果Cache行的有效位为1则检查标记位 ,如果标记位和贮存快号位相等,则命中 。如果遍历一遍都没有命中,则从主存中接收数据 ,并存入Cache中
组相联映射: 将Cache所有的行分成2^N个大小相等的组 ,每组有多个Cache行 ,每个主存块被映射到Cache固定的组 中的任意一行。
主存块与Cache组 是直接映射 ,在Cache组内,主存块和Cache行采用全相联映射
一个Cache组有N行,则称为N路组相联 ,下图是二路组相联的例子
组相联映射的冲突概率比直接映射低,由于只有组内各行采用全相联映射,所以比较器(根据标记位判断存储的是哪个Cache行号)的标记位数和个数都比全相联映射少,易于实现,查询速度也快得多
关联度: 一个主存块映射到Cache中可能存放的位置个数
**直接映射:**1
**全相联映射:**Cache总行数
**N路相联映射:**N
关联度越低:
命中率越低,直接相连的命中率最低,全相联映射的命中率越高
判断是否命中的开销越小 ,命中时间越短
标记所占的额外空间越少
Cache主存块替换算法
对于全相联映射和组相联映射,当映射到的Cache组满了以后,就需要某种替换算法来判断将哪个Cache行替换掉
先进先出FIFO: 总是选择最早装入Cache的主存块替换。
随着分配给系统的Cache行数增加,命中率会降低
最近最少使用LRU: 总是选择近期最少使用的主存块替换,硬件开销最大
假设每组有两个Cache行
未命中且有空余行: 将数据插入空余行 ,将其LRU位设为00 ,其余有效的LRU位加一
命中: 将剩余Cache行中LRU位比命中行LRU小 的LRU位加一 ,然后将命中Cache行的LRU清零
未命中且无剩余行: 将最大LRU位的Cache行替换掉
最不经常用LFU: 替换Cache中访问次数最少的块
未命中且有空余行: 将数据插入空余行,将其计数器设为0
命中: 将命中Cache行的计数器加一
未命中且无剩余行: 将计数器最小的Cache行替换掉
**随机替换算法:**从候选行的主存块中随机选一个替换掉
Cache数据一致性问题
数据一致性问题:数据更新时,Cache内的数据与主存中的不同
**全写贯穿法:**写操作时,若写命中Cache,则同时写Cache和主存
未命中:直接把新数据写入主存(写分配)
写回法: CPU执行写操作时,若写命中,只把数据写入Cache ,同时将这个Cache行打上"脏位"标记。 只有带有脏位的数据行被替换时,数据才被写回主存。
未命中: 将主存数据加载到Cache行,然后对其进行回写法更新
Cache总容量与数据容量
**数据容量:**Cache行数 * 数据块位
Cache总容量= Cache行数 * (状态标签+脏位+替换算法位+标记Tag位+数据块位)
Cache的多层次设计
统一Cache:只有一个Cache,指令和数据混放
分离Cache:分为指令Cache和数据Cache
单级Cache和多级Cache:
一级Cache L1,二级Cache L2,三级Cache L3
使用多级Cache结构可以提高性能
并行存储器结构技术
双口存储器
两个数据口可以同时访问和修改

多模块存储器
每个存储模块有单独的地址寄存器MAR,数据寄存器MDR,地址译码器,驱动电路和读写电路 。可以单独工作

体内部连续方式:
相当于单纯的扩容 ,无法并行读取
连续编址方式:
相当于流水线,可以并行读取
同时启动: 多个存储模块同时读数据 ,并在一个存储器存储周期结束后,一起发给CPU
轮流启动: 每个存储周期启动一个存储模块
第一个字需要完整的存储器存储周期 去取,后续只需等待一个总线传输周期就能连接出来
连续读取m字: 存储周期 + (m-1)总线周期 m>= 存储周期 / 总线周期


























