手工焊接,二進制寫碼,B站Up主手搓CPU爆火出圈
在 B 站當 UP 主,門檻是出了名的高。
有人會用 AI 還原朱元璋,有人能造自動駕駛自行車,還有人會手搓 CPU……
從外形來看,這個 CPU 采用了先進的「3D 堆疊」技術(手動狗頭),全部由三極管、二極管和電阻焊接而成。
具體來說,UP 主林乃衛大約用了 1000 多個三極管、2000 多個二極管和 2000 多個電阻,焊點達到上萬個,網購材料大約花了 1000 多塊錢。
為了打造這款 CPU,UP 主花了大半年的時間逐點焊接,人送外號「焊武帝」。
由于其體型巨大,網友開玩笑說,「這是當年的巨型計算機啊。」連作者本人也調侃說,它的制程是 2.54mm,「比先進的 3 納米大了將近 1 百萬倍。」
不過,比外形更古樸的是 UP 主的編程方式:由于指令集和架構都是自主開發的,還沒有適配任何編程語言,因此他選擇采用二進制編程,也就是原始的機器語言——0 和 1。
這個「龐然大物」運行起來的效果也很炫酷:
有人說,「我看不懂也沒怎么震撼,但這就是我小時候想象中的『科學家』,稀奇古怪的儀器和五顏六色的燈泡,拿各種五顏六色的液體互相勾兌,然后產生各類超強的氧化反應。」
我們知道,要自制這么一個 CPU,除了熟練掌握數電、模電、匯編等基礎知識,還要具備超強的動手能力和毅力。其過程之艱辛普通人可能難以體會。那么,林同學為什么要費這么大工夫去做呢?
「在寫代碼時要分析可執行文件中的二進制,那時候在想,CPU 是怎么執行這一串 0101 的呢?結合數電課程,猜測大概是那么回事,就想試一試。當初想用門級電路來做的,但是感覺難度不是很高,想整個從零開始理解透,就從最基礎的模擬電路開始搭建了。」林同學告訴機器之心。
當然,當 UP 主只是林同學的愛好之一,他的本職工作是 php/.net / 安卓 APP 程序員。他表示自己喜歡學習各種新科技,對高難度的技術有較強的動力去學習,有許多新奇的創意,卻沒資金去實現。在這次 B 站大火之后,希望林同學能有更多的資金去實現自己的創意。
一位 B 站 UP 主的手搓 CPU 之路
雖然打造這款 CPU 只用了半年,但林同學透露,它的原理圖幾年前就畫好了,大概是這樣:

圖源:https://tieba.baidu.com/p/7432882849?see_lz=1
畫完圖,Up 主首先驗證了門電路。這一步屬于理論驗證,是必要的步驟。

圖源:https://tieba.baidu.com/p/7432882849?see_lz=1#140122397516l
做好驗證之后,手搓的部分就正式開始了。CPU 通常由通用寄存器組、運算器、控制器和數據通路等部件組成。Up 主首先就從寄存器做起。
他先造了一個移位寄存器——一種在若干相同時間脈沖下工作的以觸發器級聯為基礎的器件,用 Up 主的話說就是數據從一個方向進,一個時鐘周期移動一個位置,最后從另一個方向出。最終 Up 主的成品是 6 位的移位寄存器:
有網友提問:「為什么移位寄存器不用現成的芯片?」Up 主表示「為了樂趣」。

圖源:https://tieba.baidu.com/p/7432882849?see_lz=1#140122397516l
接著,Up 主手搓的第二個 CPU 部件是程序計數器(PC)。PC 是控制器的一部分,涉及的功能較多,也是手搓階段最復雜的一個模塊。CPU 重啟時要將它的計數清零,工作狀態下要借助 PC 實現挨個字節讀取指令和數據,每操作一次,計數自動加一,同時還要實現直接跳轉、調用函數,函數返回的功能,因此 PC 的構建過程比移位寄存器要復雜和困難得多。
尤其是 Up 主采用「純手搓」——焊接的過程也會遇到一些虛焊的麻煩,找出問題并解決花費了 Up 主大量時間和精力。其中有一次一個二極管焊反了,Up 主排查了 3 天。
不過,最后的成品很優秀,上電測試也成功通過:
CPU 中還有兩個關鍵的部分——ROM 和 RAM,不過這兩個部分手搓不太現實,Up 主選擇用 hm628512 來組裝 ROM 和 RAM。
然后 Up 主開始構建指令譯碼器,用來解析 CPU 指令以運行,它也是控制器的一部分。
最后還有兩個要組裝的部件:運算器(ALU)和通用緩存。
至此,CPU 中寄存器、控制器、運算器等主要部件已經完備,一個手工焊接的 CPU 就基本做成了!
搓出來了,怎么運行?
由于這個 CPU 是 Up 主自己手搓的,全部是由二級管、三極管和電阻焊接而成,因此沒有現成的指令集和編程語言能夠使用。那這樣的 CPU 怎么跑起來?回歸最原始的二進制吧。
二進制在計算機工作機制中屬于最底層的基礎原理,對于計算機專業的同學來說并不陌生,但用二進制直接編程就不是所有人都能掌握的技能了。UP 主正是借助二進制編程讓手搓的 CPU 跑了起來。
有了二進制碼,怎么輸入機器?Up 主自己上手「扣」代碼,真 · 手敲代碼。目前有三條指令,包括內存賦值指令、內存地址左移指令和跳轉指令。Up 主編寫了一個流水燈的程序,用于測試。
這下指令也輸入了,CPU 能跑出結果嗎?
出現了一些小問題,流水燈有時不能正常亮起。別擔心,有 bug 是常有的事,那 debug 一下吧。
Up 主很快就找到了 bug,是「有個地方斷開了」。修復之后為了讓運行效果更明顯,Up 主又重新寫了一遍二進制代碼,將 CPU 調整為跳轉到 0X00FF 處運行。
再手扣一遍程序,結果是運行成功,流水燈正常亮起,完全沒有問題。
組件完整,能運行程序,這個「爆肝」的手搓項目終于大功告成。
網友留言道:「馮諾依曼大呼內行」。
在完成這個 CPU 的基礎原型之后,林同學下一步打算繼續完善它的功能,讓它可以運行更加復雜的程序。