--- 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 实现 ![16 位 ALU(加/减/与/或 + Cin/Cout/ZF)](assets/alu_16bit.png) 电路里放:加法器、减法器、与门、或门、比较器四个"候选运算器",它们的输出全部进 4 选 1 选择器,由 sel(2bit)挑一个作为 S 输出;Cin/Cout 管进位,比较器给出 ZF(两数相等标志)。**把所有元件位宽设成 16 → 16 位 ALU。** ### 6.7 简单计算单元(ALU + 寄存器 + 按钮) ![简单计算单元(ALU + 16 位寄存器 + 按钮 + 常量)](assets/computing_element.png) - 结构: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 与计算单元);关联 [[冯诺依曼体系结构]] 维基页