掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在 B 站當(dāng) UP 主,門檻是出了名的高。

有人會(huì)用 AI 還原朱元璋,有人能造自動(dòng)駕駛自行車,還有人會(huì)手搓 CPU……
從外形來看,這個(gè) CPU 采用了「3D 堆疊」技術(shù)(手動(dòng)狗頭),全部由三極管、二極管和電阻焊接而成。
具體來說,UP 主林乃衛(wèi)大約用了 1000 多個(gè)三極管、2000 多個(gè)二極管和 2000 多個(gè)電阻,焊點(diǎn)達(dá)到上萬(wàn)個(gè),網(wǎng)購(gòu)材料大約花了 1000 多塊錢。
為了打造這款 CPU,UP 主花了大半年的時(shí)間逐點(diǎn)焊接,人送外號(hào)「焊武帝」。
由于其體型巨大,網(wǎng)友開玩笑說,「這是當(dāng)年的巨型計(jì)算機(jī)啊。」連作者本人也調(diào)侃說,它的制程是 2.54mm,「比 3 納米大了將近 1 百萬(wàn)倍。」
不過,比外形更古樸的是 UP 主的編程方式:由于指令集和架構(gòu)都是自主開發(fā)的,還沒有適配任何編程語(yǔ)言,因此他選擇采用二進(jìn)制編程,也就是原始的機(jī)器語(yǔ)言——0 和 1。
這個(gè)「龐然大物」運(yùn)行起來的效果也很炫酷:
UP 主用自制 CPU 運(yùn)行流水燈效果,即讓小燈挨個(gè)亮起來。
有人說,「我看不懂也沒怎么震撼,但這就是我小時(shí)候想象中的『科學(xué)家』,稀奇古怪的儀器和五顏六色的燈泡,拿各種五顏六色的液體互相勾兌,然后產(chǎn)生各類超強(qiáng)的氧化反應(yīng)?!?/p>
我們知道,要自制這么一個(gè) CPU,除了熟練掌握數(shù)電、模電、匯編等基礎(chǔ)知識(shí),還要具備超強(qiáng)的動(dòng)手能力和毅力。其過程之艱辛普通人可能難以體會(huì)。那么,林同學(xué)為什么要費(fèi)這么大工夫去做呢?
「在寫代碼時(shí)要分析可執(zhí)行文件中的二進(jìn)制,那時(shí)候在想,CPU 是怎么執(zhí)行這一串 0101 的呢?結(jié)合數(shù)電課程,猜測(cè)大概是那么回事,就想試一試。當(dāng)初想用門級(jí)電路來做的,但是感覺難度不是很高,想整個(gè)從零開始理解透,就從最基礎(chǔ)的模擬電路開始搭建了。」林同學(xué)告訴機(jī)器之心。
當(dāng)然,當(dāng) UP 主只是林同學(xué)的愛好之一,他的本職工作是 php/.net / 安卓 APP 程序員。他表示自己喜歡學(xué)習(xí)各種新科技,對(duì)高難度的技術(shù)有較強(qiáng)的動(dòng)力去學(xué)習(xí),有許多新奇的創(chuàng)意,卻沒資金去實(shí)現(xiàn)。在這次 B 站大火之后,希望林同學(xué)能有更多的資金去實(shí)現(xiàn)自己的創(chuàng)意。
雖然打造這款 CPU 只用了半年,但林同學(xué)透露,它的原理圖幾年前就畫好了,大概是這樣:
圖源:https://tieba.baidu.com/p/7432882849?see_lz=1
畫完圖,Up 主首先驗(yàn)證了門電路。這一步屬于理論驗(yàn)證,是必要的步驟。
圖源:https://tieba.baidu.com/p/7432882849?see_lz=1#140122397516l
做好驗(yàn)證之后,手搓的部分就正式開始了。CPU 通常由通用寄存器組、運(yùn)算器、控制器和數(shù)據(jù)通路等部件組成。Up 主首先就從寄存器做起。
他先造了一個(gè)移位寄存器——一種在若干相同時(shí)間脈沖下工作的以觸發(fā)器級(jí)聯(lián)為基礎(chǔ)的器件,用 Up 主的話說就是數(shù)據(jù)從一個(gè)方向進(jìn),一個(gè)時(shí)鐘周期移動(dòng)一個(gè)位置,最后從另一個(gè)方向出。最終 Up 主的成品是 6 位的移位寄存器:
有網(wǎng)友提問:「為什么移位寄存器不用現(xiàn)成的芯片?」Up 主表示「為了樂趣」。
圖源:https://tieba.baidu.com/p/7432882849?see_lz=1#140122397516l
接著,Up 主手搓的第二個(gè) CPU 部件是程序計(jì)數(shù)器(PC)。PC 是控制器的一部分,涉及的功能較多,也是手搓階段最復(fù)雜的一個(gè)模塊。CPU 重啟時(shí)要將它的計(jì)數(shù)清零,工作狀態(tài)下要借助 PC 實(shí)現(xiàn)挨個(gè)字節(jié)讀取指令和數(shù)據(jù),每操作一次,計(jì)數(shù)自動(dòng)加一,同時(shí)還要實(shí)現(xiàn)直接跳轉(zhuǎn)、調(diào)用函數(shù),函數(shù)返回的功能,因此 PC 的構(gòu)建過程比移位寄存器要復(fù)雜和困難得多。
尤其是 Up 主采用「純手搓」——焊接的過程也會(huì)遇到一些虛焊的麻煩,找出問題并解決花費(fèi)了 Up 主大量時(shí)間和精力。其中有一次一個(gè)二極管焊反了,Up 主排查了 3 天。
不過,最后的成品很優(yōu)秀,上電測(cè)試也成功通過:
CPU 中還有兩個(gè)關(guān)鍵的部分——ROM 和 RAM,不過這兩個(gè)部分手搓不太現(xiàn)實(shí),Up 主選擇用 hm628512 來組裝 ROM 和 RAM。
然后 Up 主開始構(gòu)建指令譯碼器,用來解析 CPU 指令以運(yùn)行,它也是控制器的一部分。
最后還有兩個(gè)要組裝的部件:運(yùn)算器(ALU)和通用緩存。
至此,CPU 中寄存器、控制器、運(yùn)算器等主要部件已經(jīng)完備,一個(gè)手工焊接的 CPU 就基本做成了!
由于這個(gè) CPU 是 Up 主自己手搓的,全部是由二級(jí)管、三極管和電阻焊接而成,因此沒有現(xiàn)成的指令集和編程語(yǔ)言能夠使用。那這樣的 CPU 怎么跑起來?回歸最原始的二進(jìn)制吧。
二進(jìn)制在計(jì)算機(jī)工作機(jī)制中屬于最底層的基礎(chǔ)原理,對(duì)于計(jì)算機(jī)專業(yè)的同學(xué)來說并不陌生,但用二進(jìn)制直接編程就不是所有人都能掌握的技能了。UP 主正是借助二進(jìn)制編程讓手搓的 CPU 跑了起來。
有了二進(jìn)制碼,怎么輸入機(jī)器?Up 主自己上手「扣」代碼,真 · 手敲代碼。目前有三條指令,包括內(nèi)存賦值指令、內(nèi)存地址左移指令和跳轉(zhuǎn)指令。Up 主編寫了一個(gè)流水燈的程序,用于測(cè)試。
這下指令也輸入了,CPU 能跑出結(jié)果嗎?
出現(xiàn)了一些小問題,流水燈有時(shí)不能正常亮起。別擔(dān)心,有 bug 是常有的事,那 debug 一下吧。
Up 主很快就找到了 bug,是「有個(gè)地方斷開了」。修復(fù)之后為了讓運(yùn)行效果更明顯,Up 主又重新寫了一遍二進(jìn)制代碼,將 CPU 調(diào)整為跳轉(zhuǎn)到 0X00FF 處運(yùn)行。
再手扣一遍程序,結(jié)果是運(yùn)行成功,流水燈正常亮起,完全沒有問題。
組件完整,能運(yùn)行程序,這個(gè)「爆肝」的手搓項(xiàng)目終于大功告成。
網(wǎng)友留言道:「馮諾依曼大呼內(nèi)行」。
在完成這個(gè) CPU 的基礎(chǔ)原型之后,林同學(xué)下一步打算繼續(xù)完善它的功能,讓它可以運(yùn)行更加復(fù)雜的程序。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流