服务粉丝

我们一直在努力
当前位置:首页 > 科技 >

硬核技术文:如何自己动手做一个 CPU?

日期: 来源:36氪收集编辑:36氪

编者按:中央处理器(CPU)你肯定天天都在用了。但是有没有想过自己做一个呢?自己DIY CPU?是不是有点异想天开?其实不是,作者 Sahilathrij 提供了一份制作简单CPU的指南,总共只需要3步。原文标题是:Can you Build a CPU?

想做个有趣的项目?做什么好呢?想折腾一下混淆矩阵乘法?要不弄一下链表?或者,做点实际一点的,比如说CPU?

什么是计算机?

开始造计算机之前,先复习一下定义再说。

不,我说的不是2019款的iPad Pro。数字计算机是能够模拟图灵机(无限存储除外)的电子设备。图灵机又是什么?这个改日再说吧。

大体上,计算机必须具备

  1. 内存——RAM

  2. 决策逻辑——分支

  3. 数学运算——算术逻辑单元 (ALU,Arithmetic and Logic Unit)

  4. 控制——控制单元

有了这些基本组件之后我们就可以组装计算机了。不过,首先,我们得了解一些电子知识。我会写出我用的是什么型号的组件,但你可以使用能弄到的任何组件,只要电压电平一样就行。大多数情况下,我们的组装都应该坚持用通孔安装技术(TFT)的与、或、非、异或(AND、OR、NOR、XOR)门作为基本构件。而到了晶体管层面会引入大量的模拟问题——这些问题最好不要碰。我们还得用一个预制的内存模块。通过通孔组件制作内容模块要占用的空间太大了。

首先我们得稳定住电压以及CPU的时钟频率,以及引脚发送或接收的信号能通过的长度。CPU的电压调制成5V,时钟频率定为1Khz。你也可以调高点,但要确保组件有合适的门延迟。

接下来就开始做了!

步骤1:制作寄存器

我们的计算机应该有两种通用寄存器,一种是内存寻址寄存器,一种是指令寄存器,还有一个输出。以下是个基本的8位寄存器:

我用的是74LS74触发器以及74LS125。

做5个这样的。

做完这5个之后我们现在就可以做程序寄存器了。程序寄存器是计算机用来跟踪我们执行到程序的什么位置的一种特殊的寄存器。为此,只需要将一个触发器的输出连接到下一个的输入,就能够制作出一个8位的计数器。

然后再将你的寄存器的输入和输出连接8位总线。这条总线就是8根电线,分别代表8位。只需要将内存地址寄存器的输入跟总线连接即可(输出稍后会连接的)。

然后要测试一下寄存器——试一下将值放到总线上,将不同寄存器的输入输出置为允许,看看寄存器能不能正确工作。如果INC信号(加)置入程序计数器的话,确保计数器的值增加了。

步骤2:制作ALU

我们的ALU只实现加减法。就技术而言,只需要加法就能保证图灵完整性了。但减法其实只是负的加法,所以实现减法并不难

上图展示的是基本的1位全加器。7486(XOR)以及7408(AND)

基于上面的构件我们可以做出8位的加减器:

首先,我们介绍一下标志的概念。标志是一个特殊的值,可让我们检查某些事情是否发生。比方说,零标志(Zero Flag)可让我们检查给定的加法或减法的输出是否完全为零。就我们当前的设置而言,我们有一个进位标志和一个零标志。我将这两个放到一个双字位寄存器里面。将A和B寄存器的输出连接到ALU的A端和B端,并将ALU的输出连接到输出寄存器的输入。

到这里我们的CPU就已经差不多完成了!剩下的唯一一件事是连接内容模块的地址线。我用的是有12条引线的7164S。不过我只用前8条,所以能用的RAM是2Kb。内存模块的数据引脚得连接总线。输出允许和写入允许信号用来控制对内存模块的读写。

步骤3:控制和分支

这是制作一个简单的CPU所需要的最后一步。通过这一步你可以定制出一个逻辑电路,或者你也可以选择容易一点的解决方案,通过EEPROM(我们接下来要做的事情)创建一个查找表。我们会使用8个时标(tick)的指令。如果用电子表格对控制信号进行可视化的话,这种指令更容易编写。

为此,我们需要理解CPU内部都发生了什么。

基本上,每一条指令会发生这些事情:

  1. 读取指令并进行解码。

  2. 执行指令步骤。

  3. 程序计数器增加计数

步骤1到3是所有指令都需要的,那么我们就应该看看微代码的控制信号

读取指令

时标1:

程序计数器输出:1

存储地址输入:1

所有其他引脚:0(禁用。要看一下使能引脚设置是高电平有效还是低电平有效)

时标2:

存储地址输出:1

内存输出使能:1

指令寄存器:1

指令寄存器输出:1

所有其他引脚:0

程序计数器加1:

时标8:

程序计数器 inc:1

所有其他引脚:0

这3个时标是所有指令都通用的,中间的5个时标则可以针对我们需要的任何指令进行定制。解释一下其中的两个:

加法指令:

时标1、2是一样的

时标3:

A寄存器输出:1

B寄存器输出:1

SUB模式:0

ALU使能:1

输出寄存器输入:1

所有其他引脚:0

时标4:

输出寄存器输出:1

A寄存器输入:0

所有其他引脚:0

时标5-7:

所有引脚:0(无操作)

时标8:

Inc PC (程序计数器加1)

JNZ指令(跳转指令)

时标1、2是一样的

If Zero Flag:(如果零标志位为1)

时标3:

Inc PC (程序计数器加1)

时标4:

程序计数器输出:1

存储地址输入:1

时标5:

存储地址输出:1

存储输出使能:1

PC寄存器输入:1

所有其他引脚:0

时标6-8:

(不会增加程序计数器,因为这是个JMP无条件跳转指令)

所有其他引脚:0

Else:(否则的话)

时标3-7:

所有其他引脚:0

时标8:

Inc PC (程序计数器加1)

上图展示了如何这很对给定应用组织查找表。(18针的EEPROM不好找,所以我建议拿两个14针的EEPROM复用替代)。我用的是AT28C256。毕竟,我做的CPU只需要不到15条指令。

以下是我用到的13条指令:

  1. LDA loc

  2. MVX A,Val

  3. MVX B,Val

  4. MOV A, B

  5. MOV B, A

  6. ADD A, B

  7. SUB A, B

  8. STA loc

  9. JC loc

  10. JNC loc

  11. JZ loc

  12. JNZ loc

  13. HLT

你可以针对上述指令制作自己的指令表,然后刷进你的EEPROM控制表,再插入到计算机里面。

做完这个之后我们的计算机基本上就算完工了。

接下来我们就来写个简单的乘法程序吧:

程序从10开始,每一条指令占用内存的1到2个字节。

10

11 LDA F0

13 MOV B,A

14 LDA F0

16 ADD A,B

17 STA F2

19 LDA F1

1B MVX B,1

1D SUB A,B

1E JNZ 29

20 LDA F0

22 MOV B,A

23 LDA F2

25 SUB A,B

26 STA F2

28 HLT

29 LDA F2

2B JMP 13

如果乘以0或者最后结果大于FF的话这个程序会出错。当然结果大于FF的乘法程序也是可以写的,但是这大约要占用20个内存位来写入,我怀疑我们256个字节的内存够不够用。

至此,CPU已大功告成。它可以执行Ryzen 9 CPU可执行的一切计算,只要你提供无限内存以及无限的执行时间的话。

祝贺!

你已经做出了自己的第一个CPU。

现在,你的心情也许是再也不想再碰这个怪物了,或者是对更多计算机组件的内部工作机制产生了浓厚兴趣。

如果是想进一步研究的后者,以下是一些容易实现的升级建议:

  • 增加更多的标志

  • 增加更多的指令

  • 增加更多的寄存器

  • 提高时钟频率

还不够?那还可以增加一些有点难度的升级:

  • 让时钟频率更快

  • 增加16或甚至32位支持

  • 增加流水线

  • 增加索引内存访问

  • 再多加些标志

  • 增加硬件乘除法

  • 增加I/O支持

  • 扩大内存大小

至于那些痴迷计算机组件,并且需要真正的升级的家伙,以下就是建议!

  • 让时钟频率达到MHz级别

  • 做很多个内核,然后整合到一起,做出一个多核的CPU

  • 增加浮点运算支持

  • 增加合适的I/O支持

  • 以下是挑战不可能:

  • 做出256核,然后整合出一个GPU

  • 给CPU做个操作系统

  • 实现硬件内存访问保护

  • 增加VGA支持

总而言之,CPU设计是一项非常非常复杂的工作,尝试之前请三思!

前面说了这么多正经的,如果选择多了解一点的话,其实这是一个非常有趣的话题。当数字和物理发生碰撞时,你不仅要制作逻辑电路,而且还得避免因为线路相互之间靠得太近而导致发生位翻转,或者因为磁场导致电流流到另外一条电路,让整个程序都崩掉。也许电线的长度会导致字位完到达一微妙,造成整个程序被破坏掉。当你终于把影响CPU的所有物理bug都解决掉时,自豪感和成就感就会油然而生。

译者:boxi。


相关阅读

  • 笔记本电脑搜不到wifi信号原因及解决办法

  • 1. 检查WLAN是关闭或者被禁用笔记本电脑上有一个无线功能(WLAN)开关。确保它是开着的,笔记本电脑中的WLAN(无线网络连接)被禁用,相当于关闭了无线功能,因此笔记本电脑无法搜索
  • 当庭宣判、督促履行,在这里小额诉讼更快一些

  • 开栏的话近日,海淀法院结合速裁工作实际,创建小额诉讼案件“三个一”快速办理模式,即打造一条全链条办理“快车道”,构建“一堂清”要素式审判便捷机制,健全一套专业化审判管理机
  • 全国大学生机器人大赛在宁波举行

  • 你见过会射击的无人车吗?你见过自行扫码的无人车吗?5月8日,第25届全国大学生机器人及人工智能大赛(浙江赛区)在宁波职业技术学院开幕。“程序设定完毕!”“机器人准备就绪!”“3,2,
  • 必须使用小程序才能点餐?北京消协:涉嫌侵权

  • 当前,“必须关注公众号才能开发票”、“必须使用小程序才能点餐”、“必须扫码缴费”,诸如此类扫码强制关注使用的现象在生活中并不少见。5月9日,北京市消费者协会表示,经营者将关
  • 河南启动第六周期医师定期考核信息确认

  • 据河南省卫生健康委消息,5月8日上午8时起,河南开展确认第六周期(2019-2022年度)医师定期考核报名信息工作,截止时间为5月25日24时。信息咋确认?本周期医师定期考核报名信息的确认
  • OneNote怎么启动

  • OneNote是微软公司开发的一个数字笔记本应用程序,可以在Windows、Mac、iOS和Android设备上运行。以下是在Windows操作系统中启动OneNote的方法:1. 在Windows任务栏上搜索OneNo
  • 手机的复制存哪了

  • 当您在手机上复制一段文本或图片时,在手机内存中会自动保存该内容,并被称为剪贴板。剪贴板是一个临时的存储区域,在您复制其他内容之前,之前保存的内容会一直保留在剪贴板中。在

热门文章

  • 解码“新IT”的5个特征和3大价值

  • 党的二十大报告提出,要加快发展数字经济,促进数字经济和实体经济深度融合,打造具有国际竞争力的数字产业集群。在数字经济与实体经济深度融合的产业浪潮中,以智能设备、边缘计算
  • OPPO k1的低价高配真实么?网友:不看不知道

  • 近日OPPO一款新机OPPO k1,摒弃了高价低配,就连自家老大哥r17都要怼一下。更是放弃了请代言人,以往的OPPO手机还没出来,各路流量小生,花样美男的代言就先来了。还有线下销售人员的
  • 一招教你手机无限制成为一台新设备

  • 大家平时用手机去注册app,肯定会遇到检测设备异常,交易关闭,等问题 这个都是手机已经不止1-2次注册过此app,不断更换手机仅是一个暂时的方法,却不是长久之计,手机总归会用完
  • 从零开始如何开网店

  • 随着互联网的高速发展,人们的生活发生了翻天覆地的变化,生活节奏越来越快,网购已经成为家家户户生活中离不开的一种购物方式了。网购的发展使得越来越多的人想要涉足电商事业,那

最新文章

  • 硬核技术文:如何自己动手做一个 CPU?

  • 编者按:中央处理器(CPU)你肯定天天都在用了。但是有没有想过自己做一个呢?自己DIY CPU?是不是有点异想天开?其实不是,作者 Sahilathrij 提供了一份制作简单CPU的指南,总共只需要3步
  • 开展宣传活动 共建文明城市

  • 为进一步构建文明和谐的社区,提升城市文明程度,5月12日,中心站街道鞍山社区开展文明城市宣传活动,倡导居民积极行动起来,人人参与到文明创建中来,从自我做起,从现在做起,以实际行动