跳转至

Chap 7 Memory Basics⚓︎

4765 个字 预计阅读时间 24 分钟

核心知识
  • 内存的基本知识
  • SRAM
    • 位切片
    • 重合选择
    • 字扩展和位扩展
  • DRAM
    • 位切片
    • 刷新
    • 类型:SDRAM、DDR SDRAM、RDRAM

Memory Definitions⚓︎

  • 内存 (memory):由一组存储单元和其他必要电路组成,主要有以下两大类:

    • 随机访问存储器 (random access memory, RAM):数据能够在任何单元之间进行传输,且不依赖于特定的单元的一种内存
    • 只读存储器 (read-only memory, ROM):具体内容见 Chap 5

Memory Organization⚓︎

内存组织 (memory organization)反映了内存中的数据是如何通过地址被访问的。

  • 内存数据 (memory data):在内存中被存储的或被访问的 1 位或一组位
  • 内存地址 (memory address):用来识别特定内存元素的一组位
  • 内存规模 (memory size):字数 ( 即深度,与地址个数相关 ) \(\times\) 位数 ( 即宽度,每个字的位长度 ),比如 2K \(\times\) 8,32M \(\times\) 16

内存的数据类型

  • (bit):单个二进制数字
  • 字节 (byte):连续的 8 位数据
  • (word):一组二进制位,大小一般为内存访问数据的规模,通常是 2 的幂的倍数个 byte,比如 2 bytes, 4 bytes。可以用来表示一个数字,一条指令,一个或多个数字字母字符,或者二进制编码的信息等。

    个人理解:1 个字 \(\approx\) 1 个数据

历史上较为知名的计算机架构及其内存组织
  • PDP-8:使用 12 位地址访问 \(2^{12}\) 12 位字
  • IBM 360:使用 24 位地址访问 \(2^{24}\) 个字节,或者 \(2^{22}\) 个字
  • Intel 8080:16 位地址访问 \(2^{16}\) 个字节

Memory Block Diagram⚓︎

\(2^k \times n\) 的内存单元:

  • k 表示地址线路 (address lines)的宽度,通过译码器,可以得到 \(2^k\) 个地址,每个地址指定一个特定的字
  • n 表示字的位宽,注意:\(2^k \ge n\)
  • 用到了单个控制线路 (control lines),它们是最简单的内存操作
  • 有些内存单元还包括芯片选择 (chip select, CS) / 芯片使能 (chip enable, CE):内存的使能输入

我们常常会看到 RAM 的规模会用 \(xK \times y\) 的表示法

  • 这里的 \(xK\) 是指 \(x Kb\) 大小的深度,那么地址线路个数为 \(\log_2 x + 10\)
  • 这块 RAM 的容量为 \(x \cdot y \cdot 1024\) bit

🌰:\(1024 \times 16\) 的内存单元

该内存具有 1024 个字 ( 地址个数 ),每个字的内容为 16

Basic Memory Operations⚓︎

  • 内存操作 (memory operations):对内存数据的操作,通常是对一些数据元素的 (read) (write)的操作

内存操作需要:

  • 地址 (address):指明需要操作的内存位置,地址线路将这些信息带入内存中
  • 数据 (data):需要写入或读出的数据
  • 操作 (operation):传入内存并由控制信号指明类型的信息。典型的操作是 (read) (write)
连接内存和 CPU 的总线
  • 地址总线 (address bus):指明内存位置
  • 数据总线 (data bus):包含传入 / 出指定位置的数据
  • 控制总线 (control bus):额外的控制,比如芯片选择、读 / 写……

  • :读取内存数据的操作,它的工作流程如下:
    • 将想获取的字的二进制地址放入地址线路上
    • 激活“读”输入
  • :将数据写入内存的操作,它的工作流程如下:
    • 将想获取的字的二进制地址放入地址线路上
    • 将必须存入内存的数据位放入数据输入线路上
    • 激活“写”输入

内存的控制输入

  • 芯片选择 (Chip Select):决定是否进行读或写的操作 ( 使能信号 )
  • / (\(Read/\overline{Write}\)):指定特定的操作 ( 读写二选一 )

功能表如下:

  • 有时读和写的使能线路是一个带有精确时间信息的时钟 ( 比如读取时钟 (read clock),写入频闪 (write strobe))
  • 有时内存必须对完成操作进行响应
异步 RAM vs 同步 RAM
  • 异步 RAM不依赖外部时钟的状态,只要接收到指令就开始读写数据
  • 同步 RAM通过外部时钟进行同步,根据特定的时钟状态读写数据

Memory Operation Timing⚓︎

多数基本内存是异步的,即没有外部时钟 ( 但有内部时钟 ),且受控制输入和地址控制。

  • ( 读取 )访问时间 (access time):从使用地址,到数据输出上数据出现之间的最大时间
  • 写入周期时间 (write cycle time):从使用地址,到所有需要用来存储字的内存内部操作全部完成之间的最大时间

CPU 必须提供一个内存控制信号,使得它自身内部的时钟操作与内存的读写操作同步,这意味着内存的访问时间和写入周期时间,与 CPU 时钟周期的固定数值相关

写操作的关键时间位于 1-0-1 脉冲的边沿处:

  • 地址必须在 1-0 前的一段时间内建立起来,并且在 0-1 之后再消失,以防对其他地址的内容的干扰
  • 数据必须在 1-0 前的一段时间内建立起来,并且在 0-1 之后再消失,确保正确写入

Random Access Memory(RAM)⚓︎

RAM 的类型:

  • 静态 (static):信息被存储在锁存器
  • 动态 (dynamic):信息以电荷的形式被存储在电容 (capacitors) 内,且用 n 型晶体管“访问”电容。由于电容会漏电,因此需要定期刷新 (refresh) 电容的电荷
SRAM vs DRAM

根据对电源的依赖性,我们也可以将内存分为以下两类:

  • 易变的 (volatile):当电源切断时存储的信息丢失
  • 不变的 (non-volatile):当电源切断时仍然保存信息

内存阵列结构:我们可以把内存看作位的二维阵列,每一位用一个单元 (cell) 存储,如下图所示:

注:存储单元通常作为电子电路来设计的,而非逻辑电路。尽管如此,方便起见,我们还是使用逻辑模型描述

Static RAM(SRAM) Integrated Circuits⚓︎

SRAM 的存储单元包括:

  • SR 锁存器
  • 用于控制的选择输入
  • 双轨数据输入 \(B\) \(\overline{B}\)
  • 双轨数据输出 \(C\) \(\overline{C}\)

图示:

  • 输入:

    • Select = 0:保持已被存储的内容
    • Select = 1:存储内容取决于 B \(\overline{B}\) 的值
  • 输出:

    • Select = 0:C = \(\overline{C}\) = 0
    • Select = 1:C 为存储值,\(\overline{C}\) 为其补

Bit Slice⚓︎

要利用 RAM 片构建 RAM IC,我们需要:

  • 译码器:将 n 个地址线路译码为 \(2^n\) 个字选择线路,用于挑选需要读取或写入的字
  • 数据输出上的三态门允许 RAM IC 能被结合为 \(2^n\) 个字的 RAM

这种方法被称为 RAM位切片 (bit slice) ,下图展示了它的模型 ( \(2^n \times 1\) RAM 为例 )

构成:

  • 多个 RAM 单元
  • 控制线路:

    • 字选择 (word select):用于选择对哪一个 RAM 单元进行操作。同时只能选择一个单元,即只有一个单元对应的字选择输入为1,其余的字选择输入均为0

      • word select = 0:单元锁存器的值不变
      • word select = 1:值被加载至锁存器
    • 位选择 (bit select):用于选择启用哪个位,在这里相当于整个 \(2^k \times 1\) 的使能信号 ( 因为整个 RAM 只有 1 )

    • / (\(Read/\overline{Write}\))

      • \(Read/\overline{Write}\) = 0:写操作
      • \(Read/\overline{Write}\) = 1:读操作
  • 数据线路

    • 数据输入
    • 数据输出

🌰:\(16 \times 1\) RAM

与上面的模型略有不同:

  • 数据输出处用到了一个三态门,这样我们可以将 RAM 芯片的输出连在一起
  • 芯片选择 (chip select) RAM 上的位选择接口相连,作为使能信号

Coincident Selection⚓︎

对于一个大型的内存阵列,我们需要更大的译码器,因此位线路上就会有更大的扇出,导致 RAM 的访问时间和写入周期时间延长,这会制约内存的扩展。

一种有效的解决方法是重合选择 (coincident selection):用 2 个译码器构建一个二维的 RAM 阵列,它们分别负责横向和纵向的选择,这可以有效削减译码器的大小和扇出。

在重合选择中:

  • 字选择 \(\rightarrow\) 行选择 (row select)
  • 位选择 \(\rightarrow\) 列选择 (column select)

\(4 \times 1\) RAM + 重合选择 实现 RAM 的扩展

  • 行译码器和列译码器均为 2-4 译码器
  • 地址的高 2 位通过字选择来选择行,低 2 位通过位选择来挑选列,从而找到特定的 RAM 单元
  • 列译码器有一个作为使能信号的芯片选择输入:

    • 其值为 0 时,译码器的输出为 0,因此不选择任何列
    • 其值为 1 时,可以访问 RAM 的特定位

  • 行译码器为 2-4 译码器,而列译码器为 1-2 译码器
  • 地址的高 2 位挑选行,低 1 位挑选列 ( 同时选中某 2 列,因为位宽为 2)
  • 输入输出都是 2 bit,数据输入 0 被传入第一、三个 \(4 \times 1\) RAM,数据输入 1 被传入第二、四个 \(4 \times 1\) RAM
更复杂的例子

对于 \(1K \times 1\) 的内存

  • 使用 1 10-1024 译码器,我们需要 1024 10 输入的与门
  • 使用 2 5-32 译码器,我们需要 32 * 2 = 64 5 输入的与门

Array of SRAM ICs⚓︎

内存的容量是由地址宽度 (\(\log_2\)( 字的数量 )) 和位宽决定的,要想扩展内存,可以从下面两个角度考虑:

  • 地址空间扩展 ( 地址位增加 )——字扩展 (word extension)
  • 字的位宽扩展——位扩展 (bit extension)

🌰:

其实,在介绍重合选择的时候,我们已经实现了字扩展和位扩展,但上面的例子用到的只是小规模的 RAM 单元,对于更大型的 RAM 扩展,我们需要用下面的方法来实现。

为了便于后面介绍 RAM IC 阵列,我们先给出 \(64K \times 8\) RAM 的符号:

注:输出部分的倒三角形表明使用了三态门,因此当 CS = 0 时,数据输出处于高阻抗 (Hi-Z) 状态 ( 被禁用 )CS = 1 时,数据输出被启用

Word Extension⚓︎

🌰:用 \(64K \times 8\) RAM 构建 \(256K \times 8\) RAM

  • 输入数据、低位地址 ( 即小 RAM 的全部地址,0-15) 和读 / 写输入被传入每一个小的 RAM
  • 高位地址 ( 即扩展的 RAM 多出来的地址位,16-17) 用一个译码器进行分配,用来挑选用哪个小的 RAM;再由低位地址选择访问该 RAM 的哪个字
例题

Bit Extension⚓︎

🌰:用 \(64K \times 8\) RAM 构建 \(64K \times 16\) RAM

  • 数据输入、数据输出均被分成两路 8 bit 信号,分别传输至两个的小 RAM
  • 这两个 RAM 接受相同的地址、芯片选择和读 / 写信号

Info

为了减少芯片引脚的数量,很多 RAM ICs 为数据输入和输出提供一个”公共站点 (common terminal)“,我们认为这是双向的 (bidirectional),即:当取数据时作为输出,当入数据时作为输入三态门便是一个不错的选择。

Dynamic RAM(DRAM) Integrated Circuits⚓︎

DRAM 单元的构成:

  • 晶体管 T 作为 " 开关 " 使用,用来控制外部输入信号 B 和电容 C
  • 电容 C 用于存储数据,当电容充满电时表示1,电容没有电时表示0

由于电容会慢慢漏电,所以需要定期刷新 (refresh)电容,这样才能保证数据不会丢失,因此这种 RAM 被认为是“动态的”。

符号:

DRAM 单元的逻辑模型 ( 左下 ) 以及与水压控制装置的类比 ( )

基本操作:

  • 写:如上图 (d) 表示写入高电平,(e) 表示写入低电平

  • 读:如上图 (f) 表示读取高电平,(g) 表示读取低电平

sense amplifier

观察上面的图 (f) 和图 (g),不难发现每次读操作都会稍微改变电容中存储的电荷量,这就是所谓“毁灭性的读取 (destructive read)“:读取内存数据后,原来的内容被删除。下面的折线图直观反映该结果。

因此对于每一操作,都要进行复原 (restore)操作,也就是刷新,将电容中的电荷量恢复至读取前的水平。

Bit Slice⚓︎

  • 如下图所示,DRAM 的位切片与 SRAM 位切片本质上没有多大区别
  • 但是 DRAM 位切片的输出多了一个感测放大器,从而将电荷量的微小变化转换成变化明显的数字信号
  • B, C 和感测放大器输出被连接在一起 ( 三态门 ),以防“毁灭性的读取”发生
  • 由于 DRAM 结构简单,成本更低,因此相比 SRAM 被更加广泛地应用于大型内存中

大型 DRAM 的框图:

  • 为了减少引脚的数量,DRAM 地址通常被分为连续的两部分:地址,地址。这是因为:用来执行行选择的行地址需要在列地址之前使用 ( 列地址需要根据行选择的结果读取数据 )

    这里类似 SRAM 重合选择的思想

误区

先看一些例题

例题

a DRAM has 15 address lines and 32 data lines, its maximum capacity is ____ Bytes.

\(2^{32}\) Byte

分析:

  • 总地址线路 = 行地址 + 列地址 = 15 + 15 = 30
  • 总容量 = \(\dfrac{2^{\text{总地址线路}} \times 32}{8} = 2^{32}\) Byte

事实上,通过将地址分为连续的 2 部分 ( 行地址 + 列地址,它们都是原地址的“副本”),相当于将原来的地址线路条数“翻倍”了,从而有效减少地址线路的条数

  • 用寄存器保存来自读取或写入周期的行 / 列地址
  • 行地址选通 (row address strobe)\(\overline{RAS}\):行地址寄存器的加载信号
  • 列地址选通 (column address strobe)\(\overline{CAS}\):列地址寄存器的加载信号
  • 以及输出使能 \(\overline{OE}\),它们均为低电平活跃
  • 寄存器控制器 (refresh controller)寄存器计数器 (refresh counter)模块负责实现刷新功能
DRAM 的访问顺序

DRAM 的时序图

Refreshing⚓︎

三种刷新方式

  • RAS 被激活,一个行地址 (刷新地址) 用于 DRAMCAS 不动
  • DRAM 在内部读取一行,并放大读取数据。由于 CAS 被禁用,没有数据被传到输出引脚上
  • 缺点:需要额外的外部逻辑设备来连续生成行地址

  • DRAM 有自己的刷新逻辑——地址计数器。当序列用于 CAS RAS 上,内部刷新逻辑生成一个地址,并刷新对应的单元
  • 每个周期后,地址计数器会自增
  • 内存控制器只需发出信号

  • 伴随正常的读取或写入,CAS = 0,RAS 按周期变化,有效执行第二种刷新方法。在这种刷新方法中,之前读取的输出数据依旧合法,因此认为刷新是隐蔽的
  • 缺点:花费时间太长,导致后续读写操作的延迟

刷新模式:

  • 爆发模式 (burst mode):停止工作,刷新所有数据
  • 分布模式 (distributed mode):间隔一段时间刷新,从而避免长时间的内存阻塞,这种刷新方式更加常用

DRAM Types⚓︎

类型:

  • 同步 DRAM(SDRAM):DRAM + clock,实现同步
  • 双倍数据率 SDRAM(DDR SDRAM):在 SDRAM 的基础上,同时利用上升沿和下降沿读取数据
  • RAMBUS® DRAM(RDRAM):用相对更窄的总线来实现极高的内存访问速度

爆发读取 (burst read):高速缓存从 DRAM 读取数据时,总是一次性读取一串相邻的字,这样可以达到更快的内存访问速度。

Synchronous DRAM⚓︎

  • 所有的信号与外部时钟 (external clock) 关联
    • 使时间与其他系统 ( 比如 CPU) 的匹配更加精确
    • 同步寄存器出现于地址输入、数据输入和输出中
  • 爆发且有方向的读取和写入访问:
    • 列地址计数器 (column address counter):用来为将随时钟周期传输的内部数据分配地址
    • 计数器的上限:address + burst length - 1
    • 爆发 ( 读取 ) 长度 (burst length)
  • 一种用户可编程模式的寄存器
    • CAS 潜伏 (latency),爆发 ( 读取 ) 长度、爆发类型

🌰:16MB SDRAM 的框图

SDRAM 的时序图:

注:这里的例子和时序图我理解的不是很透彻,推荐看修佬の解释

内存带宽 (memory bandwidth):内存的速度——数据读取或存入的最大速率。单位一般为 MB/s GB/sSDRAM 的内存带宽与爆发大小 (burst size) 相关

例题
  • 内存数据路径宽度:1B
  • 内存时钟周期:7.5ns
  • 等待时间 ( 从应用行地址开始,直到第一个可用的字出现的时间 )4 个周期
  • 读取周期:(4 + 8) * 7.5 = 90ns
  • 内存带宽:8 / (90 * \(10^{-9}\)) = 88.89 MB/s
  • 读取周期:(4 + 2048) * 7.5 = 15390ns
  • 内存带宽:2048 / (15390 * \(10^{-9}\)) = 133.07 MB/s

Double Data Rate Synchronous DRAM⚓︎

  • 在时钟两侧的边沿均可传输数据
  • 提供每个周期内 2 个数据字的传输速率

🌰:

RAMBUS DRAM(RDRAM)⚓︎

注:这块内容仅做了解即可

  • RDRAM ICs 与连至处理器的内存总线之间的连接中使用基于包的总线 (packet-based bus)
  • 总线包括:
    • 3 位行地址总线
    • 5 位列地址总线
    • 16 18 ( 用于错误纠正 ) 数据总线
  • 总线是同步的,在时钟两侧的边沿均可传输
  • 每个 (packet) 4 个时钟周期内提供 8 次传输,这意味着:
    • 12 位的行地址包
    • 20 位的列地址包
    • 128 144 位的数据包
  • RDRAM 利用多个内存库,允许用不同的行地址对内存进行同时访问
  • 通过精密的电路设计,可以提高时钟频率,从而大大提高内存访问速度

🌰:16 MB RDRAM 的时序图

Arrays of DRAM Integrated Circuits⚓︎

DRAM 的阵列与 SRAM 类似,除了多了一个被称为DRAM 控制器 (DRAM controller) IC

  • 将地址分为行地址和列地址,并为它们的使用计时
  • 提供 \(\overline{RAS}\) \(\overline{CAS}\),并为它们的使用计时
  • 在要求的间隔内执行刷新操作
  • 为系统的剩余部分提供状态信号 ( 表明内存是否是处于活跃状态,或者是否在执行刷新操作 )

DRAM 组织:

评论区

如果有什么问题或想法,欢迎大家在下方留言~