ComputerOrganization

本文最后更新于 2024年9月28日 晚上

计算机组成原理

前言

学科地位:

主讲教师 学分配额 学科类别
闫文珠 3.5 自发课

成绩组成:

作业+实验 期末
50% 50%

教材情况:

课程名称 选用教材 版次 作者 出版社 ISBN 号
计算机组成原理 《计算机组成与系统结构》 3 袁春风 清华大学出版社 978-7-302-59988-3

最基本的知识普及:

主板(Motherboard)

  • 作用:主板是所有硬件的连接平台,它连接并协调 CPU、内存、存储设备、显卡、网络设备和其他外部接口。主板上还包含芯片组,负责管理数据传输和设备间的通信。
  • 与其他部分的关系:主板是各个硬件组件的核心枢纽,确保数据能够在各个组件之间高效传输和通信。

机箱视角中的主板

主板的 6 大区域

输入/输出设备(I/O Devices)

  • 作用:输入设备(如键盘、鼠标、触摸屏)用于用户与计算机的交互。输出设备(如显示器、打印机)用于显示计算机的操作结果。网络设备(如网卡、Wi-Fi 模块)则允许电脑连接到网络。
  • 与其他部分的关系:输入设备通过主板将用户的操作传递给 CPU 进行处理,输出设备则从 CPU 或显卡接收处理后的数据进行展示。

I/O 区域

中央处理器(CPU)

  • 作用:CPU 是电脑的大脑,负责执行计算任务和指令。它从内存中读取指令,进行运算,然后将结果写回内存。现代 CPU 具有多个核心,可以并行处理多项任务,提高计算效率。
  • 与其他部分的关系:CPU 与内存和存储设备密切配合。它从内存中获取数据和指令,然后进行处理,最终将结果写回内存或存储设备。

CPU 区域

内存(RAM)

  • 作用:内存是计算机中的临时存储器,用于存储当前运行的程序和数据。它的访问速度极快,但数据在断电后会丢失。内存用于支持 CPU 的高速操作。
  • 与其他部分的关系:内存是 CPU 执行任务时的工作区域,存储从存储设备(如硬盘)中读取的数据和指令。内存的数据会在需要时被写回到存储设备中。

内存区域

显卡(GPU)

  • 作用:显卡负责处理图形计算任务,特别是在图像和视频渲染、游戏以及某些并行计算任务中(如深度学习)。高性能显卡能够加速这些计算任务。
  • 与其他部分的关系:显卡通过主板与 CPU 和内存通信,从内存中读取图形数据,并进行处理,然后将渲染结果输出到显示器。

存储设备(Storage Devices)

  • 作用:存储设备如机械硬盘 hard disk (HDD)、固态硬盘 solid state disk (SSD),用于长期保存数据和程序,即使在电脑断电后数据也不会丢失。SSD 的速度比传统硬盘更快,因此越来越常用。
  • 与其他部分的关系:存储设备保存操作系统、应用程序和用户数据。程序执行时,数据会从存储设备加载到内存中供 CPU 使用。

网卡(Network Interface Card, NIC)

  • 作用:网卡是计算机与网络之间的桥梁,负责处理计算机与网络间的数据通信。它将计算机的数据转换为网络信号,以太网网卡通过有线或无线方式连接局域网(LAN)或互联网。
  • 与其他部分的关系:网卡通过主板与南桥芯片组或 PCIe 总线连接,接收来自 CPU 的数据,经过处理后通过网络接口发送到外部网络。同时,它也接收来自网络的数据,传递给 CPU 进行处理,确保计算机能够与其他网络设备进行通信。

扩展区域

南桥芯片组(Southbridge)

  • 作用:南桥芯片组是主板上的一个重要芯片,为了避免过多的模块与 CPU 直连导致主板排线困难以及布局问题,产生了南桥芯片组用于负责管理较慢的外围设备的连接和数据传输。包括 USB 接口、SATA 接口、网络接口、音频设备和其他 I/O 设备。南桥还处理 BIOS、系统时钟、硬盘和光驱的控制。
  • 与其他部分的关系:南桥通过主板与 CPU 和北桥芯片组(或直接与 CPU)连接,接收来自 CPU 的指令,并将其转化为外设可以理解的信号。它还通过 I/O 总线连接各种外设,确保数据在外围设备与系统之间顺畅传输。

南桥芯片组区域

BIOS(Basic Input/Output System)

  • 作用:BIOS 是主板的固件程序,它存储在主板的 BIOS 芯片里。负责在计算机启动时进行硬件初始化,指导所有的硬件运行,并启动操作系统。
  • 与其他部分的关系:BIOS 在开机时检查并初始化硬件,然后引导操作系统,从而开始系统的工作。

BIOS 芯片

为什么要学这门课?

上上学期学习了《数字逻辑电路》,云里雾里;上学期学习了《计算机系统基础》,继续云里雾里。本学期开始学习《计算机组成原理》?如果用一句话来概括我对数字逻辑电路的理解,大概可以这样说:原来计算机是一个由“门电路”、“导线”和“时钟脉冲”组成的机器。如果用一句话来概括我对计算机系统基础的理解,大概可以这样说:原来计算机所有的活动都是由翻译过来的 01 序列驱动的。

现在我们让 AI 模仿上面我对课程理解的概括逻辑,用一句话来概括计算机组成原理,ta 是这样回答的:原来计算机的高效运作是通过硬件架构的精妙设计,将复杂的指令和数据流转化为有序的电子信号运动来实现的

会收获什么?

对计算机整体有一个宏观的把握,并且能够知道计算机各个模块之间是如何关联与调度的,以及每一个模块内部的工作原理。

最后能够从逻辑上实现一个单核 CPU。

注:

本书 ISA 采用 MIPS 指令系统。之前学习的 《计算机系统基础》 中 ISA 采用的是 IA-32 指令系统,也就是大名鼎鼎的 x86-64 指令系统的前身。

为了形式化地描述 CPU 的运行逻辑,需要使用寄存器传送级 (register transfer level, 简称 RTL) 语言。本书 RTL 语言有以下规定:R[r] 表示通用寄存器 r 的内容,M[addr] 表示存储单元 addr 的内容;M[R[r]] 表示寄存器 r 的内容所指存储单元的内容;PC 表示 PC 的内容,M[PC] 表示 PC 所指存储单元的内容;SEXT[imm] 表示对 imm 进行符号扩展,ZEXT[imm] 表示对 imm 进行零扩展;传送方向用 \leftarrow 表示,即传送源在右,传送目的在左。

一、计算机系统概述

注:本章与《计算机系统基础》的第 1 章重复,详见 https://blog.dwj601.cn/GPA/4th-term/SysBasic/#第1章-计算机系统概述

主要掌握 冯诺依曼状态机计算机性能度量 两个知识点。

二、数据的机器级表示

注:本章与《计算机系统基础》的第 2 章重复,详见 https://blog.dwj601.cn/GPA/4th-term/SysBasic/#第2章-数据的机器级表示与处理

主要掌握 数值/非数值数据的表示数据宽度存储对齐纠/检错 四个知识点。

数据的纠错/检错见 7.4 节。

三、运算方法和运算部件

本章我们讲讲 CPU 中的 算数逻辑单元(Arithmetic and Logic Unit,简称 ALU)。ALU 在计算机中的地位大致如下图所示:

graph RL
    实现功能
    执行程序
    机器指令
    subgraph ALU
    direction RL
    算数运算逻辑
    subgraph 运算部件
    direction LR
    加法器
    移位器
    end
    end
    
    运算部件 -->|硬件支持| 算数运算逻辑
    ALU --> 机器指令
    机器指令 --> 执行程序
    执行程序 --> 实现功能

也就有了这样的学习路线:涉及运算的机器指令(MIPS 指令系统) \to 运算部件支持(逻辑电路图) \to 算数运算逻辑(算法设计)

3.1 涉及运算的机器指令

都有哪些涉及运算的机器指令?机器指令的种类有很多,我们在计算机系统基础中已经学习到了比如:数据传输指令、控制指令、跳转指令等等。由于本章讲解的是算数运算,因此我们主要学习涉及到运算的机器指令。我们将所有涉及到运算的机器指令抽丝剥茧,凝练出了以下共 11 条指令:

11 条涉及运算指令的 RTL 描述

11 条涉及运算指令的 RTL 描述 - 续

不难发现,上述 11 种除了最后一个跳转指令,其余的 10 条运算指令只有 3 大类:加减法、按位或、小于置 1。

3.2 运算部件支持

有了上述的程序运算需求,如何设计出对应的硬件来支持呢?CPU 中的 ALU 单元就是负责运算的部件。ALU 内部的逻辑结构如下图所示,其输入有两个运算数 A 和 B 以及一个控制输入 ALUctr:

ALU 实现

ALUctr 有 4 个控制信号,下面借书中原文分别解释 4 个控制信号对应的逻辑:

SUBctr 用来控制 ALU 执行加法还是减法运算。当 SUBctr=1 时,做减法;当 SUBctr=0 时,做加法。

OPctr 用来控制选择哪种运算的结果作为 Result 输出。因为所实现的 11 条指令中只可能有加/减、按位或、小于置 1 这 3 大类运算,所以 OPctr 有两位。

OVctr 用来控制是否要进行溢出判断。当 OVctr=1 时,进行溢出判断,此时,若结果发生溢出,则溢出标志 Overflow 为 1,当 OVctr=0 时,无须溢出判断,此时,即使结果发生溢出,溢出标志 Overflow 也不为 1。

SIGctr 信号控制 ALU 是执行「带符号整数比较小于置 1」还是执行「无符号数比较小于置 1」的功能。当 SIGctr=0,执行「无符号数比较小于置 1」的功能;当 SIGctr=1 时,执行「带符号整数比较小于置 1」的功能。

完美实现了所需的 3 大类运算逻辑。

ALU 是如何控制以精准实现上述 11 条指令的?本质上就是通过 ALUctr 来实现运算控制的。除了最后一个跳转,难道 10 个指令就一定需要 log2(10)=4\lceil \log_2(10) \rceil =4 位进行信号选择控制吗?并不是,其中一些虽然功能不同,但是运算逻辑相同:

  • 指令 addiu、lw、sw 和 beq 转移目标地址计算的 ALU 控制信号取值一样,都是进行加法运算并不判溢出,记为 addu 操作.
  • 指令 subu 和 beq 判 0 操作的 ALU 控制信号可看成一样,都做减法运算并不判溢出,记为 subu 操作。

下表详细解释了每一条指令的运算类型与 ALUctr 取值之间的关系:

运算类型与 ALUctr 取值之间的关系

因此,这 11 条指令可以归纳为 7 种操作:addu、add、or、subu、sub、sltu、slt,也就是说 ALUctr 只需要 log2(7)=3\lceil \log_2(7) \rceil =3 个选择控制位!如下表所示,列出了 ALUctr 的选择控制逻辑:

ALUctr 的选择控制逻辑

为什么可以这样控制

加减运算控制(SUBctr):很显然,加法(SUBctr=0),减法(SUBctr=1)。

输出内容控制(OPctr):很显然, 3 大类运算就对应 3 个取值。

溢出判断控制(OVctr):很显然,有符号运算需要溢出判断,其他运算都不需要。

小于置一控制(SIGctr):这个逻辑比较有意思。为什么无符号数比大小时 Less = Carry ^ SUBctr;有符号数比大小时 Less = Sign ^ Overflow 呢?首先我们知道,比大小的本质是使用加法器做减法运算,那么 AB=A+B=A+(B+1)A-B=A+B_{\text{补}}=A+(\sim B +1)

  • 对于无符号数的比大小逻辑。由于是减法,SUBctr 一定是 1,因此此时的输出其实可以进一步归纳为 Less = Carry ^ 1 = !Carry。也就是说我们只需要分析加法运算的进位结果即可,而这就是之前学过的无符号整数加减运算逻辑了。如果 A 严格小于 B,则 B 的补码与 A 相加后不会产生进位,此时 !Carry = !0 = 1 表示 A<BA<B;如果 ABA\ge B,则 B 的补码与 A 相加后就会超过无符号整数表示的范围产生进位,此时 !Carry = !1 = 0 表示 ABA \ge B。很巧妙的逻辑。
  • 对于有符号数的比大小逻辑。
    • 如果运算没有溢出,即 Overflow=0,此时 A 与 B 的正负一定相同。A 与 B 的比大小结果可以直接根据加法器运算结果的符号位来确定。如果运算结果是负的,即 Sign=1,那么显然 A<BA<B;反之如果运算结果是正的,即 Sign=0,那么显然 ABA\ge B
    • 如果运算发生溢出,即 Overflow=1,此时 A 与 B 的正负一定不同。但我们不知道谁正谁负,根据有符号整数加减运算的溢出符号判定逻辑可知:
      • 若 A 为正数 B 为负数。溢出发生时运算结果一定是负数(正溢出),即 Sign=1,此时 Less = Sign ^ OverFlow = 0,即 ABA \ge B
      • 若 A 为负数 B 为正数,溢出发生时运算结果一定是正数(负溢出),即 Sign=0,此时 Less = Sign ^ OverFlow = 1,即 A<BA< B

3.3 算数运算逻辑

程序的运算需求有了(算数运算),能进行基本运算的硬件也设计出来了(ALU)。如何利用已有的运算部件来巧妙地设计算法以高效地实现我们常见的数学运算呢?让我们一探究竟!

整数加减运算

https://blog.dwj601.cn/GPA/4th-term/SysBasic/#2-7-4-整数加减运算

原码乘法运算

怎么算的?按照手算乘法的逻辑进行运算,但是在计算机内部进行实际运算时进行了一定的改进,有三点:

  1. 并不是全部算完每一步的乘法结果后再一次性累加,而是使用一个"局部变量"保存前缀和;
  2. 由于每一位的乘法结果都是在最高位进行的,因此我们不是对当前的运算结果进行左移一位操作,而是对前面计算出的前缀和进行右移一位操作;
  3. 由于运算时只有 0 和 1,当为 0 时显然当前累加的增量为 0,因此当乘法位为 0 时,只需要对前缀和右移一位而不需要执行相加操作。

==TODO==

有哪些应用场景?在浮点数的尾数运算中,需要大量进行原码的乘法运算。

可以优化吗?是可以的。由于是逐位运算,因此我们需要进行 nn 次相乘再相加的操作,时间复杂度为 O(n)O(n)。现有的优化方案就是逐 kk 位运算,那么时间复杂度就可以优化为 O(nk)O(\frac{n}{k})

补码乘法运算

怎么算的?如何在已知 [X][X]_{\text{补}}[Y][Y]_{\text{补}} 的情况下,计算 [X×Y][X\times Y]_{\text{补}}?由于 [X×Y][X]×[Y][X\times Y]_{\text{补}} \ne [X]_{\text{补}} \times [Y]_{\text{补}},因此补码乘法需要我们重新设计运算方法,这里引入 Booth 算法。

==TODO==

有哪些应用场景?由于计算机中的数据都是以补码形式存储,因此补码乘法的使用场景更加广泛。

可以优化吗?同样是可以的。与原码乘法的优化方案类似。

整数除法运算

==TODO==

四、指令系统

五、中央处理器

六、指令流水线

七、存储器层次结构

7.4 存储器的数据校验

数据在信道传送的过程中,可能会因为各种噪声或者硬件原因出现错误,我们有必要进行数据的检错与纠错。本目我们主要介绍「数据检错中的奇偶校验法」策略。其实逻辑很简单,先看数据校验的流程图:

数据校验流程图

如上图所示,校验的根本逻辑就是:比对「信源和信宿数据的二进制码」在某种转换规则下的转换代码。而所谓的奇偶校验就是定义了「某种规则」为「比对数据的二进制码中 1 的个数」。即通过判断校验单元(校验位+原始数据)和传输后数据中 1 的个数的奇偶性是否相同,来判断数据传送是否正确,进而达到检错的功能。有两个问题:

  1. 这合理吗?显然不具备绝对正确性。因为奇偶校验的根本逻辑是比对数据传输前后的 1 的数量的奇偶是否。反例有很多:
    • 首先我们不能保证校验码传输前后是否会发生错误。
    • 其次针对校验逻辑,奇偶校验都不能检测出偶数位数据传输错误,并且,如果校验位前后不同则表明数据传输的过程中一定发生了错误,但是不能知道多少位 (1,3,5,…2n-1) 发生了错误,并且也不知道哪几位发生了错误。
  2. 怎么计算二进制码中 1 的个数的奇偶性?很简单,直接把所有的位异或起来即可。

码距是什么?所谓码距就是两个二进制代码(码字)中不同位的个数。在奇偶校验的码制下,两个合法码字的最小距离显然是 2。

参考:什么是奇偶校验原理?奇校验、偶校验、校验位(单比特奇偶校验、两维奇偶校验(矩阵校验或交叉奇偶校验))

八、系统互连及输入输出组织

九、并行处理系统 *

不做要求,略。


ComputerOrganization
https://blog.dwj601.cn/GPA/5th-term/ComputerOrganization/
作者
Mr_Dwj
发布于
2024年8月27日
更新于
2024年9月28日
许可协议