随机存取存储器 (RAM)
10.1 概览
我们之前看到的组件已经可以让我们拥有一台简单但功能齐全的计算机并运行起来。CPU 将从 ROM 读取指令并执行它们。此时,程序必须相当简单,因为它除了 CPU 寄存器之外没有任何内存空间。它甚至不能调用函数。这就是随机存取存储器(RAM)的作用。
RAM 将为我们提供一块内存区域,用于存储可以写入和读取的任何临时数据。虽然它在访问时间方面非常高效,但断电时会丢失所有存储的数据。
10.2 硬件实现
在 Zeal 8 位计算机上,RAM 组件是 Alliance AS6C4008 芯片,在 PCB 上标记为 U3。它采用带插座的 DIP-32 封装。该组件提供 512KB 静态内存,与动态内存不同,它不需要刷新。它映射到物理地址 0x80000(512KB),因此紧随 ROM 之后。
RAM 在计算机中是至关重要的,不仅因为程序会使用它来存储数据,还因为 CPU 在调用和从例程返回时需要它。事实上,Z80 有一个特殊的 16 位寄存器 SP,它必须始终指向 RAM。当 CPU 执行 call、ret、push、pop 指令时,它会在该寄存器指向的地址处读取或写入 RAM。
Zeal 8 位计算机没有提供任何内存保护,即使是 RAM 也是如此,这使得不仅可以对 RAM 进行读写,还可以从 RAM 执行代码。这在执行自修改代码或需要代码与其数据相邻的操作系统时非常方便。
在引脚排列方面,其组织方式如下:
让我们看看连接到它的常规信号:
- $ADDR\ 0$ 到 $ADDR\ 18$:表示要读取或写入的字节的地址。$ADDR\ 0$ 到 $ADDR\ 13$ 线直接来自 CPU,$ADDR\ 14$ 到 $ADDR\ 18$ 来自 MMU。
- $DATA\ 0$ 到 $DATA\ 7$:表示刚从 ROM 读取的字节。
- $\overline{RD}$:来自 CPU 的信号,当 CPU 正在执行读取时有效。
- $\overline{WR}$:来自 CPU 的信号,当 CPU 正在执行写入时有效。
- $\overline{CE}$:来自逻辑胶合的信号,当 CPU 尝试访问 RAM 映射的地址范围时有效:从物理地址
0x80000到0xFFFFF。更多信息请参见逻辑胶合章节。
10.3 硬件依赖与时序
与 ROM 一样,RAM 依赖 MMU 来获取所有需要的地址线,以及逻辑胶合,因为它生成 $\overline{RAM\_ENABLE}$ 信号。
实际上,该信号连接到 RAM 的 $\overline{CE}$ 引脚。
在时序方面,AS6C4008-55PCN 的传播延迟最多为 55ns,使其非常快速,不需要 CPU 在执行读取或写入指令时等待任何额外的时钟周期。因此,使用 CPU 时访问 RAM 的最快方式是使用任何只涉及寄存器的指令(7 个 T 状态):
ld a, (de)ld a, (bc)ld a, (hl)ld b, (hl)ld c, (hl)ld d, (hl)ld e, (hl)ld h, (hl)ld l, (hl)
也可以使用块复制指令,如 ldi、ldir、ldd 或 lddr。
关于延迟和时序的所有详细信息在官方数据手册中有详细说明。
📝 深入了解...
如上所述,读取或写入 RAM 至少需要 7 个 T 状态,即使 RAM 足够快可以在不到 1 个 T 状态下完成。这是由于 Z80 CPU 需要更多的时钟周期来读取指令并执行它。
因此,访问 RAM 的最快方式是绕过 CPU,让一个组件直接与 RAM 通信,使用更少的时钟周期。这就是直接内存访问(DMA)的主要原理,由某些组件(如 Zilog 的 Z84C10 DMA 控制器)实现。它由 CPU 编程,然后从任何地址(不仅是 RAM 的范围)到任何地址执行复制(读取或写入),无需经过 CPU,从而使传输更快。
Zeal 8 位计算机没有 DMA 控制器,但可以将一个连接到扩展端口。更多关于扩展端口的信息,请参见专用章节。