如果有人和你说要“手搓”一颗CPU,我想大多数对于CPU行业有所了解的朋友第一反应都是“你在做什么梦?”。因为就算是目前成本最低的芯片,至少都采用微米级工艺,不管是设计还是制作都需要专业机器的辅助,靠原始工具来制造几乎不可能成功。
不过,如果是古董级别的CPU,那么人工自制的成功可能性还是有的,毕竟人类第一台计算机就是由一群工程师和科学家徒手打造的,最多就是用上了诸如焊枪等工具。如果说几十年前的人可以完成,那么在现代更发达的微电子工程学的指导下,制作一颗古董级处理器并不是一件困难的事情。
比如一位贴吧大神就自制了一颗CPU,并且成功运行了自己手写的二进制程序,被网友称为“肝上长了个人”“焊武帝”,如果你好奇他是怎么自制CPU的,小雷今天就带你一起看看吧。
如何手搓一颗CPU?
手搓CPU之前,首先要了解CPU的基本构造,虽然经过数十年的发展,现代CPU在工艺上已经与最早的CPU有了很大区别,但是在基本构造上还是大致相同的。比如用于逻辑计算的运算逻辑部件,用于暂存指令、数据和地址的寄存器部件以及用于控制和分析指令的控制部件,小到普通的灯控芯片,大到超级计算器的处理器核心,基本上都遵循这个设计。
在弄清楚了CPU的主要构造后,挡在面前的第一道拦路虎是电路设计,否则就连如何接线,接在哪里都会成为问题,更谈不上打造一颗处理器。可以用于CPU设计的软件有不少,这位手搓CPU的肝帝使用的Quartus就是一款由英特尔推出的设计软件,拥有强大的辅助功能。
在翻出了数年前用Quartus设计的原理图后,naiweide(贴吧手搓CPU的大神ID)开始打造移位寄存器,也就是我们上面提到的CPU关键部件之一。输入的数据会在经过并被分配到该去的位置,按照naiweide的描述“就像是现在马路中间的交警,指挥着数据什么时候该往哪里走”。
可以说,如果移位寄存器出现问题,那么数据就会无法输入到正确的位置,导致无法正确执行指令,就像是出了“车祸”一样,无法通行。
大家可以感受一下这个移位寄存器的大小。
基本上用到的零件主要是二极管、三极管和电阻,此外还有作为地基的门电路,实际上后续的几个部件基本上也只需要这些零件即可,只不过是数量多寡的区别。
在完成了寄存器的制作后,naiweide开始制作程序计数器,也就是上面提到的运算逻辑部件,这个模块可以说整个第一阶段最困难的,某种程度上来说也是最“劝退”的一个阶段(naiweide自称为此耗费了半个脑袋的头发,为他的头发默哀一下)。
程序计数器涉及到的零件数量远超寄存器,只要其中一个零件出现问题那么就会影响整个系统,而且缺乏有效的debug机制,想要找到故障位置也是相当困难。而在实际的焊接过程中,受焊锡量、焊接时间等因素的影响,看似正常的各个零件在实际运行时都可能出现意想不到的问题。
比如在一次成功运行后,虽然肉眼之下一切正常,但是当naiweide用手机记录并慢放视频后,很快就发现程序计数器的执行速度忽快忽慢,而在正常情况下执行速度应该是恒定的,忽快忽慢就说明其中有一个硬件出现了问题。
在经过一个星期的debug后,终于在硬件深处找到了一个焊接反了的二极管,再加上处理其他各种问题的时间,程序计数器花了超过一个月的时间才终于制作成功,而这还只是第一步,在将其与寄存器组合在一起后,能否正常运行还是一个未知数。
为了更直观的给大家展示一下程序计数器的复杂程度,可以看一看naiweide拍摄的局部细节图。
最终完成版
而且,在打造程序计数器的过程中,naiweide还发现自己的原理图存在严重问题,无法正确控制和分析指令,最终只能够一边debug一边对电路图进行修改,功夫不负有心人,最终成功点亮所有指示灯,得到了正常运行的回馈。
在寄存器和程序计数器均完成后,接下来还要打造一个指令集,用于解析和执行输入的指令,也就是控制部件。某种程度上,指令集的先进程度会直接影响到CPU的性能,但是对于naiweide打造的这个古董级CPU来说,能够正常运行就是成功的。
相较于程序计数器,指令集部分的设计和制作并不算难,但是同样会遇到许多问题,因为到了这一步已经需要将三大部件组合在一起进行测试,只要其中一环出现冲突,那么就会反馈出错误的信息和结果。
在焊接上对应的硬件后,naiweide成功让这个古董级CPU成功运行了00H和01H两个指令,严格上来说,他已经成功打造了一颗真正的CPU,接下来的目标是使用这颗CPU实现流水灯效。
甚至在此之前,程序计数器部分又一次损坏,在经过详细检查后发现一颗二极管在运行过程中被电流击穿,完全损坏,在更换后才终于正常启动。
真·写代码
流水灯效,简单来说就是灯光依次亮起熄灭,是我们日常生活中最常见的灯效之一,在一般情况下,只需要一个小指甲盖大小的芯片就可以实现包括流水灯效在内的多种灯效控制。
这么看来,似乎不难?毕竟只是灯光控制罢了,随便一个玩具都可能具备这个功能。但是,不要忘了这颗CPU是完全手工打造的,相当于完全自主研发的指令集和架构,所以没有办法从现有的资料中获得帮助,甚至连配套的编程语言都欠缺。
那么,naiweide是如何解决编程问题的?很简单,使用最原始的机械语言——二进制,也就是由0和1组成的一长串数字代码。对于一般人来说,也许光是看着那一大串代码就已经头晕,并且觉得人类真的可以理解吗?实际上想要对其进行编译也不是什么异想天开的事情,一些常用的代码还是可以比较轻松记忆下来的。
如果是利用现有的一些编程软件,其实也可以轻松的写下这段代码,不过naiweide还是使用了最原始的手写代码方式,来打造这颗CPU的第一个完整程序。至于输入程序的方式也是相当硬核,“扣”按键,在一块8位指令输入板上按照二进制代码的顺序依次扣动对应按键,输入完成后再进行第二条代码的输入。
在完成指令输入后,naiweide发现程序并没有正常运行,在随后的检查中发现有地方的连接因为意外断开,而且程序设计上也有一些问题,最终重新编程后才成功运行了一套完整的流水灯效。
手搓CPU有意义吗?
naiweide制作的这颗CPU,从性能和功能上来说可能还不如淘宝几块钱买的一颗处理器。根据作者描述,在最初启动的时候,主频只有可怜的1Hz,而在经过多次改进后,也仅仅提升到了kHz。
作为对比,淘宝售价5元的G处理器主频为2.6GHz,也就是MHz,等于000KHz,也就是自制CPU的两万六千倍,考虑到更丰富完善的指令集和架构,实际差距还会更大。至于大家谈论CPU时常提的制程,该CPU大概是2.54mm制程,是目前的5nm先进制程的数十万倍。
当然,单看性能什么的,肯定是没有意义的,naiweide制作CPU的初衷主要是想亲自验证一下二进制代码的执行过程,以及从零开始摸清楚CPU的运行逻辑,实践出真知,只有实际做过了,在随后的工作中才能更好的了解整个系统和硬件的运行过程。
所以,从实用上看,确实没有多大意义,但是对于naiweide来说却是一个很好的学习及积累经验的过程。
虽然不少评论都说只需要大学级别的知识就能制作出相同的作品,但是其中的毅力、耐心却很少有人具备,而这些恰恰是成功所具备的前置条件,所以小雷十分期待这位UP日后能够在这个领域做出更大的贡献。
转载请注明地址:http://www.abmjc.com/zcmbzz/3102.html