Skip to content

从晶体管到 CPU

前言

计算机是怎么"思考"的? 你可能知道 CPU 是电脑的"大脑",但这个大脑到底是怎么工作的?它怎么从一堆金属和塑料变成能执行程序、处理数据的智能设备?本章带你从最底层的晶体管开始,一步步理解 CPU 的构造原理。

这篇文章会带你学什么?

学完这章后,你将获得:

  • 术语理解能力:听到"CPU 主频"、"多核"、"指令集"不再一头雾水,能理解背后的物理原理
  • 代码执行视角:看到一行代码如何经过取指、解码、执行、写回,最终变成屏幕上的像素点
  • 抽象层次思维:理解每一层如何向上层提供服务,又如何隐藏下层的复杂性
  • 后续学习基础:为计算机体系结构、嵌入式开发、性能优化打下基础
章节内容核心概念
第 1 章晶体管数字世界的开关
第 2 章逻辑门布尔运算的物理实现
第 3 章功能单元加法器、寄存器、多路选择器
第 4 章CPU 核心取指、解码、执行、写回

0. 全景图:从沙子到智能

在探索计算机底层的过程中,常常会遇到一个最根本的问题:现代计算机的“思考”能力,究竟从何而来?

如果剥开电脑闪亮的外壳,我们看到的通常只是一堆金属、塑料和硅晶片。它们本身没有生命,不懂数学,更不懂何为智能。但当电流穿过它们时,一切开始运转起来。归根结底,这一切都来自于一个再简单不过的物理抽象:开关

想象你面前有一个控制灯泡的开关。按下灯亮,表示为“1”;断开灯灭,表示为“0”。如果我们拥有几十亿个这样的开关,并且能够让一个开关的输出去控制另一个开关,从而组合出无比复杂的逻辑网络,会发生什么?

答案是一台能执行任意逻辑的通用计算平台。理解计算机系统的关键在于“抽象(Abstraction)”。就像搭积木一样,我们通过层叠的封装来控制底层的复杂度。以下是从沙子到智能的四个核心层级:

逐层解构:从沙子到智能

  • 第一层:晶体管(数百亿级) 这是最底层的“开关”。现代 CPU 内部主要使用 MOSFET(金属氧化物半导体场效应晶体管)。给栅极施加电压,源极和漏极之间就导通。这就是“用电控制电”的物理起点,解决的核心问题是:如何用电信号控制另一个电信号?

  • 第二层:逻辑门(数十亿级) 当我们把特定的晶体管串联或并联,奇妙的转换就发生了——电路变成了数学。例如 AND(与)门必须两个输入都是 1,输出才是 1;这构成了布尔代数在物理电路上的映射,解决的核心问题是:如何把物理通断转化为基于 0 和 1 的逻辑运算?

  • 第三层:功能单元(数百级) 把基础的逻辑门拼装在一起,就能构建出有特定用途的计算模块。加法器处理算术运算,多路选择器控制数据流向,而寄存器赋予了电路记忆能力。解决的核心问题是:如何构造出能够执行加法计算和记忆状态的机器?

  • 第四层:CPU 核心(1-128核) 这是整个微架构的指挥中心。当你写下一行代码时,CPU 内部的各个部件正以每秒几十亿次的频率协同工作,执行着取指、解码、执行、写回的整个流程。解决的核心问题是:如何让各模块协同一致,自动执行指定的程序序列?


1. 晶体管:数字世界的开关

让我们从微观世界开始。下面这个组件展示了晶体管的基本原理,你可以试着操作一下,观察电流是如何流动的:

MOSFET 晶体管示意 ── 点击切换 Gate 电压
源极
Source
Gate0
断开 → 输出 0
漏极
Drain
👆 点击切换 Gate 电压

1.1 什么是晶体管?

概念引入

在工程学中,晶体管(Transistor) 是一种改变了人类历史的半导体器件。在数字电路的语境下,我们可以直接把它抽象为一个完美的“开关”。

为什么我们需要晶体管?想想生活中的水龙头。你用手拧开阀门,水流就涌出。晶体管其实就是一个纳米级的水龙头

  • 源极 (Source)漏极 (Drain) 就如同水管的两端。
  • 栅极 (Gate) 就是那个用来控制水流的阀门。

关键的区别在于:我们不是用手去拧开关,而是用电压信号。当一种开关能够被另一种开关产生的电信号所控制时,我们就跨过了从“人工干预”到“自动运算”的巨大鸿沟。

1.2 晶体管如何表示 0 和 1?

你可能会问:计算机所谓的“只认识 0 和 1”,在物理世界中究竟是什么样子?难道芯片里真的流淌着微小的 0 和 1 吗?

当然不是。这一切全靠人为的抽象约定。我们要摒弃对连续模拟信号的执念,设定两个极端阈值:

  • 我们把高电压(比如 3.3V 或 1.0V) 强行定义为逻辑的 1(True)。
  • 低电压(接近 0V) 强行定义为逻辑的 0(False)。

这就是所谓的数字抽象能力:我们把充满噪音的模拟世界,硬生生地切分成了干净利落的 0 和 1。栅极输入高电压,晶体管导通,相当于开关合上;栅极输入低电压,开关断开。

1.3 晶体管数量的演进

一个晶体管只能控制通断,显得极其微不足道。但如果把几十亿个这样的开关组合起来呢?观察下面这张体现摩尔定律的表格,了解一下现代芯片的发展。

时代标志处理器芯片晶体管数量制程节点时代意义
1971Intel 40042,30010微米微处理器黎明开端
1993Intel Pentium310万800纳米个人电脑全面普及
2006Intel Core 2 Duo2.91亿65纳米多核架构成为主流
2020Apple M1160亿5纳米移动端架构的反哺革命
2023Apple M3 Max920亿3纳米接近原子的物理学极限

深入思考:什么是 “3nm”? 当我们在新闻里听到 5nm、3nm 时,可以想象它有多微小。一个硅原子的直径大约是 0.2 纳米。所以在 3nm 的制程下,晶体管最关键的结构,只有几十个原子那么宽幅!这意味着我们是在量子力学规律生效的尺度边缘,来打造人类最庞大的算力堡垒。


2. 逻辑门:用开关做运算

2.1 从晶体管到逻辑门

正如之前所说,单个晶体管只是对电流的简单控制。但当你把多个晶体管按照特定的结构排列时,物理学就变成了数学逻辑。在这个全新的维度上,我们不再谈论繁琐的电压和电流,而是直接谈论纯粹的逻辑“真”(1)与“假”(0)。

请通过下面的逻辑门演示,直观地感受一下开关组合的效果:

四种基本逻辑门所有数字计算的基础积木
AND与门
运算:A ∧ B
两个都为 1,才输出 1
串联开关:两道门都开才通
真值表
AB输出
000
010
100
111
OR或门
运算:A ∨ B
有一个为 1,就输出 1
并联开关:任一道门开就通
真值表
AB输出
000
011
101
111
NOT非门
运算:¬A
输入取反:0 变 1,1 变 0
反向器:开变关,关变开
真值表
A输出
01
10
XOR异或门
运算:A ⊕ B
两个不同,才输出 1
差异检测器:相异为真
真值表
AB输出
000
011
101
110
核心思想: 逻辑门把物理电路的"通/断"变成了数学上的"真/假"运算,是硬件实现软件逻辑的桥梁。

2.2 基本逻辑门介绍

在我们的计算机体系结构中,有几种最基础的逻辑门,所有的超级计算机都是由这些积木搭建而成的:

  • AND 门(与门)

    • 规则:只有当所有输入都为 1 时,输出才为 1。
    • 直觉理解:把两个晶体管串联。电流要想通过,必须同时打开两道关卡。如同开启银行金库,必须经理和主管同时插入各自的钥匙。
  • OR 门(或门)

    • 规则:只要有一个输入为 1,输出就为 1。
    • 直觉理解:把两个晶体管并联。多条并行的通道,只要有一条路通了,电流就能流向彼岸。
  • NOT 门(非门 / 反相器)

    • 规则:输入 1 必定输出 0,输入 0 必定输出 1。
    • 直觉理解:这是专门用来翻转状态的门,也是电路设计中经常用于信号整形的关键防线。
  • XOR 门(异或门)

    • 规则:当两个输入不相同时,输出恰好为 1。
    • 直觉理解:你可以把它理解为一个“侦测差异”的精密机器。这是我们在电路中执行二进制加法的杀手锏。

2.3 用逻辑门实现加法

如果刚才介绍的逻辑门只能做简单的条件判断,那计算机到底是如何做数学运算的呢?

从手算加法到逻辑门计算机如何只用 0 和 1 做数学题?看看这个规律
第一步:回顾十进制的"进位"
1
7
+5
12

因为 7 + 5 = 12,这个结果超出了个位能装下的最大数字 (9)。 我们把 12 拆成"一个完整的 10"和"剩下的 2":

  • 留在当前位置的那个 2写在个位上,这叫 本位 (Sum)
  • "完整的 10"向十位进了一个 1,叫 进位 (Carry)
第二步:二进制加法的 4 种情况(点点看)
+=00

0 + 0 = 0。
本位写 0,不进位。

第三步:给规律起个名字(电路化)
AB进位本位
0000
0101
1001
1110
本位 规律:
只有当输入是 (0,1) 或 (1,0) 时,本位才是 1。
总结:只有两个输入不同时才为 1。
这个规律在电路中叫 XOR (异或门)
进位 规律:
只有当输入是 (1,1) 时,进位才是 1。
总结:只有两个输入都是 1 时才为 1。
这个规律在电路中叫 AND (与门)

因此,只要把一个 XOR 门(负责算本位)和一个 AND 门(负责算进位)组合起来,我们就得到了能计算一位数加法的电路,这也是最基础的半加器(Half Adder)

半加器 (Half Adder) — 交互演示点击输入 A / B,看看这一位加法的结果
+=00
▲ 进位:向左边那列借一个 1▲ 本位:这一列写下的数字
0 + 0 = 0。这一列写下 0,不需要进位。
所有可能的情况
AB写下(本位)进位
0000
0110
1010
1101

仔细看这张表,你会发现两个规律:

  • 「写下」列:只有 A 和 B 不一样时才是 1 → 这个规律叫 XOR(异或)
  • 「进位」列:只有 A 和 B 都是 1 时才是 1 → 这个规律叫 AND(与)
电路是这样连的:
A = 0
B = 0
XOR 异或门
不同 → 1
输出: 0
AND 与门
全1 → 1
输出: 0
本位 (Sum)
0
进位 (Carry)
0

但半加器有个致命缺陷:它在物理结构上只有两个输入端口(A 和 B)

想象我们在做十进制竖式加法(比如 19 + 22):

  • 算个位9 + 2 = 11。只需两个数相加,写 11。这刚好是两个输入,半加器能完美胜任。
  • 算十位:不仅要算 1 + 2,还要加上刚才个位传过来的“进位 1”(即 1 + 2 + 1 = 4)。这意味着在多位加法中,除了最低位,其他位实际上是在做三个数字的相加!

因为半加器没有接纳“低位传来的进位(Carry-in)”的第三个输入口,所以除了最右边的那一位,它在别的位全都没法用。为了解决这个问题,我们需要能接收三个信号的全加器(Full Adder)

全加器 (Full Adder) — 交互演示比半加器多一个输入:来自低位的进位 (Cin)。点击三个输入试试
++=01
AB低位进位进位本位
1 + 0 + 0 = 1。本位写 1,不进位。
和半加器相比:全加器多了第三个输入「低位进位 (Cin)」。在多位加法中,每一列不仅要加 A 和 B,还要加上右边那一列传来的进位。
所有 8 种情况(3个输入 → 2³ = 8)
ABCin本位进位
00000
00110
01010
01101
10010
10101
11001
11111
全加器的内部 = 两个半加器串联
第一步:半加器 ①
先算 A + B
A = 1B = 0
中间和: 1进位①: 0
第二步:半加器 ②
把中间和 + 低位进位
中间和 = 1Cin = 0
本位: 1进位②: 0
第三步:合并进位
两路进位只要有一个是 1,就向高位进 1
进位① = 0进位② = 0
最终进位: 0

把多个全加器级联起来,就能完成多位数的加法:

行波进位加法器 (Ripple Carry Adder)多个全加器级联,实现多位二进制加法
级联低位 Cout 连接高位 Cin
行波进位像波浪一样逐位传递
溢出最高位产生进位,结果超出范围
位数:
+=13
A0111(7)
B0110(6)
=1101(13)
加法器级联悬停查看每位计算详情
第0位半加器
A1B0
Sum1Cout0
第1位全加器
A1B1Cin0
Sum0Cout1
第2位全加器
A1B1Cin1
Sum1Cout1
第3位全加器
A0B0Cin1
Sum1Cout0
整体计算过程
输入:A = 7 (0111),B = 6 (0110)
过程:从第 0 位开始,逐位计算本位和进位,进位向高位传递
结果:1101 = 13
核心思想: 进位像波浪一样从最低位逐级传递到最高位,所以叫"行波进位"。位数越多,延迟越大,但电路简单。

核心解析:分解加法器

为了处理真实世界中更复杂的数字,加法器需要像搭积木一样拼装:

  1. 半加器(Half Adder):它可以处理两个一位数相加(即上述 XOR 和 AND 门的组合)。它计算了本位和进位,但没法接收来自更低位的进位。
  2. 全加器(Full Adder):在多位计算中,中间位数除了要把 A 和 B 加起来,还要处理来自低位的进位(Carry In)。把低位进位也加入逻辑后,就是全加器。
  3. 行波进位加法器(Ripple Carry Adder):要想处理 32 位或 64 位的数字,只需要把几十个全加器串联起来。进位信号便像波浪一样从低位一层层涌向高位,从而完成任意大小的加法。

想要一次性看懂从逻辑门到多位加法的完整过程?试试这个综合演示:

完整加法器演示从逻辑门到多位加法 ── 层层抽象,逐级封装
第一层:逻辑门
最基础的运算单元,每个门执行一种布尔运算
AND (与门)全 1 为 1
OR (或门)有 1 为 1
XOR (异或门)不同为 1
&
AND (与门)A AND B
0001
≥1
OR (或门)A OR B
0111
=1
XOR (异或门)A XOR B
0110
1
NOT (非门)¬A
10
核心思想: 逻辑门把电压高低(0/1)变成布尔运算(真/假),是硬件实现数学的起点。
抽象层级总结
逻辑门
半加器
⊞⊞全加器
🔲多位加法器
🧠ALU/CPU

3. 功能单元:逻辑门的组合

现在,手里握着逻辑门构成的积木,我们可以向更高的抽象层跃进了。单单计算加法是不够的,我们将成组的逻辑门打包,组装成具有特定功能的模块。这些模块我们统称为功能单元(Functional Units)

3.1 常见功能模块分类

在设计 CPU 时,有一些经过时间考验的经典预制模块:

模块名称承担的核心使命内部的逻辑构造本质现实生活中的绝佳隐喻
加法器(Adder)处理各种类型的算术运算引擎海量全加器的高级按位级联不知疲倦的算盘
多路选择器(MUX)控制数据的流向途径,实现多选一通道巧妙融合 AND 门作为开关、OR 门进行汇总铁路线上的精密道岔
译码器(Decoder)破解并翻译外部传入的二进制死指令基于输入状态精确点亮特定输出的门阵列破获密电的翻译员
触发器(Flip-Flop)突破电信号转瞬即逝的限制,记录历史极其微妙的交叉反馈环路构成双稳态模式会保持状态的跷跷板

为了直观地感受这些功能单元是如何工作的,你可以操作下面的组件,分别查看多路选择器译码器的内部逻辑:

常见功能单元 ── 切换不同模块,查看其实际工作原理
多路选择器 (MUX):像铁路道岔一样,根据"选择信号"决定让哪一路数据通过。
数据 0 (D0)
数据 1 (D1)
MUX
选择 (Sel)
输出 (Out)0

当前选择信号为 0,因此输出等于 数据 0 (D0) 的值:0

请通过下面这款组件实验,亲自窥探其中最令人着迷的部分——记忆是如何凭空产生的

CPU 寄存器组CPU 内部的高速存储单元
专用寄存器 (Special Registers)
PC
0x00401000
程序计数器
IR
0x8B450008
指令寄存器
MAR
0x00401000
内存地址寄存器
MDR
0x00000000
内存数据寄存器
ACC
0x0000001A
累加器
通用寄存器 (General Purpose Registers)
RAX
0x00000000
返回值
RBX
0x00000000
基址寄存器
RCX
0x00000000
计数寄存器
RDX
0x00000000
数据寄存器
RSI
0x00000000
源索引
RDI
0x00000000
目标索引
RBP
0x00000000
栈帧指针
RSP
0x7FFDE000
栈指针
程序状态字 (PSW / FLAGS)
CF0进位标志
PF0奇偶标志
AF0辅助进位
ZF0零标志
SF0符号标志
OF0溢出标志
寄存器 vs 内存
特性寄存器内存 (RAM)
位置CPU 内部CPU 外部
访问速度最快 (< 1ns)较慢 (50-100ns)
容量极小 (Bytes)大 (GB)
作用暂存指令/操作数/结果存储程序和数据

3.2 寄存器:数据的存储单元

除了计算,计算机还需要能够长期或临时地记住数据。如果在运算过程中丧失了对前一秒的记忆,那任何复杂的计算都无法进行。计算机必须拥有某种手段保留过去的状态,这种能力主要仰仗于一种名为触发器(Flip-Flop)的电路结构。

深入理解:记忆本质上是一种循环

大多数逻辑电路的信号流向都是向前的(前馈回路)。而要产生持续的“记忆”,早期的先驱们想到了一个绝妙的设计:将输出的电波重新反馈回输入端。

如同一个有着两个稳定静止点的精巧跷跷板结构。只要不受外界扰动,它凭借其闭环的设计,会永久性稳固在“左高右低(例如这就是记住了 0)”抑或是相反状态(记住了 1)。即便是转瞬即逝的状态改变,也能因闭环相互锁定而被长久“深锁”。

当我们将 32 个抑或 64 个这种触发器整齐地编排成一列,施加同一种强劲的时钟频率信号(Clock)来号令它们统一行动时,寄存器(Register)便应运而生了。它身居 CPU 系统的心脏位置,被当做极速的“工作草稿纸”,默默捍卫着你每一个即时的关键变量。

请通过下面的互动演示,亲自体验这个打破和恢复闭环的过程:

从触发器到寄存器:记忆的闭环机制
试着改变数据并观察,没有时钟信号的允许,输出重新反馈回输入端的"闭环"长久保护了记忆。
数据总线 (Data Input)
1
0
1
0
大门
🔒
4位寄存器 (存储状态)
0
0
0
0
控制中心
尝试改变左侧输入,闭环保护期间寄存器值无法更改。

4. CPU 架构:从功能单元到处理器

随着各种运算模块和记忆组件设计完毕,现在到了核心的综合阶段。如何将这些模块组合起来,让它们变成能自动执行指令的中央处理器(CPU)?

4.1 CPU 的核心组件

如果把 CPU 看作一个分工明确的机器,那么每个单元都有自己不可替代的位置:

  • 算术逻辑单元 (ALU):负责“干活”的运算单元,专门执行加减乘除和各种逻辑运算。
  • 寄存器组 (Register File):工作台上的临时抽屉,容量很小但速度极快,用于暂存当前正在计算的紧迫参数。
  • 内部总线 (Internal Bus):系统里的传送带,负责在各个模块之间搬运数据和信号。
  • 控制单元 (Control Unit):总指挥。它的使命就是从内存中读取用 0 和 1 组成的指令,解析出应该做什么,并向其他模块传达具体的控制信号,调度它们各司其职。
CPU 内部微架构剖析
点击下方各个模块,查看其内部由哪些子电路构成以及工作原理
CPU 核心 (Central Processing Unit)
地址总线 (Address Bus)
数据总线 (Data Bus)

控制单元 (Control Unit)

程序计数器 (PC)
指令寄存器 (IR)
指令译码器
时钟发生器
控制信号线 ↓

寄存器组 (Register File)

通用寄存器 R0-R3
累加器 (ACC)

算术逻辑单元 (ALU)

加法器电路
状态标志 (Flags)
控制总线 (Control Bus)
🖱️

点击左侧 CPU 内部结构图的各个模块,
深入探索其微观电路实现。

4.2 CPU 是如何执行指令的?

不管写下的高级编程语言有多么复杂,最终都会变成内存中的一条条底层指令。CPU 执行任何指令的过程,本质上都在重复以下典型的四个步骤:

  1. 取指 (Fetch):循着当前程序执行的光标地址,探入相对漫长迟缓的缓存之中,把下一套二进制“指令”硬生生抓进核心。
  2. 译码 (Decode):指挥大脑马上分析:这道命令具体是要我移动内存,还是呼叫加法器拼凑运算?立刻将所需电路彻底连通唤醒。
  3. 执行 (Execute):指令派单到达诸如 ALU 等业务工厂车间,机器轰鸣,全力以赴进行硬核逻辑翻转。
  4. 写回 (Write Back):成果凝结时刻,将刚刚得手的答案慎重写至特定的寄存器或反馈回宽阔的内存。

点击下方的“时钟脉冲”,观察在这个死循环中,指令是如何一步步被拆解、执行,并涉及哪些硬件模块的:

CPU 指令执行周期详细演示
CPU
控制单元 CU
PC256程序计数器
IR指令寄存器
MAR内存地址寄存器
MDR内存数据寄存器
算术逻辑单元 ALU
ACC0累加器
通用寄存器组
R00
R10
R20
R30
地址总线
数据总线
控制总线
主存 Memory
0x100LOAD R0, [0x200]
 0x101LOAD R1, #7
 0x102ADD R0, R1
 0x103STORE [0x201], R0
数据区
 0x51242
 0x5130
Fetch取指
Decode译码
Execute执行
Write Back写回
步骤 0 / 32
点击"时钟脉冲"开始逐步执行,或点击"自动运行"连续播放。

追求效率的极致:流水线(Pipeline)

如果必须等上一条指令经历了这四个步骤后才开始下一条指令,效率显然太低。

就像工厂的流水线一样,芯片工程师引入了指令流水线技术。这意味着当第一部分电路在对指令 A 进行“执行”时,之前的电路并没有闲着,而是去对指令 B 进行“解码”,甚至是把指令 C 提前“取指”拿了出来。通过这种并行的重叠方式,CPU 的执行效率得到了极大的提升。


5. 总结:跨越抽象层级

回顾这一路,我们经历了计算机体系结构中最核心的层层抽象。这是将底层物理材料变为通用计算平台的完整路径:

  1. 宏观物理:沙子(二氧化硅晶体)接受人类冶炼、切片、剧毒气体蚀刻等种种苛刻雕琢后
  2. 微观物理:海量的晶体管开关 (以微电控微电) → 经过工程大牛不眠不休的密集拉线,实现了惊人的数字抽象约束
  3. 数字代数:AND / OR / NOT 逻辑门体系无情抹杀误差,以完美真值表衍生出基础行为
  4. 微架构模块:功能单元积木集(加法器等组件)加入了系统生命节拍与记忆特性,进化为完整功能体
  5. 复杂体系结构:庞大而精妙的 CPU 联合阵列面向全世界开发极客,彻底敞开了通往虚拟应用世界的大门
  6. 万千应用王国:算法、系统级软件以及繁花似锦的互联网宇宙

计算机科学中最令人着迷的部分在于,每一层封装都完美地隐藏了下一层的复杂细节。作为一个软件开发者,当你写下 salary = base + bonus 时,完全不需要考虑底层电子的漂移以及半加器内电流的走向;同样,芯片硬件设计师也不需要操心这块芯片未来将运行什么软件。

正是极端的层级解耦以及高度互不干扰的黑盒封装,合力孕育、铺就了现代科技的狂欢盛世。

终极思考

归根究底,所谓的算力,不过是有限的密闭空间内海量开关重组的变幻;伴随着时钟的节拍,在这片小小的硅片上完成了复杂的运算。

“量变最终引发质的飞跃”,这句话在计算机体系结构中被不断验证。当我们敲下键盘,注视着屏幕时,可以试着想象:在极其微小的硅基深处,此刻正有百亿级极小的晶体管,在电光火石之间拼尽全力进行着精密的协同。这或许就是最独特的计算机科学之美。


延伸阅读

如果你对底层技术充满好奇,可以尝试在以下几个方向继续探索:

  • 经典教材:《计算机组成与设计(软硬件接口)》是深入学习体系结构的一本很好的参考书。
  • 数字逻辑仿真:尝试使用逻辑仿真软件或基础元器件,动手搭建一个简单的 8 位加法器或模拟器。
  • 体系结构前沿:了解多级缓存如何缓解“内存墙”问题、指令乱序执行的原理,以及 GPU 的特殊运算机制等。
  • 底层与汇编语言:尝试学习一些基础汇编语言,理解高级语言最终是如何被转化为机器可以执行的十六进制指令的。