💻 第二章 试着制造一台计算机吧
📄 一句话概括

RD 和 WR 两根线管读写方向,配上 REQ 线凑齐四种总线操作;再加复位等零散引脚,CPU 的手脚全部接完。

📝 本节和前面几节的关系

去向的开关(MREQ/IORQ)接好了,这一节接方向开关(RD/WR)和其余零散控制线。

一、四种总线操作

RD(读)有效:把对方格子的内容搬上数据总线; WR(写)有效:把数据总线上的内容塞进对方格子; 与 MREQ/IORQ 组合,得到四种标准操作:读内存、写内存、读 I/O、写 I/O。 两根同时有效是非法态——电路打架,设计上必须避免。

二、其余零散引脚

RESET(复位):拉一下,CPU 从固定地址(Z80 是 0x0000)开始取指令——开机即复位; WAIT(等待):内存太慢时拉住 CPU 等一等——快慢设备之间的礼让线; 还有总线请求等引脚,本章用不到,知道有这号人物即可。

三、接线收工的全景

到这里,CPU 的引脚全部有了归宿:数据 8 根、地址 16 根、电源 2 根、时钟 1 根、MREQ/IORQ/RD/WR 等控制线若干。 机器【硬件层面】完工——但它还是白纸一台:内存里没有程序。怎么把程序装进去?下一节 DMA 登场。

四、动手 Demo:读写四板斧组合表

把 RD/WR 与四种操作列成组合表,非法态单独点名。

# RD/WR 组合的四种操作
ops = {(0,1): "读", (1,0): "写", (1,1): "空闲", (0,0): "非法"}
for k, v in sorted(ops.items()):
    print("RD=%d WR=%d -> %s" % (k[0], k[1], v))

实跑输出:

--------------------------------------------------------------------
接剩余控制引脚——读写四板斧
--------------------------------------------------------------------

剩下的控制引脚管读写方向。Z80 的 RD(读) 和 WR(写) 两根线一组合,
四种总线操作就齐了:

  RD     WR     操作     白话
  ------------------------------------------------------------
  0      1      读       把对方格子的内容搬上数据总线
  1      0      写       把数据总线上的内容塞进对方格子
  0      0      非法     两根线同时有效——电路打架,设计上禁止
  1      1      空闲     这趟总线没安排读写

配上 2.6 节的 MREQ/IORQ,一次访问的完整表态是四个信号:
    去哪(内存/I/O) + 干什么(读/写) —— 问路加动作,一次到位。

硬件非法态靠【不可能同时发生】的电路设计排除——软件里它对应【不该发生的情况】,两种世界的防御思路相同。 RESET 后从 0x0000 启动这条约定,解释了为什么测试程序必须从 0x0000 开始放。

30 秒实验

  1. 按一次电脑的重启键——你亲手拉了一次 RESET 线。
  2. 把四种操作和 2.6 的去向开关拼成 8 行大表(4 操作 x 2 去向)——拼得出,总线就通了你脑子里了。

常见误区

  1. 以为 RD/WR 是对 CPU 说的——它们是 CPU 对外说的话:我要读/我要写。
  2. 以为复位清空硬盘——复位只影响 CPU(程序计数器归零),存储的数据一动不动。
自测三问(点开对答案) 1. 四种总线操作是哪四种? —— 读内存、写内存、读 I/O、写 I/O——由 RD/WR 与 MREQ/IORQ 组合而成。 2. RESET 之后 CPU 做什么? —— 从固定地址(Z80 为 0x0000)开始取第一条指令。 3. WAIT 线什么时候用? —— 内存等慢设备跟不上 CPU 时,拉住 CPU 等一等。

相关笔记