自制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上用编程语言实现一款操作系统,这几个系列想法,虽然现在能力上可以开始准备了,但也不知能不能实现。

  • 本文水平有限,内容很多词语由于知识水平问题不严谨或很离谱,但主要作为记录作用,希望以后的自己和路过的大神对必要的错误提出批评与指点,对可笑的错误请指出来,我会改正的。

  • 另外,转载使用请注明作者和出处,不要删除文档中的关于作者的注释。

随梦,随心,随愿,恒执念,为梦执战,执战苍天! ------------------执念执战

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