10-从零搭建计算机(上)-组成与算力.md 8.6 KB


tags: [数电] type: note source_type: reconstructed created: 2026-08-18 updated: 2026-08-18

aliases: [冯诺依曼, 计算机组成, CPU, ALU, 算术逻辑单元, 计算单元]

从零搭建计算机(上):组成与算力

[!note] 对象层 学完这篇,你能判断

  1. 冯诺依曼模型的四个子系统和"存储程序"概念;
  2. 为什么程序和数据在内存中都是 0/1 位模式;
  3. 16 位 ALU 如何用一个 sel 信号完成加/减/与/或四种运算;
  4. 计算单元(ALU+寄存器+时钟)如何一步步累加出一个算式。

学完后配合 [[11-从零搭建计算机(下)-控制与指令|数电 11(下)]],就能看懂一台"从零搭建"的计算机全貌。

用生活理解:冯诺依曼模型的计算机像"一个会记流水账的柜台"——差旅费、机票单(程序和数据的本质都是"纸")全摆在同一张桌子上(同一块内存),由"掌柜"(控制单元)按一张"步骤卡"(指令)逐条处理。ALU 是"算盘的珠子"(加法/减法/与/或),寄存器是"柜台的临时小筐",时钟就是"敲一下干一步"的节拍器。


一、一句话本质

基于冯诺依曼模型的计算机 = 存储器 + ALU(算力)+ 控制单元(指挥)+ I/O(进出),程序和数据都以位模式存放在同一块内存里、按指令顺序执行;ALU 用"选择器"把加/减/与/或做成一组通用运算单元。


二、速查表(公式与结论)

2.1 冯诺依曼模型四个子系统

子系统 职责
存储器 存储数据和程序(都存同一块内存)
算术逻辑单元 ALU 做算术/逻辑/位运算
控制单元 控制存储器、ALU、I/O 等所有子系统
输入/输出单元 从外部接收输入、把结果输出到外部

2.2 存储程序三大要点

  1. 程序也存内存:程序和数据逻辑相同,格式相同 → 都是位模式(0/1)
  2. 指令顺序执行:取指令 → 译码 → 执行,一条接一条;
  3. 流水线:把取指/译码/执行重叠并行 → 提升吞吐量。

2.3 ALU 运算选择(sel 映射,背下来)

sel 结果
0b00 A + B
0b01 A − B
0b10 A & B
0b11 A | B

配套信号:Cin/Cout = 进位输入/输出;ZF = A 与 B 是否相等的标志(比较器给出)。把 A、B、加法器、减法器、与门、或门、比较器全部设成 16bit → 就是 16 位 ALU。

2.4 指令周期(无流水线)

取指令 → 译码 → 执行 →(下一条)取指令 → 译码 → 执行 → …

三、判别规则

  1. 判断"是不是冯诺依曼":看是否"程序和数据同存一块内存、按地址取指、顺序执行"。
  2. ALU 选运算:sel 是几条控制线的二进制组合,一组 sel 就是一个"指令"(这是 [[11-从零搭建计算机(下)-控制与指令|数电 11]] 指令集的源头)。
  3. 存储程序 vs 直接电路:有"内存+取指"就能改程序不用改线路;纯固定电路 = 非通用计算机。
  4. 时钟频率的代价:频率 ↑ → 单位时间开关更多次 → 电流大 → 发热大(现实中限制 CPU 提频的物理因素)。

四、易混对比

易混点 A 易混点 B 关键区别
CISC RISC CISC 指令复杂多变、控制器电路复杂(x86);RISC 指令精简统一、电路简单(ARM/RISC-V)
冯诺依曼结构 哈佛结构 冯诺依曼单内存、指令数据同存(本课);哈佛指令/数据内存分离(单片机常用)
无流水线 流水线 一条指令完整跑完再取下条 vs 三条指令的取指/译码/执行重叠进行
数据 RAM 指令 RAM 数据 RAM 存要算的数;指令 RAM 存控制信号(ALU sel 序列)——都是RAM,用途不同(见数电 11)

五、典型例题(先想再翻)

  1. ALU 运算:16 位 ALU,A=13,B=45,sel=0b00,S 是多少? > 答:0b00=加 → S=58;Cin/Cout 处理进位,ZF=0(不等)。
  2. 累加:计算单元中依次输入 B=13、45、27、6 并各拍一次按钮,最终寄存器输出? > 答:13 → 58 → 85 → 91。按钮模拟时钟,每次上升沿把 ALU 结果存入寄存器。
  3. 陷阱题:同学说"冯诺依曼模型把程序放 CPU 里执行,数据放内存里"。 > 答:错。冯诺依曼的核心恰恰是程序和数据同存一块内存(都是位模式),控制器从内存取指令再执行。

六、完整知识点

6.1 为什么"程序能存内存"

冯诺依曼基于通用图灵机:数据和程序在逻辑上相同,都可用 0/1 位模式编码 → 同一块存储器可以既放数据又放程序。这是"软件能用刷固件/改文件的方式更换"的根本原因。

6.2 取指-译码-执行(指令顺序执行)

  • 取指令:控制单元命令系统把下一条指令复制到指令寄存器,PC 地址存到程序计数器,取完 PC 自动 +1;
  • 译码:控制单元把指令翻译成一系列可执行的二进制控制信号;
  • 执行:各部件按控制信号动作;
  • 三个步骤串行为一个周期(现代靠流水线重叠加速,见下)。

6.3 流水线

串行时一条指令三个阶段都空闲等待;流水线把三条指令的取指/译码/执行在时间上重叠 → 单位时间完成的指令数(吞吐量)大幅提升。代价是电路更复杂(冲突、冒险处理)。

6.4 简单计算机 = CPU + 存储器 + I/O

 CPU                               内存
 ┌────────────┐           地址总线           地址
 │ ALU        │        ┌───────────────┐    内容(16bit) 地址(8bit)
 │ 寄存器     │──数据──→│  数据/程序    │
 │ 控制单元   │──地址──→│    (同一块) │
 └────────────┘ 控制总线 └───────────────┘
        │
 键盘/显示器/打印机/鼠标 ── 各自的控制器 ── 总线

一台"非真实但完整"的简单计算机:CPU 负责计算与指挥,内存统一存代码和数据,I/O 控制器挂到总线上。

6.5 选择器(多路复用器)——ALU 的开关

  • 二选一 MUX:sel 选 A 还是 B 输出;
  • 四选一 MUX:两个二选一叠加 → 用 2 位 sel 选 4 路之一。
  • ALU 正是用 4 选 1 MUX 从"加法器/减法器/与门/或门"四个结果中挑一个输出。

6.6 16 位 ALU 实现

电路里放:加法器、减法器、与门、或门、比较器四个"候选运算器",它们的输出全部进 4 选 1 选择器,由 sel(2bit)挑一个作为 S 输出;Cin/Cout 管进位,比较器给出 ZF(两数相等标志)。把所有元件位宽设成 16 → 16 位 ALU。

6.7 简单计算单元(ALU + 寄存器 + 按钮)

  • 结构:16 位寄存器 + 刚实现的 ALU + 按钮 + 3 个常量(sel 常量恒为 0b00 → 只算加法);
  • 13+45+27+6:依次把 B 输入 13/45/27/6,每输入一个拍一次按钮 → 寄存器累加 13→58→85→91;
  • 按钮 = 时钟信号:时钟是计算机电路的"节拍器",由晶振统一产生;CPU 以时钟为单位计算,频率越高越快,但也越热(电流随频率增大)。

七、与 PCB 画图的关联

  • 晶振 + 时钟树:MCU 原理图的 OSC 引脚与外部晶振/负载电容 = "节拍器"硬件化(对应 [[06-时序逻辑电路与状态机|数电 06]] 分频概念)。
  • MCU 内部的 ALU/寄存器组:读 STM32 手册的 CPU 章节就是本课的"成品版"。
  • 理解"时钟频率→发热"才能看懂 散热器/电源去耦 在原理图与 PCB 上的必要性。
  • 总线三线(地址/数据/控制)是原理图大量走线的抽象——详见 [[11-从零搭建计算机(下)-控制与指令|数电 11]] 总线章节。

来源:尚硅谷《从零搭建计算机》第 2 章(计算机组成原理)+ 第 3.1~3.2 节(ALU 与计算单元);关联 [[冯诺依曼体系结构]] 维基页