章节一览

计算机组成原理知识点比较多,所以分多部分复习。本篇是第三部分,复习计算机的指令系统和CPU,重点是MIPS各指令的规则以及CU中与之对应的控制信号的取值。

计算机系统概述

数据的表示和运算

指令系统

中央处理器(重点)

存储的分层体系结构(重点)

互联及输入输出设备


指令系统

指令系统又称为指令集ISA,表示一台计算机所能执行的全部机器指令的集合,由该计算机的CPU决定。ISA是硬件设计的依据,因此指令系统的设计至关重要。

指令格式的设计与原则?

冯诺依曼结构的计算机采用存储程序的思想,给出一个程序(n多指令),计算机能够自动执行这些指令。为了自动执行,一条指令必须明确或隐含包含的信息有:操作码、源操作数的值或地址、结果的地址、下一条指令的地址

image-20220614110939084

所以可以据此给指令分类:(假设操作数都有两个

  1. 四地址指令

    image-20220614111235173

    这是最显然的形式,包含的地址有:两个源操作数的地址、一个结果的地址、下一条指令的地址。分析访问内存的次数:取指令1次+取两个操作数2次+存放结果1次,总共访问四次

  2. 三地址指令

    image-20220614111619187

    将下一条指令的地址隐含在程序计数器中,现在指令中包含的地址有:两个操作数的地址、结果的地址。分析访问内存的次数:根据PC的内容取指令1次+取两个操作数2次+存放结果1次,依然要访问四次

  3. 二地址指令

    二地址是最常见的指令:

    image-20220614111854170

    A1作为源操作数地址的同时,也作为结果的地址。分析访问内存的次数:分析访问内存的次数:根据PC的内容取指令1次+取两个操作数2次+存放结果1次,还是要访问四次

  4. 一地址指令

    image-20220614112101203

    一地址指令用到了另一个寄存器:累加寄存器(ACC)。ACC既提供一个源操作数(注意是值不是地址),又存放运算结果。所以访问内存的次数只需要两次(取值+取1个操作数)

减少指令中地址个数的目的是增加寻址范围。假设指令共32位:

  • 四地址指令OP占8位,地址各6位,寻址范围为$2^{6}=64$
  • 三地址指令OP占8位,地址各8位,寻址范围为$2^{8}=256$
  • 二地址指令OP占8位,地址各12位,寻址范围为$2^{12}=4K$
  • 一地址指令OP占8位,地址24位,寻址范围为$2^{24}=16M$

所以,指令系统设计的原则为:

  1. 指令要尽可能短,减少程序占用空间。
  2. 操作码必须唯一,且要在指令中留足够的操作码位数,便于指令的扩充。
  3. 指令长度应该是字节的整数倍,因为字节是内存的最小编址单位。
  4. 地址字段的个数应该要合理选择。

指令中常用的数据寻址的方式?

  1. 立即寻址:直接在字段中给出操作时的值,这样就不用访问内存了。

  2. 直接寻址:给出操作数在内存中的地址,直接到内存寻址即可。(可能在Cache就命中)

  3. 间接寻址:给出存放所需操作数地址的地址,相当于指针

    image-20220614113711952

  4. 寄存器间接寻址:用于间接寻址访问两次内存太慢,所以使用寄存器避免多次访问内存

    image-20220614113802066

  5. 基址寻址:基址寄存器中存储的地址称为基址,同时在指令中给出一个偏移地址,以基址加上偏移地址作为有效地址从内存中取操作数。

    image-20220614114110337

    默认的基址寄存器位BR,如果给出了其他寄存器就使用给出的。

定长操作码编码与扩展操作码编码?

  • 定长操作码编码:指令中操作码的长度是固定,固定一段作为操作码。
  • 扩展操作码编码:指令中操作码长度是可变的。

扩展操作码存在一个问题:因为一条指令都是一串二进制数,既然操作码长度是可变的,那么机器如何区分操作码和操作数呢?

扩展操作码采用的策略是使用前缀码:不允许短码是长码的前缀。一个扩展操作码的例子如下:

4位操作码留下1111作为长码的开始,8位操作码留下11111111作为长码的开始,12位操作码留下111111111111作为16位操作码的开始。一般地,短码可以留多位作为长码的开始

image-20220614115840897

CISC和RISC?

CISC即复杂指令系统计算机,它通过不断向指令系统中增加更多更复杂的指令,以适应不同应用领域的需求。其特点如下:

  1. 指令系统复杂庞大,指令数目一般200+
  2. 指令的长度不固定,指令格式多,寻址方式多
  3. 各指令的使用频度、执行时间都相差很大
  4. 由于有的指令比较复杂,无法采用硬布线的方式,所以大多采用微程序的方式来控制
  5. 难以优化编译以生成高效的目标程序

RISC即精简指令系统计算机,它的中心思想是要求指令系统精简化,以提升程序性能。其特点如下:

  1. 只包含使用频率最高的一些简单指令,复杂指令的功能由简单指令的组和来实现
  2. 指令长度固定,指令格式种类少,寻址方式种类少
  3. 访问内存的只有Load/Store(取数/存数)指令,其余指令都是在寄存器之间进行,所以很高效
  4. 硬布线控制为主,少用微程序控制
  5. 重视编译优化工作,减少程序执行时间

MIPS汇编的指令分类?

MIPS的指令按照操作类型可以分为三种:R型、I型、J型

  1. R型指令的格式如下:

    image-20220614173051026

    各字段的含义:

    • R型指令OP字段都为000000,不同指令的功能由func确定
    • rsrt为两个源操作数所在的寄存器号
    • rd为目的操作数的寄存器号
    • shamt是位移量,当执行移位操作时指明要移动的位数

    不需要记func字段,但需要知道指令的功能:

    image-20220614173513148

    其中寄存器跳转就是将rs的寄存器号赋值给PC。

  2. I型指令的格式如下:

    image-20220614173936087

    I型指令的一个源操作数来自于rs寄存器,另一个源操作数是立即数:

    $rt\leftarrow rs\ \ OP \ \ immediate$。 指令如下:

    image-20220614174250930

    运算时16位的立即数都要进行符号扩展或零扩展,表示为:$SignExt(imm)$和$ZeroExt(imm)$(算数运算符号扩展,逻辑运算零扩展)。要需要掌握这里比较常用的指令:lw、sw、beq和bne。

    • 取数指令$lw\ \ rt,(offset)rs$的功能是$rt\leftarrow mem[rs+SignExt(offset)]$

      image-20220614175304162

    • 存数指令$sw\ \ rt,(offset)rs$的功能是$mem[rs+SignExt(offset)]\leftarrow rt$

    • 相等转移指令$beq\ \ rs,rt,imm$的功能是如果rs的内容等于rt的内容,那么PC转移到$𝑃𝐶 + 4 + 𝑆𝑖𝑔𝑛𝐸𝑥𝑡(𝑖𝑚𝑚)≪ 2$:

      image-20220614180233988

      符号扩展和最高位保持一致就行了。

    • 不相等转移指令$bne\ \ rs,rt,imm$和beq方法差不多:

      image-20220614180521207

  3. J型指令的格式如下:

    image-20220614181147935

    image-20220614181313029

    • $j\ \ address$的功能是$𝑃𝐶 ← {𝑃𝐶 + 4 31: 28 , 𝑆𝑖𝑔𝑛𝐸𝑥𝑡 𝑎𝑑𝑑𝑟𝑒𝑠𝑠 ≪ 2}$,{}代表合并二进制位,图示为:

      image-20220614181545450

    • $jal\ \ address$的功能是先存储当前指令的下一条指令的地址,跳转执行后返回存储的地址,就是函数调用:

      image-20220614181919994

MIPS的寻址方式?

之前学习了指令的寻址方式,这里再以MIPS为例来强化指令寻址。

由于寻址就是访问内存,MIPS只有lw和sw两条指令能控制访问内存。

  1. 立即数寻址

    image-20220614182335667

    操作数就是给出的立即数。

  2. 寄存器寻址

    image-20220614182501411

    操作数是存放在寄存器中的数。

  3. 基址寻址

    image-20220614182628514

    指令括号中的l2就是给出的立即数。

  4. PC相对寻址

    image-20220614182813525

中央处理器

CPU各部分的功能?需要的元件?

CPU由运算器、控制器和寄存器组成。运算器进行算数和逻辑运算,控制器进行取指令、分析指令和执行指令。

image-20220614184831164

需要用到的组合逻辑元件有:

需要用到的时序逻辑元件有:

需要知道暂存器和通用寄存器组的端口信息:

  1. 暂存器:WE即写使能信号,WE=1时时钟下降沿向暂存器写入数据。
  2. 通用寄存器组:有两个读口busA和busB,分别由输入端口Ra和Rb给出寄存器编号。这是读操作,不需要时钟控制。𝑅𝑒𝑔𝑊𝑟为写使能信号,当𝑅𝑒𝑔𝑊𝑟 = 1时,在时钟上升沿将Data写入Rw给出的寄存器。这是写操作,需要时钟控制。

CPU的时序系统?

早期计算机采用三级时序系统

image-20220615111226741

一条指令包括一个或多个机器周期,而一个机器周期需要执行多个微操作,一个微操作的需要一个节拍(时钟周期)的时间,即时钟周期(节拍)是操作执行的最小时间单位。节拍可以由脉冲组合得到。

现代计算机没有机器周期的概念了,一个定时信号就是一个时钟,了解即可。

CPU数据通路的分类?

  1. 单总线数据通路

    image-20220615112015708

    执行$add\ R3,R1,R2$这样的算数运算指令,由于单总线只能同时传输一个数据,所以需要分两次获取操作数,把先获取到的操作数放在暂存器Y中;结果也要先存放在暂存器Z中,再送入目标寄存器。所以需要执行3个微操作,即3个时钟周期

  2. 三总线数据通路

    image-20220615112408787

    两个操作数、1个结果分别用一条总线传输,这样$add\ R3,R1,R2$一个时钟周期内即可完成。

取指电路的设计?

设计分析:

  1. 什么时候取指令?时钟周期的开始处(上升沿)。
  2. 在哪里取?去存储器里取,地址由PC给出
  3. 取回来后存储在哪里?无需存储,直接从指令存储器输出端读取即可。
  4. PC的值如何修改?𝑃𝐶 ← 𝑃𝐶 + 4(当程序顺序执行时)

PC的工作原理:

image-20220615112931367

时钟上升沿,如果Reset=1,PC=PC+4;如果Reset=0,PC=0。

取指电路的功能分析:

  1. 程序顺序执行:𝑃𝐶 ← 𝑃𝐶 + 4
  2. 分支跳转:𝑃𝐶 ← 𝑃𝐶 + 4 + 𝐵𝑟𝑎𝑛𝑐ℎ𝐴𝑑𝑑𝑟 || beq、bne
  3. 寄存器跳转:𝑃𝐶 ← 𝑅[𝑟𝑠] || jr
  4. 跳转:𝑃𝐶 ←(𝑃𝐶 + 4)[31:28] || 𝐽𝑢𝑚𝑝𝐴𝑑𝑑𝑟,𝑗、𝑗𝑎𝑙

取指电路的设计:

image-20220615113436116

数据通路的设计?

  1. R型指令数据通路:𝑹[𝒓𝒅] ← 𝑹[𝒓𝒔] + 𝑹[𝒓𝒕]

    image-20220615113546565

  2. I型指令数据通路:

    1. 立即数算数逻辑运算:𝑹[𝒓𝒕]← 𝑹[𝒓𝒔]+𝑺𝒊𝒈𝒏𝑬𝒙𝒕[𝒊𝒎𝒎𝟏𝟔]、𝑹[𝒓𝒕] ← 𝑹[𝒓𝒔] | 𝒁𝒆𝒓𝒐𝑬𝒙𝒕[𝒊𝒎𝒎𝟏𝟔],前者符号扩展,后者符号扩展:

      image-20220615114459371

      extOp表示进行零扩展还是符号扩展。

    2. 取数指令load:包括寄存器读(地址)和寄存器写(数据)以及内存读。立即数进行符号扩展。

      image-20220615114603064

    3. 存数指令store:包括寄存器读和内存写,imm进行符号扩展。

      image-20220615114923677

  1. 相等跳转指令beq:检验ALU的ZF是否为0。

    image-20220615115341196

  1. J型指令的设计:直接跳转就是了。

    image-20220615115711447

  2. 合并后的数据通路:

    image-20220615113825087

    需要明白各控制信号的含义!

ALU的设计?

image-20220615115842927

不同指令的ALUctr如下:

image-20220615124729173

控制器的设计

控制器分析指令,产生控制信号(将取指电路分离出去了)。不同指令控制信号的值如下:

image-20220615125500826

  1. RegDst选择目的寄存器。对于R型指令,由于其目标寄存器是rd,所以RegDst为1。而I型指令设计到写回寄存器的指令都是写入rt,所以为0。而I和J不寄存器的指令则为x。
  2. memtoDst:需要从内存写回寄存器为1,不能写为0。可写可不写为x。
  3. memWr内存写使能信号。只有store才为1。
  4. ALUsrc选择立即数或busB的输出作为ALU的操作数。R型指令都是来自busB,所以为0;I型设计到运算的指令操作数为立即数,所以为1;而beq指令需要将rs和rt的内容进行对比,所以为0。
  5. RegWr寄存器写信号。除了取数、跳转指令不需要写寄存器为0,其他都是1。
  6. expOp符号扩展位。为0表示零扩展,为1表示符号扩展,为x表示无需扩展。

熟悉MIPS常用指令的数据通路!

假设单周期各部件延时如下:

  • 存储读/写:200ps
  • ALU、加法器:100ps
  • 寄存器堆读/写:50ps
  • 控制器 -忽略不计:0ps
  • 选择器-忽略不计:0ps

问:各指令的执行所需的指令周期长度。

  1. R型指令:

    image-20220615131447679

    注意两个源操作数是并行取。

  2. I型指令

    1. lw指令:

      image-20220615131635185

    2. sw指令:

      image-20220615131741282

    3. beq指令:

      image-20220615131830733

  3. J指令

    image-20220615131914541

由于最长的时间为600𝑝𝑠,所以指令周期设置为600𝑝𝑠。