自制MCU的入門教程

前言

春意已起,卻乍暖還寒。
三四月的交接,是冷與暖的擁別。

說明

  • 如今,以ChatGPT爲代表的的人工智能驅動的語言處理系統已經火爆全網,開始滲透進日常生活;各種AI圖像生成工具也大行其道,精美的生成圖比肩專業的設計師。這些AI應用的廣泛而快速的普及,是真的能夠替代一些人的職位,導致失業。不過,AI的發展離不開底層電路的支持,尤其是CPU、GPU等這些提供算力的基本器件。而我,就是做嵌入式開發的。
  • 學習單片機,需要和硬件底層打交道。長久的使用單片機,也會潛移默化的導致從底層看待這個世界。但單純的從程序上配置寄存器來操縱單片機,或是從單片機上拉幾根線來被單片機操控,總歸是無法真正認識和理解單片機乃至CPU的運行機制的。
  • 大學裏面很多理工科都會有單片機或是CPU運行機制相關的課程,也會有數電模電這些課程,是會詳細講解單片機運行機制的,很多科班出身的人本科就能手寫CPU整個流程。但是對於我這種半路出家的半吊子,只有在舊書攤上買過幾本別人的二手書,總歸不是完整的理解過單片機和CPU的運行機制的。但畢竟是做這份工作的,所以看到芯片近年來被制裁的那麼慘,還是有一份鬥志在裏面的。也是想設計一款CPU,然後設計一門可編譯可腳本運行的編程語言,並用此語言在此CPU上編寫一份操作系統,至少要支持獨立的自編譯環境、支持應用安裝卸載、支持界面環境、支持在其他系統開發、支持可拓展等幾種基本功能。
  • 雖然造輪子在一定程度上是浪費生命的,但當賦予它偉光輝的使命意義,再貼上夢想的標籤,它就變得有價值了(哈哈)!不過我更深的大興趣愛好在於AI和圖像方面,嵌入式只是我工作生活和從底層認識這個世界的手段。所以這幾個想法不知有沒有時間實現。

簡介

  • CPU(Central Processing Unit)是一切計算機的基礎,MCU((Microcontroller Unit)是弱化版的CPU+外設的集成“電腦”。

  • 深入理解和學習CPU的運行機制的最好辦法,就是着手自己設計一款CPU。設計一款CPU,不僅要了解其硬件原理,還需要懂得編譯器原理和指令集等知識,才能從零開始實現一套完整的CPU流程。

  • 下面,從幾個方面記錄一下可以用於入門和深入理解CPU運行機制的相關資源。其他需要了解的知識請自行檢索學習,比如【基本電路知識】,【電路設計】,【編程語言】,【CPU架構】,【編譯器】等知識

  • 以下資源大部分都是網絡資源,部分爲書籍資源。

  • 簡單過程如下:首先是原理入門,然後是用FPGA或是硬件電路板實現基本的CPU電路,或是軟件模擬運行一款MCU,最後就可以手搓CPU了,並在其基礎上實現指令集、編譯器等,然後進一步的實現更加複雜和完善的功能。

數電仿真實現入門

logiccircuit

  • CPU的核心原理是要搞懂數字電路這門課程。大學課本中的《數字電路》很難硬着頭皮看完,所以一個可視化的、可仿真的軟件對於學習數字電路是非常有幫助的。
    logiccircuit 】 是一個電子電路設計軟件,用於可視化建立電路設計和模擬電路運行。它是開源項目,由全球的愛好者和開發人員共同開發。
    它可以通過拖拽的方式,很輕鬆的實現邏輯門的組合和驗證。使用它,甚至可以搭建和仿真出一個完整的CPU。
    可拖拽的部分數字邏輯門如下:
    image

一個8位二進制CPU的設計和實現】 :這是B站一位UP以此軟件爲基礎,全流程講解如何實現一個8位CPU的教程。
一個8位二進制CPU的設計和實現】:這個是愛好者根據視頻整理的文字版。

Proteus等電路仿真軟件

  • 一些專業的電路EDA軟件帶有電路仿真功能,有豐富的器件,完善的器件特性,能夠較好的實現電路的搭建,甚至能直接轉爲PCB用於繪製,比如【Proteus】
  • Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。
  • 在它上面完全可以搭建並仿真完整的CPU電路(當然,畢竟是軟件,還是有資源限制的),然後生成PCB用於佈線打板,生成實物。
  • 比如【基於proteus的CPU控制器設計(微程序版)】及【基於proteus的一個硬佈線CPU】等

《我的世界》

  • 之前很火的,在《我的世界》這個遊戲中,從底層搭建出一個紅石驅動CPU,還能在搭建的屏幕上玩遊戲。
  • 感興趣的可以自行了解,不做推薦。

虛擬機

FPGA仿真或是電路搭建仿真

仿真的目的是轉爲實物,以下是轉爲實物的方法。

FPGA編寫實現

  • FPGA(Field-Programmable Gate Array)即現場可編程門陣列:它是作爲專用集成電路(ASIC)領域中的一種半定製電路而出現的,既解決了定製電路的不足,又克服了原有可編程器件門電路數有限的缺點。

  • 在FPGA上,可以重複燒寫不同的數字邏輯門電路,所以理論上,能夠在FPGA上仿真整個CPU,外加部分數字外設。

  • FPGA主流的編程語言:Verilog HDL、VHDL、SystemVerilog, 推薦使用Verilog HDL語言。

  • Verilog HDL(簡稱 Verilog )是一種硬件描述語言,用於數字電路的系統設計。可對算法級、門級、開關級等多種抽象設計層次進行建模。 Verilog 繼承了 C 語言的多種操作符和結構,與另一種硬件描述語言 VHDL 相比,語法不是很嚴格,代碼更加簡潔,更容易上手。Verilog 不僅定義了語法,還對語法結構都定義了清晰的仿真語義。因此,Verilog 編寫的數字模型就能夠使用 Verilog 仿真器進行驗證。

  • FPGA也是可以通過軟件模擬仿真運行的。但是還是推薦硬件測試環境。

  • 硬件可以使用開發板。比如Sipeed科技推出的【Tang】系列FPGA開發板,或是資源更豐富的ZYNQ7010/7020系列開發板。前者價格低,後者性能更豐富,是FPGA+ARM架構,可同時運行FPGA+Linux。

  • Sipeed科技推出的 【Tang】系列FPGA開發板,使用國產廠商 【高雲】的系列FPGA芯片,有較高的性價比。推薦使用 【Tang Primer 20K】開發板,資源比較豐富,能夠實現較複雜的設計,廠家自帶一個MCU內核(不開源)。而且Sipeed提供了一些入門教程和例程,適合快速入門【Tang Primer 20K 教程

  • 高雲提供了一款RISC-V的IP核,可以直接調用,在FPGA上跑這款單片機核,不開源:

  • 雖然IP核不開源,但是可以在很多地方找到開源的FPGA的編寫MCU的代碼和教程,比如在 Gitee的 【其他開源 -> RISC-V】欄中,有很多用FPGA實現的處理器核,可以用於深入學習和理解如何在FPGA上實現完整的MCU。

  • 比如 【tinyriscv】項目,配套有【從零開始寫RISC-V處理器】教程,經過簡單的移植和適配,就能在 20K上跑起來。

  • 不過,FPGA畢竟是可編程的,其實現的邏輯思維很大還停留在程序層面,比如基本的門電路,只需要幾個代碼就能實現,而不是硬件的理解(比如與門就是 &)。而且也不是很酷。但此類資源較多,比如【CPU自制入門】這類的書籍基本都是基於FPGA實現的。

  • 但是,FPGA仿真這一步,是設計和製造一塊CPU芯片的很重要的步驟,所以它在CPU設計領域很重要。但是一般的玩家根本不需要考慮到CPU的實際生產步驟,所以它顯得不是那麼重要,所以有想深入鑽研的,一定要掌握好FPGA。

硬件搭建實現

  • FPGA實現MCU屬於較深等級的實現,因爲FPGA代碼雖然簡單,但要想堆疊出完善的硬件邏輯,還是需要花費一番功夫的,而且搭建出的東西宏觀上也只是程序的表現,與實際硬件還是有些區別的。對於不需要考慮自己流片的入門者來說,搭建實物還是很酷的。
  • 實際上,很多入門者都用硬件電路搭建CPU(一般都是MCU)。這些入門者不乏很多初中甚至小學的人才!(比如B站就有幾個小學生自制CPU的視頻,沒有觀看過,此處不做評價)。其他的很多都是用基本的門電路芯片,搭建出基本的MCU核心電路,有些還在其上面實現了複雜代碼運行(需要實現適配的編譯器),還有些跑出了較爲複雜的界面環境:

    其中的第二個【74門電路自制8位CPU(原創)】,有着較爲完善的C語言編譯器和操作系統以及CPU指令集,還提供了開源文件:
  • 當然,上面都是用現成的門電路芯片拼裝組合的,還可以從底層直接二極管三極管等分立元器件搭建電路,但是比較複雜和耗時,不如用完整的門電路來實現,只需要考慮芯片的電壓、功率等參數即可組裝實現。
  • 硬件搭建推薦先用上述的一些仿真環境進行仿真驗證,再進行硬件的實物實現,節省時間和金錢。當然,很多網購平臺也會有一些商家提供設計好的成套硬件電路,購買來焊接學習即可。

指令集

  • 上述的一些教程中含有指令集的介紹和實現,這也是實現一個CPU必不可少的步驟,因爲CPU運行的最終目的,就是要實現能夠執行不同的指令。
  • 指令集是適用於操作底層硬件的代碼,屬於數據二進制的語言化的代碼。因爲底層硬件都是0和1組成的數字門,而操控它們只需要基本的二進制。但爲了方便操作,不用去寫繁雜的二進制數據,於是將他們按照運行邏輯進行分類,整合成了各種指令。而將指令轉爲二進制機器碼的過程就需要編譯器的存在了。
  • 我們常用的彙編語言,就屬於指令集操作語言,也因此,不同的CPU架構會有不同的彙編語言,甚至不同的單片機的彙編語言都不同。
  • 當然,這一部分也可以單獨學習【從零開始製作自己的指令集架構

編譯器

  • 不論哪種語言,最終轉換爲機器碼來運行前,都需要編譯器。將指令集轉爲機器碼的過程也需要編譯器的存在。
  • 彙編的編譯器較爲簡單,就是將指令集轉爲二進制機器碼;而高級語言的編譯器,則有更加豐富和完善的編譯條件,但爲了方便兼容不同的CPU,一般都先編譯爲對應CPU架構下的指令集語言,再由指令集編譯爲二進制機器碼。編譯出更加優秀完善和簡短的指令集意味着編譯器更加優秀。
  • 這一部分的資源感興趣的可以自行了解學習。

總結

以上是對於探索CPU運行流程並自己手動實現CPU的一些資料。大多數都是實現的8位甚至更低bit位的MCU。但目前來說,基本原理都是一致的,對於入門瞭解和個人設計,完全足夠;更高位的CPU,需要團隊配合才能實現,靠個人是很難實現的。
實際上,要想實現一個8位甚至更低位的完整的、帶編譯器甚至帶操作系統的CPU,都不是一件簡單的事,需要大量的知識積累和時間花費。雖然道阻且長,行則將至,但是也要考慮個人的人生長度,切莫隨意造輪子,浪費沒有收穫的時間。

目前我也算是剛入門,也沒有足夠的時間去實現,對於設計一款CPU,設計一款編程語言,在CPU上用編程語言實現一款操作系統,這幾個系列想法,雖然現在能力上可以開始準備了,但也不知能不能實現。

  • 本文水平有限,內容很多詞語由於知識水平問題不嚴謹或很離譜,但主要作爲記錄作用,希望以後的自己和路過的大神對必要的錯誤提出批評與指點,對可笑的錯誤請指出來,我會改正的。

  • 另外,轉載使用請註明作者和出處,不要刪除文檔中的關於作者的註釋。

隨夢,隨心,隨願,恆執念,爲夢執戰,執戰蒼天! ------------------執念執戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章