用一把烙铁,花三个月时间,你能搞出什么名堂?
这位网名叫 MINT 的小哥,从零纯手搓了个 CPU 出来,从设计、布线到编程,全程都是他一人包揽。
而且用的还是 8 位时代(上世纪七八十年代)的旧内存芯片和逻辑元件。
为了秀一波肌肉,小哥自己写了点代码,用这个手搓的 CPU 再 VFD 屏幕上放起了《黑客帝国》。
分辨率是低了点,但能流畅播放已经是相当厉害了。
纯手搓 CPU 的终极形态
这个手搓的 CPU 名叫 EPROMINT,从外观来看,整个 CPU 用了四块穿孔板,总重量有 500 来克。如果要把线路全部铺开,总长度大概能有一千米。
在配置上,EPROMINT 还是 8 位,跟现在 64 位的性能肯定没得比(具体如下)。
但要和好几十年前的 8 位 CPU 比,它还是可圈可点的。既能根据真实的指令集运行,也能执行自己的汇编代码,还能像商用处理器一样对硬件中断做出反应。
甚至它的运算速度,比当时的复古偶像产品还要更强劲。
比如驱动 Apple I/II 、任天堂红白机的 MOS 6502 ,或者主导 CP/M 系统的Z80,在这个手搓的 CPU 面前,可能都要稍稍逊色一筹, 能流畅播《黑客帝国》就是很好的证据。
EPROMINT 是怎么造出来的?
最早有纯手搓 CPU 这个想法,来自 MINT 小哥之前做过的一个实验,他用过时的 EPROM 存储芯片,搞了个能控制小型系统的开发板。
像是调节电机的转速,或者控制消息显示屏。
这个实验一下子就激发了他内心深处的 DIY 灵魂,既然内存能用来模拟基本逻辑,那用它搞个完整的 CPU 也不是不可能。
于是手搓 CPU 的计划就这么水灵灵地提上日程了。
手搓 CPU,主要就四个模块
算术逻辑运算单元(ALU):负责执行算术和逻辑运算
内存控制模块:用来数据存储和地址寻址
IO 接口与程序存储模块:给CPU提供和外部交互的能力
控制模块:读取指令,并协调前面三个模块
虽然听着挺简单,但实际手搓起来可就是另外一回事了。
就拿 ALU 来说,怎么设计就是一大难题,刚开始他搞出来的 ALU 还只能处理最简单的加法运算,用他本人的原话来说就是个玩具,而且性能也不可靠。
后来不断摸索才决定把 ALU 设计成全插槽式的,主打一个方便调试,这对手搓 CPU 来说也算是一个相当大的优势。
而在手搓 CPU 的过程中,MINT 小哥偏偏又是个完美主义者,一个模块没做到最好,就会一直修改一直修改。。。
当然,硬件设计出来后还不算完,还得有对应的指令集,这决定了 CPU 之后都能干什么。
在这块儿,MINT 小哥也是从 0 开始,写了将近 2000 行的代码,好定义 CPU 怎么处理指令,顺带简化了数据在系统中的传输方式。
而且相较于 Z80 这些老式 CPU 的能力,EPROMINT 还支持它们没有的乘法、除法、三角运算等等。
这还不算完,一个合格的 CPU 处理器,还需要学会中断任务。
就比如 CPU 本来在放《黑客帝国》,突然来了个电话,这时 CPU 得学会停下来,等人接完电话后再回来继续放。
而 EPROMINT ,遇到中断时会亮起第二个 LED 灯,紧接着把当前的程序计数器(PC)压入栈堆,等别的任务处理完后,在从栈堆里回复数据,好继续任务。
目前,EPROMINT 已经完全开源,电路图、设计文档、指令集等等都能在 GitHub 上获取,链接放在结尾了。
手搓 CPU 的意义是什么?
手搓 CPU,MINT 小哥不算是第一人,前些年 B 站就有 up 出过自己手搓 CPU 的视频,热度也是相当之高。
但可能还会有人纳闷,现在造 CPU 的技术已经相当成熟了,为啥还要费力从零手搓 CPU 呢?
借用一句网友的话,“或许这才是 DIY 的精神所在”。从零手搓 CPU 不会像现代 CPU,把所有的执行路径都隐藏在硅片之下,它的每个时钟周期、所有寄存器的更改,都是可见、可追溯的。
同时,在某称程度上手搓 CPU 也能通过深度实践,推动开源硬件文化。
无论最后手搓出的 CPU 性能如何,就光是这个行为本身,就已经够令人敬佩了。
参考资料:
CSDN、YouTube@Majsterkowanie i nie tylko、tomshardware
GitHub地址:
https://github.com/majsterkowanieinietylko/EPROMINT
编辑:三七