在现代处理器动辄数十亿晶体管的今天,回到最基础的数字逻辑构建一台可工作的 CPU,是理解计算机体系结构的绝佳方式。TD4 正是这样一款极具教育意义的 4 位 CPU,它源自日本作者冨岡薫(Kaoru Tonami)的著作《How to Build a CPU》,完全使用 74 系列 TTL 逻辑芯片搭建,不依赖任何微程序或复杂控制逻辑。本文将深入剖析 TD4 的硬件架构、指令集设计以及实际编程方法,为硬件爱好者和嵌入式工程师提供一份可操作的构建指南。
TD4 的设计理念与硬件架构
TD4 的核心设计理念是「透明」—— 每一根信号线的运动都可以用示波器或逻辑探针直接观察,没有任何隐藏的抽象层。这种硬连线逻辑(hard-wired logic)CPU 意味着每条指令的执行都由直接的电气路径完成,而非通过微程序控制。对于学习计算机组成原理来说,这种透明性是无价的。
从硬件组成来看,TD4 的核心芯片包括三块 74HC161 用作 A 寄存器、B 寄存器和输出端口,另外一块 74HC161 用作程序计数器(PC)。74HC153 双 4 选 1 多路复用器负责 ALU 输入选择,74HC283 四位全加器构成算术逻辑单元,74HC10(三输入与非门)和 74HC32(或门)组合实现指令解码。整个系统运行在 5V 电压下,可通过 Micro-USB 接口供电。
在存储层面,TD4 采用二极管矩阵构成 16 字节的只读存储器。原作推荐使用 1S1588 或 D8-1A 二极管阵列,但在实际 DIY 中,普通的 1N4148 开关二极管完全可以胜任。这些二极管充当单向门,防止电流回流到电路的其他部分,从而物理实现了存储器的地址解码逻辑。这种完全可视化的存储方式,使得程序 “写入” 变成了一种物理操作 —— 通过 DIP 开关选择哪些位置连接二极管。
指令集设计与寻址模式
TD4 提供 12 条基本指令,构成了一个简单但完整的指令集。数据传输类指令包括 IN(从输入端口读取数据到寄存器)和 OUT(将寄存器内容输出到显示端口)。算术运算类指令为 ADD(加立即数)和 ADC(带进位加法),其中 ADD 指令将一个 4 位立即数与指定寄存器相加,结果写回该寄存器。逻辑操作类包括 CMP(比较,相当于减法但不保存结果,仅影响进位标志)和 MOV(寄存器间数据传输)。
跳转控制是程序流程的关键。JNC(进位为 0 时跳转)和 JC(进位为 1 时跳转)两条条件跳转指令配合算术运算结果使用。此外还有 JMP(无条件跳转)和 CALL/RET(子程序调用与返回,虽然原版 TD4 未直接支持,但可以通过特定的寄存器操作模拟)。这种指令集虽然简单,却足以实现计数器、循环、条件分支等基本程序结构。
在寻址模式方面,TD4 主要采用立即数寻址 —— 操作数直接编码在指令中。例如「ADD B, 3」表示将数值 3 加到 B 寄存器。此外,程序计数器隐式寻址用于顺序执行,跳转指令则直接指定目标地址。这种极简的寻址方式,恰恰反映了 1970 年代早期微处理器的典型特征。
寄存器结构与数据通路
TD4 的数据通路设计清晰明了。核心包含两个 4 位通用寄存器 A 和 B,一个 4 位输出寄存器,以及一个 4 位程序计数器(PC)。进位标志位 C 是唯一的标志寄存器,用于记录算术运算的溢出状态。输入端口和输出端口各占 4 位,分别用于接收外部开关输入和驱动 LED 显示。
数据在寄存器间的流动由多路复用器控制。74HC153 根据指令解码结果选择数据源 —— 可能是另一个寄存器、立即数或者算术逻辑单元的运算结果。全加器 74HC283 既可以做加法,也可以通过适当连接实现移位、比较等操作。这种用简单芯片组合出复杂功能的方式,是数字逻辑设计的精髓所在。
时序由 74HC14 施密特触发器构成的多谐振荡器提供。振荡频率可以通过外接电阻电容调节,典型值在 1Hz 到 100kHz 之间可调。对于调试目的,建议从极低频率开始,逐步加快以观察数据流动细节。时钟信号同时驱动程序计数器和寄存器更新,确保整个系统同步工作。
编程实践:计数器程序解析
让我们通过一个具体的计数器程序来理解 TD4 的编程方法。以下程序实现从 DIP 开关读取输入值,然后每周期递增,计满 15 后回绕到初始值继续计数:
IN B ; 从输入端口读取数据到B寄存器
OUT B ; 将B寄存器内容输出到显示端口
ADD B, 1 ; B寄存器值加1
JNC 1 ; 如果进位标志为0,跳转到地址1
JMP 0 ; 无条件跳转到地址0
地址 0 的指令读取输入值作为起始计数,地址 1 负责输出当前值,地址 2 完成递增操作,地址 3 检测是否产生进位(从 15 再加 1 会溢出产生进位),地址 4 在产生进位时回到地址 0 重新开始。这种简单的循环结构展示了如何用极少的指令实现实用功能。
在物理层面,程序的 “写入” 需要根据指令编码表设置二极管矩阵。每一行对应一个 ROM 地址,四位表示操作码,四位表示操作数或跳转地址。作者开发了一款在线汇编器工具,可以将上述汇编代码直接转换为 DIP 开关的拨动位置,大大降低了编程门槛。
硬件实现的关键注意事项
焊接是 TD4 构建中的主要挑战。板上包含四只表贴 LED 和一个 Micro-USB 插座,如果之前没有 SMD 焊接经验,USB 插座可能略显困难。实际上该设计中仅需焊接第 1 和第 5 脚(电源和地),其他引脚在该设计中未使用。推荐使用细尖烙铁头、0.5mm 含银焊锡,并保持烙铁温度在 300 至 350 摄氏度之间。
二极管矩阵的焊接最为耗时。每一行 ROM 需要仔细对照指令编码表,确保二极管极性方向正确。方向接反会导致指令解码失败,而漏接则会使该指令地址不可用。建议先在纸上标记所有需要焊接的位置,然后按批量操作的方式完成。
电源选择上,5V 稳压电源即可满足需求。也可以使用手机充电器的 USB 输出通过 Micro-USB 供电。调试时建议在电源入口串联 100μF 电解电容和 0.1μF 陶瓷电容进行退耦,这能显著改善信号完整性。特别是在使用 74LS 系列芯片替代 74HC 时,电源噪声更容易导致计数错误。
为什么 TD4 仍是绝佳的学习平台
现代 MCU 和 SoC 将数十亿晶体管封装在数平方厘米的芯片内部,开发者往往只需调用 API 即可完成复杂功能。这种抽象在提升效率的同时,也模糊了计算的本质认知。TD4 的价值恰恰在于它剥离了所有抽象层,将处理器的每个工作步骤都暴露在可观测的层面。
构建 TD4 可以帮助你建立硬件与软件之间的直观联系。当你在示波器上观察到程序计数器逐行递增,看到数据从输入开关流经多路复用器进入 ALU,最后到达输出端口点亮 LED,这个过程比任何教科书都能更深刻地阐释冯・诺依曼架构的核心原理。
对于嵌入式系统工程师而言,理解底层硬件有助于编写更高效、更可靠的代码。知道一条指令需要多少个时钟周期,了解中断响应时的硬件行为,这些知识在调试疑难问题时往往能派上用场。TD4 提供的,是一个可以亲手触摸、亲眼观察的计算模型。
如果你对更深入的 CPU 设计感兴趣,可以进一步探索八位 CPU 的构建,例如著名的 Ben Eater 项目。掌握了四位的 TD4 之后,过渡到八位设计会发现许多概念是相通的 —— 只是数据通路更宽、指令更丰富、状态机更复杂而已。本质上,数字系统设计的核心原理在任意字长下都是一致的。
资料来源:本文技术细节参考 Dilshan R Jayakody 的构建日志及 Kaoru Tonami 所著《How to Build a CPU》一书。汇编器工具可访问 github.com/dilshan/td4-assembler 获取。