找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3896

积分

0

好友

516

主题
发表于 3 小时前 | 查看: 3| 回复: 0

每次按下家中的电灯开关时,你是否想过:这简单的“开”与“关”,其实正是构建复杂 CPU 的基础?当然,要组成一块真正的 CPU,需要的开关数量会多得惊人——大概需要几十亿个。

伟大的发明

回顾过去 200 年,人类最重要的发明是什么?是蒸汽机、电灯还是火箭?或许这些都不是,真正的主角其实是下面这个小东西:

一只黑色三引脚晶体管,置于白色背景上

这个小东西就叫晶体管。你可能会好奇:晶体管到底能干什么?

事实上,晶体管的功能简单到极致:给一端通电,电流就可以从另外两端通过;否则,电流就无法通过。本质上,它就是一个开关。

正是这个小东西的诞生,让三位科学家荣获了诺贝尔物理学奖,足见其举足轻重的地位。

无论程序员编写的软件多么复杂,所有功能最终都是由这种小开关的简单开闭来实现的。除了“神奇”二字,我实在找不到更贴切的词来形容。

AND、OR、NOT

有了晶体管这种开关之后,我们就可以“搭积木”了。你可以轻易地搭建出以下三种组合:

  • 两个开关只有同时打开,电流才会通过,灯才会亮。
  • 两个开关中只要有一个打开,电流就能通过,灯就会亮。
  • 当开关关闭时,电流通过,灯会亮;打开开关时,电流反而无法通过,灯会灭。

你随手搭建的这三种组合,分别就构成了逻辑电路的基础:与门(AND Gate)或门(OR Gate)非门(NOT Gate)。它们在电路图中用符号表示如下:

展示 AND、OR、NOT 三种逻辑门电路符号的示意图

道生一、一生二、二生三、三生万物

最令人惊叹的是,你随手搭建的这三种电路拥有一种“近乎玄学”的特性:任何一个逻辑函数,最终都可以用 AND、OR 和 NOT 这三种基本门表达出来。这就是所谓的逻辑完备性

这也就是说,只要给我们足够多的 AND、OR 和 NOT 门,就能实现任意一个逻辑函数,无需其它任何类型的逻辑门电路。此时,我们认为与、或、非门就是逻辑完备的。

这个结论一经问世,便吹响了计算机革命的号角。它告诉我们,一台计算机最终可以由最简单的与、或、非门搭建而成。这些基本的逻辑门电路,就好比生命体的基因。

DNA双螺旋结构示意图,类比逻辑门构建复杂系统

老子云:“道生一,一生二,二生三,三生万物”,这与逻辑完备性的思想简直是异曲同工。

尽管我们可以用与、或、非门实现所有逻辑运算,但我们真的需要把每一种运算都用最基本的门硬搭出来吗?这显然不现实,也不高效。

计算能力是如何诞生的

现在,作为“万物之源”的基础元素——与、或、非门已经就位。接下来,让我们着手设计 CPU 最核心的能力:计算。以加法为例。

由于 CPU 只认 0 和 1(二进制),那么二进制加法的所有可能组合如下:

  • 0 + 0,结果为 0,进位为 0
  • 0 + 1,结果为 1,进位为 0
  • 1 + 0,结果为 1,进位为 0
  • 1 + 1,结果为 0,进位为 1(这就是二进制的规则)

请注意“进位”这一列:只有当两路输入都是 1 时,进位才为 1。这不正是我们前面设计的“与门”吗?

再看“结果”这一列:当两路输入值相异时,结果为 1;相同时,结果为 0。这不就是“异或”逻辑吗?既然我们说过与或非门是逻辑完备的,异或逻辑自然也可以由它们组合而成。用一个与门和一个异或门就能实现二进制加法:

由与门和异或门构成的一位加法器电路图

这个电路就是一个最简易的加法器。神奇吗?既然加法能用与或非门实现,其它运算也同样可以实现,这正是逻辑完备性的威力。

除了加法,我们还能根据需要设计出各种算数运算电路。负责计算的这部分电路有一个统称,叫 ALU(Arithmetic/Logic Unit,算术逻辑单元)。它就是 CPU 中专门负责计算的模块,本质上和我们上面设计的简单电路没多大区别,只是复杂得多。

就这样,通过与、或、非门的巧妙组合,我们获得了计算能力。

但是,仅有计算能力还不够。电路还需要能够“记住”信息。

神奇的记忆能力

到目前为止,我们设计的组合电路,比如加法器,天生无法存储信息。它们只是简单地根据输入生成输出,但输入和输出的数值总得有个地方保存起来,这就需要电路具备记忆能力。

电路怎么能保存信息呢?就在你百思不得其解时,你的大脑中浮现出这样一个既简单又神奇的电路:

由两个 NAND 门交叉耦合构成的 SR 锁存器电路图

这是两个与非门(NAND)的组合。别紧张,NAND 也是由你设计的与或非门组合而成的。所谓 NAND 门就是“先与后非”,例如输入 1 和 0,相与得 0,再取非得 1。这些细节在此并不重要。

关键在于这个电路的独特接法:一个 NAND 门的输出,接入了另一个 NAND 门的输入。这种交叉耦合的结构带来了一种极有趣的特性:只要给 S 端和 R 端都输入 1,这个电路就只会处于两种稳定状态中的一种

  • 要么 a 端为 1,此时 B=0、A=1、b=0;
  • 要么 a 端为 0,此时 B=1、A=0、b=1。

绝无其他可能。我们把 a 端的值视为整个电路的输出

接下来,如果你把 S 端设为 0(R 端保持为 1),那么电路的输出,即 a 端,将永远为 1。这时就可以说,我们把“1”存进了电路里。反之,若将 R 端设为 0(S 端保持为 1),a 端将永远为 0,我们就把“0”存进去了。

神奇吗?电路竟然拥有了存储信息的能力

为了能更方便地保存信息,我们只需要控制单端输入(毕竟一次只存一个 bit 位嘛),你对电路稍作改造:

增加写使能逻辑后的 D 锁存器电路图

就这样,当 D 端为 0 时,整个电路就保存 0;否则就保存 1。

寄存器与内存的诞生

现在,你的电路可以存储一个比特位了。想存储多个比特位?很简单,“复制粘贴”就行:

由多个锁存器单元并联组成的 4 位寄存器电路图

我们管这个能存储多位数据的组合电路叫寄存器。没错,我们常说的寄存器,本质上就是这东西。

你并未满足于此,继续搭建更复杂的电路以存储更多信息,并为之添加了按地址访问的功能。就这样,内存也诞生了。

寄存器和内存都离不开上一节介绍的那个简单存储电路。只要通电,这个电路中就能保存信息,一旦断电,信息就丢失了。看到这里,你应该立刻明白,为什么内存断电后就不能保存数据了吧?

硬件还是软件?

至此,我们的电路已经能计算、能存储了。但还有一个问题:尽管我们可以用与、或、非门表达所有逻辑函数,但我们真的有必要为每个运算都单独设计一款硬件电路吗?显然,这不现实。

这就像做菜。你见过哪个酒店是为了做出一桌宴席,而把擅长川、鲁、粤、淮扬的各个菜系厨师全部雇齐的?

中华美食博大精深,风味千差万别,但烹饪的基本功大同小异:刀工、火候、颠勺等等。每道菜都要经历这些基本步骤,变化的无非是食材、调料和火候大小,这些都写进菜谱里就行。给厨师一张菜谱,他就能做出任何一道菜。在这里,厨师好比硬件,菜谱好比软件

一个人手持菜谱,寓意软件指导硬件完成工作

同样的道理,我们无需为每一种计算逻辑都设计对应的硬件。硬件只需提供最基础的功能,而所有复杂的计算逻辑,都通过软件在这些基础功能上编排出来。这就是“软件”一词的起源:硬件不可变,但软件可变。不变的是硬件,但运行不同的软件,就能让硬件实现全新的功能。这是一个天才般的构想

同样一台计算机硬件,安装 Word 你就能编辑文档,安装聊天软件就能即时通讯,安装游戏就能畅玩娱乐。硬件还是那套硬件,运行不同的软件就能实现不同的功能。每次打开电脑使用各类软件时,不在心中暗叹一声“牛X”,你都对不起计算机这项伟大的发明。这就是为什么计算机被称为通用计算设备,这一思想源于计算机科学的祖师爷——图灵。

三个图标分别代表文本编辑器、聊天工具和游戏,指向同一台电脑

我们继续深入,看看硬件是如何提供这些“基本功”的。

硬件的基本功

思考一个问题:CPU 怎么知道自己要执行加法运算,以及要对哪两个数进行加法?

很显然,你必须告诉它。怎么告诉呢?还记得刚才给厨师的菜谱吗?没错,CPU 也需要一份“菜谱”来指导自己下一步该做什么。这份菜谱就是机器指令,指令最终由我们之前实现的组合电路来执行。

随之而来的是另一个问题:这样的指令肯定非常多。还是以加法为例,你可以让 CPU 算 1+1,也可以算 1+2……单就加法指令就有无数种操作数组合。显然,CPU 不可能去为每一种情况都实现一条指令。

实际上,CPU 只需要提供加法这个操作,而你只需给它提供操作数。用个形象的比喻:CPU 说“我可以打人”,你需要告诉它打谁;CPU 说“我可以唱歌”,你需要告诉它唱什么歌。CPU 提供的是机制(功能),而我们提供的是策略(具体数据或地址)。在计算机基础理论中,理解这种机制与策略的分离至关重要,这也是计算机基础课程中会反复探讨的核心思想。

CPU 表达这些机制的方式,就是指令集

指令集

指令集定义了 CPU 可以执行哪些指令,以及每条指令需要什么样的操作数。不同类型的 CPU 有着不同的指令集。

指令集中的指令其实都非常简单,其“画风”大体是这样的:

  • 从内存中读一个数,地址是 abc
  • 对两个数进行求和
  • 检查一个数是否大于 6
  • 把这个数存储到内存,地址是 abc
  • 等等……

看起来很像碎碎念,对吧?这就是机器指令。我们用高级语言编写的程序,例如对一个数组进行排序,最终都会被等价地转换为这些“碎碎念”般的指令,然后由 CPU 一条一条地执行。是不是很神奇?

下面来观察一条可能的机器指令:

一条 16 位二进制机器指令的格式解析图

这条指令占据 16 个比特位。其中,前 4 个比特告诉 CPU:这是一条加法指令。这意味着该 CPU 的指令集最多可以包含 2^4(即 16)种不同的机器指令。这 4 个比特决定了 CPU“做什么”,而剩下的比特位则告诉 CPU“怎么做”——具体来说,就是把寄存器 R6 和寄存器 R2 中的值相加,然后将结果写回寄存器 R6 中。

可以看到,机器指令极端繁琐。因此,现代程序员都使用高级语言来编写程序。关于高级语言与机器指令的前世今生,可以参考《你管这破玩意叫编程语言?》。

指挥家:让我们演奏一曲

现在,我们的电路有了计算能力、存储能力,还能通过指令来指挥电路执行特定操作。但还有一个关键问题没有解决。

我们的电路系统非常复杂,有的模块负责计算,有的负责存储。以最简单的 1+1 为例,假设这两个数分别来自寄存器 R1 和 R2。要知道,寄存器中可以保存任意值。我们怎样才能确保,当加法器开始工作时,R1 和 R2 在这一时刻恰好都保存的是“1”,而不是其它任何数字呢?

换句话说,我们靠什么来协调、同步电路中的各个部分,让它们有条不紊地协同工作?就像一场成功的交响乐演出离不开指挥家一样,我们的计算电路系统也需要这样一个指挥家。

一位指挥家正指挥交响乐团,象征时钟信号协调 CPU 工作

承担这个指挥角色的,正是时钟信号

时钟信号就如同指挥家手里的指挥棒。指挥棒每一次挥下,整个乐团的成员都会整齐划一地做出相应反应。同理,时钟信号的每一次电压跳变,整个电路中的各个寄存器(也就是整个电路的状态)就会同步更新一次。这样,我们就能确保所有部件步调一致地协同工作,避免了各种时序错乱的问题。

现在你应该明白 CPU 的主频是什么意思了吧?主频就是指一秒钟内“指挥棒”挥动了多少次。显然,主频越高,CPU 在一秒钟内能完成的操作就越多。

大功告成

至此,我们拥有了能够执行各种计算的 ALU、能够存储信息的寄存器,以及协调它们协同工作的时钟信号。所有这些核心部件统称为 Central Processing Unit,简称就是 CPU

总结

一枚小小的开关,竟能构筑出功能如此强大的 CPU,其背后的理论与制造工艺的突破,无疑是人类科技史上的里程碑。说 CPU 是智慧的结晶,毫不为过。

本文从一枚晶体管开关讲起,为你由浅入深地剖析了 CPU 构造的基本原理,希望对你理解这颗计算机的“心脏”有所帮助。




上一篇:C语言为何能成为最成功的编程语言?从这三件事说起
下一篇:复杂指令集CISC的前世今生:为何它曾是CPU设计的必然选择?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-6-1 06:39 , Processed in 0.607892 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表