TD4 4-bit DIY CPU 完全指南
速览
TD4 是一款专为爱好者设计的 4 位 DIY CPU 项目,旨在通过极简架构深入理解计算机底层原理。该项目允许开发者从零开始构建处理器,探索指令集与硬件交互的核心机制。对于计算机体系结构学习者而言,这是一个极具价值的实践案例。
AI 深度解读
TD4 4-bit DIY CPU 完全指南:从硬件搭建到汇编编程
背景
在计算机体系结构的学习与极客文化中,动手构建处理器是理解底层原理的最佳途径之一。近期,Hacker News 社区分享了一篇关于 TD4 这款 4 位 DIY CPU 套件的使用指南。作者从 Aliexpress(阿里巴巴旗下跨境电商平台)购买了一款名为 TD4 的微型 CPU 套件,并对其搭建过程、工作原理及编程实践进行了详细记录。
TD4 是一款极其精简的处理器,仅包含 2 个寄存器、若干 LED 指示灯以及 16 字节的程序 ROM(只读存储器)。尽管其功能受限,无法运行复杂软件,但它完美地展示了计算机架构的核心原则。然而,官方提供的文档、原理图和照片较为稀疏,对于初学者而言可能略显晦涩。为了弥补这一不足,作者撰写了这篇深度解读,旨在帮助爱好者更顺畅地掌握这款硬件。
核心内容
1. 硬件搭建与焊接经验
搭建 TD4 主要涉及焊接工作,作者建议分两次会话完成,并分享了以下关键注意事项:
- 元件方向性:表面贴装二极管的方向曾让作者感到困惑。通过万用表的二极管测试功能确认,二极管正面的绿色短线应朝向电路板底部。
- USB 接口焊接:这是最棘手的部分。建议在进行其他 IC 插座安装之前先焊接 USB 接口,以免烙铁操作空间受限。USB 接口仅用于供电,中间引脚未连接,必要时可直接忽略或剪断。
- IC 安装:通过对照原理图中的部件编号(Part Number)和 IC 编号来确认芯片位置。芯片上的缺口应与 PCB 板上的标记对齐。作者表示,除了 USB 接口出现间歇性接触不良外,芯片安装一次性成功。
2. 工作原理深度解析
TD4 的核心逻辑由以下几个模块组成,程序通过 16 个 DIP 开关(即程序 ROM)进行硬编码输入:
-
程序 ROM 与指令集:
- 程序由 16 个 DIP 开关组成,每个开关代表一条指令。
- 操作码(Opcode):每个 DIP 开关的第 5-8 位决定指令类型,支持
ADD(加)、MOV(移动)、IN(输入)、OUT(输出)、JNC(无进位跳转)、JMP(跳转)。 - 立即数(Immediate Value):第 1-4 位为立即数值,始终传入加法器。
- 位序说明:DIP 开关的位序容易混淆。最低有效位对应开关上标记为“低”的一端。例如,数值 3 在开关上应设置为
1100。
-
地址解码器(Address Decoder):
- 芯片 IC11 是一个解复用器,接收 4 位信号并驱动对应的 16 个输出之一为低电平。
- 当输出为低电平时,若 DIP 开关闭合,电流可通过二极管;否则,上拉电阻(R21-R26)保持信号为高电平。
- 芯片 IC12 充当 ROM 结果的缓冲反相器。
-
命令解码器(Command Decoder):
- 芯片 IC8 和 IC10 中的离散组合逻辑芯片将命令位转换为控制信号,如
not_LOAD0,1,2,3和SEL_A/SEL_B。 - 这些信号实际上连接到寄存器 A、B、输出寄存器和程序计数器(PC)。
- 芯片 IC8 和 IC10 中的离散组合逻辑芯片将命令位转换为控制信号,如
-
数据选择器(Data Selector):
- 芯片 IC6 和 IC7 根据
SEL_A和SEL_B信号从四个选项中选择输入:硬连线接地信号(零)、加法器输出等。 - 例如,
MOV A, Im指令通过将立即数Im与 0 相加,并将结果锁存到寄存器 A 来实现。
- 芯片 IC6 和 IC7 根据
-
加法器(Adder):
- 芯片 IC8 执行 4 位加法。它接收来自数据选择器的 4 位输入以及来自 ROM 的 4 位立即数。
- 注意:即使是指令如
OUT B,也会将立即数传入加法器。如果不需要立即数,应将其清零。
-
寄存器(Registers):
- 寄存器 A、B、Out、PC 均为计数器芯片。
- 仅程序计数器(PC)启用了计数功能。
- 在时钟信号的上升沿,若
not_LOADx信号为低,数据将从引脚 A-D 锁存到输出引脚 QA-D。 JMP指令通过将值移入 PC 寄存器实现,PC 的值反馈回 ROM 地址解码器。
-
进位触发器(Carry Flip Flop):
- 包含一个 D 触发器,用于存储前一次操作的溢出进位位。
- 这是实现
JNC(无进位跳转)功能的关键:如果存在进位,命令解码电路将禁用来自指令的LOADPC信号。
-
时钟电路(Clock):
- 位于右下角,由 RC 控制的_multivibrator_(多谐振荡器)构成。
- 开关可在手动时钟和自动时钟之间切换,并调节时钟速度。
3. 编程实践与示例
作者通过一系列实验程序展示了 TD4 的编程能力,并记录了调试过程中的错误:
-
输出到 LED:
- 指令
OUT 0101。 - 查找
OUT Im的操作码为1011。 - DIP 开关设置为:前 4 位为立即数
0101,后 4 位为操作码的反转1011(即1010 1101,注:原文此处描述略有混淆,实际应为立即数+操作码组合)。
- 指令
-
简单闪烁:
- 输出两个不同常数并跳转回指令 0。
- 汇编代码:
OUT 0001 # 1000 | 1101 OUT 0010 # 0100 | 1101 JMP 0 # 0000 | 1111
-
向上计数:
- 利用模 16 算术,
ADD B 1实现加 1,OUT B输出。
- 利用模 16 算术,
-
向下计数:
- 在模 16 系统中,加 15 等同于减 1。
- 指令:
ADD B 15,OUT B,JMP 0。
-
先向上再向下计数(复杂逻辑):
- 这是最具挑战性的部分。作者列举了常见的调试错误:
- 过早食用冰淇淋导致疲劳。
- 混淆
JNC和JMP的标签。 - 将
OUT指令放置在无法执行的位置。 - 在
ADD A 1之后移动OUT,破坏了进位标志。 - 未意识到
ADD B 1, OUT B可压缩为伪指令OUT B 1。
- 作者提供了完整的 10 步汇编代码,展示了如何检测溢出(通过寄存器 A 测试)并切换计数方向。
- 这是最具挑战性的部分。作者列举了常见的调试错误:
4. Python 汇编器与模拟器
为了辅助开发,作者与同事 Ben 编写了一个简单的 Python 汇编器和模拟器。
- 功能:
