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

I/O 接口同样挂上数据和地址总线,但它认的是另一套门牌【端口号】,外设都从它的门进出。

📝 本节和前面几节的关系

内存接好了,这一节把门房 I/O 也挂上总线——注意它的门牌体系跟内存不一样。

一、I/O 的接线与门牌

I/O 接口照内存的样子接上数据总线和地址总线——但 CPU 访问它时用的编号叫端口号,Z80 有 256 个(0x00~0xFF)。 内存地址和端口号是两套独立体系:地址 0x02 是内存里的一个字节,端口 2 是某个外设的门——号码可能撞,空间不重叠。

二、外设怎么挂上来

键盘(本章用拨码开关代替)接在输入接口的引脚上;LED 数码管接在输出接口的引脚上。 I/O 芯片内部有几个【寄存器】格子:数据存一格、状态存一格,每个格子对外占一个端口号。CPU 摸外设=读写这些格子。

三、为什么要门房

外设的电信号脾气古怪(电压、时序都跟 CPU 合不来),不能直接怼上总线。 I/O 接口干的正是【翻译加缓冲】的活:一头对内说总线听得懂的话,一头对外迁就设备的怪脾气。现代显卡、网卡里的芯片,本质还是这个角色。

四、动手 Demo:两套门牌对照表

把内存地址和端口号摆在一起看,两套体系的分工一目了然。

# 内存空间 vs I/O 空间
print("内存空间: 0x0000 ~ 0xFFFF, 共 65536 格")
print("I/O 空间: 0x00 ~ 0xFF,   共   256 格")
print("号码会撞(都有 2 号), 空间不重叠(两套体系)")

实跑输出:

--------------------------------------------------------------------
接上 I/O——端口号是另一套门牌
--------------------------------------------------------------------

I/O 接口也挂在总线上,但它的门牌叫【端口号】,跟内存地址是两套体系:

  体系         门牌叫什么     范围(Z80)         谁住在里面
  -----------------------------------------------------------------
  内存空间     内存地址       0x0000~0xFFFF     程序和数据
  I/O 空间     端口号         0x00~0xFF         键盘、数码管等外设

同一条地址总线,怎么区分这趟点名的是内存还是 I/O?
——CPU 专门伸出一根控制线来表态,这正是 2.6 节的内容。

先记住分工:想读程序数据,按内存地址找;想摸外部设备,按端口号找。

【⚠️ 2026 现状】x86 后来的现代设备改走 MMIO(把设备寄存器映射进内存地址空间),端口号体系淡出,但【给设备编门牌】的思想没变。 两套门牌的判定开关,就是下一节的主角——MREQ 和 IORQ 两根引脚。

30 秒实验

  1. 把家里路由器的 LAN 口想成端口号:每个口一个号,插哪个口就是找哪台设备。
  2. 数一数 256 个端口号能接多少设备——不够用怎么办?一块 I/O 芯片后面可以挂多个外设。

常见误区

  1. 以为端口号和内存地址共享一套编号——号码可以相同,但访问时靠控制线分流,互不干扰。
  2. 以为外设直接插总线——中间必须过 I/O 接口做电平与时序的翻译。
自测三问(点开对答案) 1. 端口号和内存地址是什么关系? —— 两套独立体系:Z80 有 256 个端口、64K 个内存地址,号码可撞、空间不重叠。 2. I/O 接口芯片内部是什么? —— 几个寄存器格子,数据一格状态一格,每格占一个端口号。 3. I/O 接口存在的理由是什么? —— 翻译加缓冲——让脾气不同的外设和总线能对话。

相关笔记