# 1.6 寄存器 & 内存（Registers and RAM）

计算机的存储器（Memory）可分为两种类型：

1. 随机存取存储器（Random Access Memory, RAM）：仅在有电的情况下存储内容，常用作内存。
   * SRAM( Static Random Access Memory，静态随机存取存储器）：“静态”是指这种存储器只要保持通电，里面储存的数据就可以恒常保持（接下来用锁存器做的就是它）。
   * DRAM( Dynamic Random Access Memory，动态随机存取存储器)：“动态”是指所储存的数据需要周期性地更新。
   * Flash：允许多次写入的非易失性存储器。
   * NVRAM( Non-Volatile Random Access Memory）：非易失性随机存取存储器。
2. 持久存储器（Persistent Memory）：电源关闭时，数据也不会丢失。

## 1.6.1 AND-OR 锁存器

用 OR 或门可以记录 1，用 AND 与门可以记录 0：

![记录 0 或 1](/files/zA5Hk80ZDugBsXwWK0Dx)

将两者如下图所示连接则构成 AND-OR 锁存器，可以锁定（latch）一个值来存储 1 位信息，故有此名。其有两个输入：「设置」为 1 则输出为 1，「复位」为 1 则输出为 0，两者均为 0 则输出最后记录的数字。

![AND-OR 锁存器](/files/CdrTjtKyKKn9605yNDNt)

另，通常将放入数据的动作称为「写入」（writing），拿出数据的动作称为「读取」（reading）。

## 1.6.2 门锁（Gated Latch）

AND-OR 锁存器需要用两个输入记录一个数字，使用起来较为麻烦，因此引入可以控制读写的「门锁」（Gated Latch）来存储 1 bit。门锁在输入输出之外，添加了一条允许写入线（Write Enable）——启用时允许写入数据，反之锁定（locked）。

![门锁](/files/KbRXLffDk235A9LVYtGp)

## 1.6.3 八位锁存器（8-bit Latch）

将 8 个门锁用 1 根允许写入线连接，构成八位锁存器，可用于存储 8 位信息。先将允许写入线置 1，写入数据后将其置 0 则可完成存储。

![八位锁存器](/files/wUihOasnWrpDFvAv6Wmo)

## 1.6.4 锁存器矩阵（Latches Matrix）

### 连接

使用 16 × 16 个可存储 1 bit 的锁存器矩阵来存储 256 位，当需要启用某个锁存器时就打开相对应的行线、列线和允许写入线。

![锁存器矩阵](/files/TN3pqOLSxuMBSHEDbuW0)

在交叉处使用 AND 与门连接，当且仅当行线、列线、单个锁存器的允许写入线均为 1 时，才允许该锁存器进行写入。

![\[使用与门连接](/files/xDbhQitXBcPTbmsMchu7)

这也意味着可以使用 1 根数据线来连接矩阵中的所有锁存器用于传输数据，因为可根据行列线进行需要开启的锁存器。类似地，可以使用 1 根允许写入线来控制从矩阵中的某个锁存器读取数据。

因此，256 位的锁存器矩阵仅需 35 条线连接—— 1 条数据线、1 条允许写入线、1 条允许读取线以及 16 行、16 列用于选择锁存器的线。

### 选择

4 位二进制数可表示的最大数字为 16，刚好足够满足对 16 × 16 的矩阵进行行数、列数的地址编码。

可以使用 8 位二进制数来唯一标识行列交叉处的锁存器，比如第 12 行第 8 列的锁存器可以表示为 1100 1000，这就是前文 1.4.4 节中提过「位址」（memory addresses）。

为了使机器读懂这个位址，需要使用 2 个支持 16 路的「多路复用器」（multiplexer）来分别处理行列地址，输入 4 位的数字后，多路复用器会连通相应的行/列线。

![多路复用器](/files/apXwdE4k0uwKWXSaVoxk)

16 × 16 的单位锁存器矩阵可以存储 256 个 bit，将 8 个 256-bit 的存储器连接起来构成大小为 256Bytes 的存储器。

![256Bytes 的存储器](/files/TAYljIEcAWNswEwbEUzG)

在 256Bytes 存储器中，一个八位数字是将每位各自存储在一个 256-bit 内存中，1 个 256-bit 存储器中的某位比特与其余 7 个 256-bit 存储器中的某 7 位比特共享同一个地址。因此，256Bytes 内存中也只有 256 个地址，各自代表 1Byte 的大小，可读写 8bit 值。

简单起见，将这个 256Bytes 的存储器当作整体抽象为一个可寻址存储器。

![8 位可寻址存储器](/files/mp7mlPwMNJhQ14l4E2ZI)

## 1.6.5 RAM

8 位位址最多可以表示 256 （0\~255）个地址，想要对 TB 或是 GB 级别的存储器寻址则更高位的数字表示地址（比如 16/32 位）。

![1980s 的 1MB 内存条](/files/fme3st7QTQlNQWW4cMtK)

上图是 1 MB 大小的 RAM 内存条（1980s），通常是由 8 个内存模块（memory modules）构成，1 个内存模块里有 32 个内存方块（squares of memory），1 个内存方块中有 4 个小块（block），1 个小块中有 128 × 64 位的矩阵，单个小块是 8192bits 大小。

因此，1 个内存方块中有 8192 × 4 = 32768 bits，总共有 32 个内存方块，单个内存模块大约在 100w bits 大小，有 8 个内存模块，总共是 800w bits 约等于 1 MB 大小。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cccs.viyi.cc/1-ji-suan-ji-zu-cheng/1.6-ji-cun-qi-nei-cun-registers-and-ram.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
