← 返回信息流
AI 资讯Hacker News·2 天前

TD4 4-bit DIY CPU 完全指南

原标题:Guide to the 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)

    • 芯片 IC8IC10 中的离散组合逻辑芯片将命令位转换为控制信号,如 not_LOAD0,1,2,3SEL_A/SEL_B
    • 这些信号实际上连接到寄存器 A、B、输出寄存器和程序计数器(PC)。
  • 数据选择器(Data Selector)

    • 芯片 IC6IC7 根据 SEL_ASEL_B 信号从四个选项中选择输入:硬连线接地信号(零)、加法器输出等。
    • 例如,MOV A, Im 指令通过将立即数 Im 与 0 相加,并将结果锁存到寄存器 A 来实现。
  • 加法器(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 系统中,加 15 等同于减 1。
    • 指令:ADD B 15, OUT B, JMP 0
  • 先向上再向下计数(复杂逻辑)

    • 这是最具挑战性的部分。作者列举了常见的调试错误:
      1. 过早食用冰淇淋导致疲劳。
      2. 混淆 JNCJMP 的标签。
      3. OUT 指令放置在无法执行的位置。
      4. ADD A 1 之后移动 OUT,破坏了进位标志。
      5. 未意识到 ADD B 1, OUT B 可压缩为伪指令 OUT B 1
    • 作者提供了完整的 10 步汇编代码,展示了如何检测溢出(通过寄存器 A 测试)并切换计数方向。

4. Python 汇编器与模拟器

为了辅助开发,作者与同事 Ben 编写了一个简单的 Python 汇编器和模拟器。

  • 功能
查看原文 →philipzucker.com