真手搓CPU,硬核开发者三个月手工焊接、敲1800行汇编代码,竟让自制芯片连屏幕放《黑客帝国》
「都说天才和疯子之间只有一线之隔,这话一点不假。因为你马上要看到的这个项目,真的很难判断它属于哪一边。」
这是一位名为 Majsterkowanie i nie tylko(简称 MINT,意为“DIY and more”) YouTuber 的自述,也是这个项目的开发者。
他于近日在 YouTube 上展示了一个令人瞠目结舌的项目——EPROMINT:靠着一把烙铁、一堆老旧的存储芯片和 8 位逻辑器件,从零打造出了一整颗处理器——是的,不是开发板,也不是微控制器,而是一颗完整的、具有指令执行和内存寻址能力的 CPU。
不仅如此,这颗自制 CPU 还成功接上了 VFD 屏幕,跑起了他亲手写的代码,甚至可以播放低分辨率版的《黑客帝国》....
此外,MINT 还将整个项目的代码在 GitHub 上开源出来:https://github.com/majsterkowanieinietylko/EPROMINT,其表示,“它花了我整整三个月的时间,无数个日夜,我手持烙铁,敲击键盘几百个小时,只为了给自己,也给你们,开辟一条新路——一条可以走得很远的路。”
疯狂想法的诞生,源于一堆舍不得丢掉的旧芯片
开发这个芯片,其背后没有一整个庞大团队支撑,也没有数百万美元预算的支持,靠的只是 MINT 一个人。
根据 MINT 在视频中透露,之所以萌生自制处理器的想法,一切都始于一堆旧内存芯片。
“我收集了很多,然后开始实验。很快我意识到,这些看似过时的零件,其实可以拼出很酷的东西。加上一些外围电路后,我做出了一个基于单个内存芯片的开发板,可以执行任意相对简单的操作。比如控制电机转得快一点、慢一点——这用的是所谓的 PWM,也就是通过快速切换电源开关,来调节电机的实际输出效果;又比如在屏幕上显示一条消息”,MINT 说道。
在某个实验项目中,MINT 还基于单一内存芯片开发了一个可编程模块,并为其设计了简单的编程环境。基于此,MINT 能够更好更容易地更改程序、生成固件、写入芯片,一套流程几乎像在做现代开发。
正是这次体验,让他萌生了一个大胆的设想:如果将多个此类模块组合,是否就能构建出一整套运算逻辑?甚至造出一个完整的处理器?
作为复古电子学的爱好者,MINT 决定打造一款致敬“计算机起源时代”的处理器——正是那一代的处理器,推动了计算机技术的普及。他曾亲手用经典的 Z80 处理器组装过一台电脑,因此对处理器架构有着较为深入的理解。
在此次项目中,他选择了一条“极简主义”但极具挑战的路线:完全摒弃现代集成电路,仅使用旧款内存芯片与 8 位计算黄金时代流行的逻辑元件,尝试以最原始的方式构建出一颗 CPU。
历时三个月,从 ALU 到完整的模块体系
在设计时,MINT 从最基础的组件——算术逻辑单元(ALU)着手。
起初,他研发的第一版原型 ALU 仅支持简单的加法运算,功能还不太稳定,也有些简陋。MINT 表示,“我不是在造玩具,而是要做一个完整的处理器。于是我重新设计了一个更强大的ALU”,于是,其舍弃了这一版重新进行了开发。
随后,MINT 重新设计了插槽式结构的 ALU。
接下来的工作是重复的体力活:设计电路布局、插座焊接、走线、电容、电源、电线,一次次调试。「每一个模块都花了我好几天时间,但这很值得——我可以随时修改,避免后期返工。」
新的版本不仅更强大,也为后续功能扩展打下了基础。
在 ALU 的基础上,MINT 又陆续实现了三个核心模块:
内存控制模块:用于数据存储和地址寻址。通过手动将 ALU 输出写入特定地址,并设计地址控制逻辑,实现了数据的读写流程。
IO 接口与程序存储模块:为处理器提供与外部交互的能力,程序指令也储存在这一区域。处理器可执行指令如“读取地址 A 和 B 的值并相加,存入 C”。
控制模块(指令调度中心):负责从程序存储器读取指令,并协调 ALU、内存和 IO 的运行。
组装完成后,这个处理器的总重超过 500 克。
不过,光有硬件还不够,这里还得有定义它的指令集,也就是处理器能执行哪些操作。
MINT 指出,这些指令看起来简单,比如“把内存地址 X 的值读到寄存器 A”,但实现起来却涉及内存控制、地址解码、寄存器写入等多个步骤。
于是,他给每条指令分配了一个操作码(opcode),控制模块就根据这个码来决定电路该怎么工作。整个流程复杂但清晰。
此外,MINT 表示,「ALU 也不只支持加减,甚至可以做乘法、除法、对数、三角函数等。这是我刻意扩展的功能——毕竟 Z80 没有这些。我一边测试一边优化,有时会删掉原本的设计,加入更好的思路。」
最终经过设计,MINT 为处理器手写了超过 1800 行汇编代码,总计约为 120KB,覆盖从数学函数到逻辑位运算等丰富功能。
当然,这个过程中也有不少 bug。有些 bug 的解决方式甚至有点像“电子版现代艺术”。为了调试这些程序,MINT 还打印了整套纸质文档。纸质的优点是可随时翻阅、便于标注、无需依赖设备,非常适合在复杂系统调试中使用。
中断系统、函数调用与堆栈支持:一步步接近“真实CPU”
到了这一步,CPU 已经基本成型。接下来,MINT 着手写了以第一个正式程序用以测试——让处理器不断闪烁一个LED,并在接收到中断时点亮另一个LED。
这就引出了另一个关键话题——中断机制。
处理器通常一条一条地顺序执行指令,但有时候我们希望它能对某些外部事件(比如按钮按下)立刻响应。这就需要中断。
在架构设计方面,EPROMINT 实现了完整的中断处理逻辑。当外部事件触发中断时,处理器会将当前的程序计数器(PC)压入堆栈,跳转至中断服务程序;执行完毕后,再从堆栈中恢复 PC,继续原本的程序流程。这一机制使得它能够即时响应按钮等外部输入,具备了现代处理器的基本交互能力。
除了基础指令,MINT 还为处理器编写了一系列复杂程序。例如,将数字结果显示在 LCD 屏幕上,或将数字转换为 ASCII 字符串,再输出到高分辨率的 VFD 显示屏。这一过程涉及手动实现除法运算、堆栈操作以及字符编码转换,全部以汇编语言完成。
在一次测试中,他甚至挑战处理 256 位长度的大整数。实验中,他让处理器尝试对一个由 Chat 工具生成的 100 位十进制数执行除法计算,结果系统崩溃。为了查明问题,他利用掉电不丢失数据的 RAM 保存下内存内容,逐条追踪、排查逻辑,最终找出故障根源。
更令人惊讶的是,EPROMINT 这个项目不仅能跑代码,还能播放视频。
MINT 手动实现了一个用于精确控制帧率的除法循环,使其能稳定输出 24 帧/秒的视频信号。在接入高分辨率 VFD 显示屏后,他还播放了一段《黑客帝国》的片段——虽然是极简像素风,但效果完整,令人震撼。
开源与后续计划:为它写一个 C 编译器
EPROMINT 目前已完全开源。所有电路图、固件、设计文档和指令集说明均可在 GitHub(https://github.com/majsterkowanieinietylko/EPROMINT) 和 Google Drive(https://drive.google.com/drive/folders/11-RFmGcRUevfkHXVt-ET09YOgsZoN3Ui)上获取。
MINT 表示,下一阶段计划为其开发一个 C 语言编译器,让更多人能够用高级语言为这颗自制处理器编写程序。
他希望通过这一项目,让人们重新理解处理器的本质。我们每天使用的手机、电脑、智能设备,其实都是在运行类似的底层逻辑。只不过,在当代技术高度集成的背景下,这些复杂性被完美隐藏了。
“这个项目让我重新敬畏这些基本构件的力量,也希望能让更多人看到:不用现代 IC,不用现成平台,只要理解和努力,计算机依然可以被从零‘拼’出来。”
EPROMINT 发布后,立即引发社区热议。不少网友评论道:
“太棒了!终于不用 Arduino 或树莓派,这一切完全建立在老式芯片之上。”
“这才是 DIY 精神的极致。”
也有人打趣说:“我们需要这个人去负责 Intel 的 18A 工艺。”
不可否认,EPROMINT 并不以实用性取胜,它的运行速度、集成度甚至功耗表现都无法与现代芯片相提并论。但正是这样一个由旧零件拼接而成、用汇编驱动计算的“复古处理器”,却以一种极具个人风格的方式,重新演示了“计算”这一概念的本质。
而这场实验的发起者,只是一个手持电烙铁、热爱动手的普通创作者。不得不说,高手,往往就在民间。
参考:
https://www.youtube.com/watch?v=xBB1nAUvuqU
https://www.tomshardware.com/pc-components/cpus/passionate-enthusiast-builds-a-fully-functional-processor-out-of-old-memory-chips-hand-solders-every-wire-writes-1800-lines-of-assembler-code-and-makes-it-play-the-matrix-on-a-vfd-display#xenforo-comments-3883038
本文来自微信公众号“CSDN”,整理:屠敏 ,36氪经授权发布。