# 08-内部存储器

{% hint style="info" %}
本讲关注存储器层次架构中的“主存”部分
{% endhint %}

## 存储器

由一定数量的单元构成，每个单元可被唯一标识，每个单元具有储存一个数值的能力

* 地址：单元的唯一标识
* 地址空间：单元总数
* 寻址能力：单元储存信息的位数

## 半导体存储器

### 位元 Memory Cell

* 半导体存储器的基本元件，储存1位数据
* 特性
  * 呈现两种稳态/半稳态：对应0&1
  * 至少能被写入1次
  * 能被读取

### 分类

| 类型              | 种类          | 可擦除性   | 擦除级别 | 写机制    | 易失性 |
| --------------- | ----------- | ------ | ---- | ------ | --- |
| 随机存取存储器 RAM     | 读-写存储器      | 电可擦除   | 字节级  | 电      | 易失  |
| 只读存储器 ROM       | 只读存储器       | 不可擦除   | -    | 掩膜（光刻） | 非易失 |
| 可编程ROM PROM     | 主要进行读操作的存储器 | 不可擦除   | -    | 电      | 非易失 |
| 可擦除PROM EPROM   | 主要进行读操作的存储器 | 紫外线可擦除 | 芯片级  | 电      | 非易失 |
| 电可擦除PROM EEPROM | 主要进行读操作的存储器 | 电可擦除   | 字节级  | 电      | 非易失 |
| 快闪存储器           | 主要进行读操作的存储器 | 电可擦除   | 块级   | 电      | 非易失 |

## RAM

* 可快速读/写
* 易失：供电中断后数据消失

### 动态RAM DRAM

* 在电容器上用电容充电的方式储存数据：有电荷1，无电荷0
* 需要周期性充电刷新：电容漏电
* 通过阈值判断为1或0
* 地址复用：$$2^{2n}$$的地址只需用$$n$$根线，先传行，再传列

### 静态RAM SRAM

* 使用触发器、逻辑门储存二进制值
* 有电源就可以维持数据
* 行列独立：SRAM的储存线性排列，$$2^{n}$$的地址用$$n$$根线

### DRAM vs SRAM

* 相同：易失，需持续供电
* 不同
  * DRAM比SRAM具有更简单、更小的位元，但需要能刷新的电路
  * DRAM密度更高，价格更低，功耗低：结构简单，元件少
  * DRAM速度慢：需要刷新
* DRAM用于大容量存储器（主存），SRAM用于高速缓存

### 高级的DRAM架构

#### 同步DRAM SDRAM

* 传统DRAM是异步的
  * 处理器向内存提供地址、控制信号：在xx读/写数据
  * DRAM执行内部功能，处理器等待存取时间的延迟
  * 在延迟后DRAM读/写
* SDRAM的读写受系统时钟控制，以总线的最高速度运行，无需插入等待状态
* 在SDRAM处理读写时，CPU可完成其他工作
* 每周期向CPU传送一次数据

#### 双速率DRAM Double-Data-Rate SDRAM DDR

* 每个时钟周期发送两次数据，一次在时钟脉冲的上升沿，一次在下降沿
* DDR->DDR2->DDR3->DDR4：提高RAM芯片的操作频率和预取缓冲区

## ROM

### 只读存储器 ROM

* 非易失
* 只能写入一次，此后可读不可写
* 应用：防止数据篡改的场景（微程序设计、系统编程、函数表……）
* 问题
  * 无出错处理机会：写错即报废
  * 用户无法写入数据

### 可编程ROM PROM

* 非易失
* 只能写入一次，此后可读不可写
* 与ROM的不同
  * 写入时用特殊设备
  * 电写入
* 对比
  * ROM：大批量生产
  * PROM：灵活

### 可擦除PROM EPROM

* 光擦除
  * 紫外线下
  * 所有单元重置
  * 耗时约20min
* 电写入
* 比PROM更贵，能多次改写

### 电可擦除PROM EEPROM

* 电擦除
* 随时写入
* 擦除范围小：字节级
* 耗时相对较短，写需几百微秒
* 比EPROM更贵，密度低，支持小容量芯片

### Flash Memory

* 电擦除
* 擦除时间在EPROM和EEPROM之间
* 擦除范围在EPROM和EEPROM之间：块级擦除
* 密度达到EPROM
* 价格在EPROM和EEPROM之间

## 从位元到主存

### 寻址单元

* 由若干相同地址的位元组成
* 寻址模式：Byte（常用）/Word

### 储存阵列

* 方形结构
  * 若$$1\*2^{2n}$$的长方形，需要1个$$2^{2n}$$大小的译码器
  * 若$$2^n\*2^n$$的正方形，则需要2个$$2^{n}$$大小的译码器，更省
  * 方形结构连线长度更短，访存更快
* 随机访问：读取地址->定位行->定位列->选中的耗时相同

### 寻址

* 地址译码器
* $$n$$位地址，$$2^n$$种输出

### 刷新

* 都是逐行刷新
* 行数越多，刷新开销越大

#### 集中式刷新

* 停止读写操作，逐行刷新
  * 逐行：DRAM看成正方形的行数
* 刷新时无法操作内存
* 刷新次数：单个DRAM芯片的行数
  * 并行刷新，与DRAM芯片的个数无关

#### 分散式刷新

* 在每个储存周期中，当完成读写操作时刷新
* 增加储存周期的时间

#### 异步刷新：常用

* 将刷新周期分配给所有行，使得每一行在刷新周期内仅被刷新一次
* 每行各自以刷新周期为间隔刷新
* 效率高

### 芯片

* 芯片引脚
  * Address：A0 –A19
  * Data：D0 – D7
  * Vcc：电源
  * Vss：地线
  * CE：芯片允许引脚
  * Vpp：程序电压
  * WE：写允许
  * OE：读允许
  * RAS：行地址选通
  * CAS：列地址选通

{% hint style="warning" %}
数据线不编码、不复用，有几位数据就是几根数据线，几个引脚。
{% endhint %}

### 模块组织

#### 位拓展

* 拓展位数
* 8块`4k*1bit`=>`4k*8bit`
* 数据线增加，地址线不变

#### 字拓展

* 拓展地址范围
* 8块`4k*8bit`=>`32k*8bit`
* 地址线增加，数据线不变

#### 字、位同时拓展

* 位拓展+字拓展

### 内存条&插槽

* 插槽：组合多个储存模块

### 其他

* 存储器地址寄存器（MAR）的位数取决于设计的最大地址空间而非当前实际安装的内存容量
* 注意选择题里面说xx区域是**RAM**区还是**ROM**区

## 交叉编址

* 在不改变存取周期的前提下，提高存储器带宽，因为可以在一个访问周期下，访问多个不同的存储体
* 访存一次要走4步，4个储存块交叉访问完美利用时间
* 当访存地址在相邻的四次访存中，出现在同一存储块内，就会发生访存冲突

## 大端/小端

* 数据：`12345678H`，假设左侧地址低
  * 大端：`12|34|56|78`
  * 小端：`78|56|34|12`
* 现代计算机常用小端
  * 低字节内存地址低
  * 拓展不用改变数据的起始地址
