Chapter 5 Basic Processing Unit
Chapter 5 Basic Processing Unit
中英对照
Chinese | English |
---|---|
5.1 一些基本概念 | 5.1 Some Fundamental Concepts |
5.2 指令执行(5个步骤) | 5.2 Instruction Execution (5 steps) |
5.3 硬件组件(5个阶段) | 5.3 Hardware Components (5 stages) |
5.4 指令获取与执行步骤 | 5.4 Instruction Fetch and Execution Steps |
5.5 控制信号 | 5.5 Control Signals |
5.6 硬件控制 | 5.6 Hardwired Control |
5.7 CISC风格的处理器 | 5.7 CISC Style Processors |
5.1 一些基本概念
- 处理单元 (Processing Unit)
- 指令集处理器或中央处理单元 (Instruction Set Processor or
Central Processing Unit)
- 处理器负责从计算机的内存中读取程序指令并执行它们。
- 它一次获取一条指令。
- 它解码(解释)指令。
- 然后,它执行指令中指定的操作。
指令执行过程
为了执行一条指令,处理器需要完成以下步骤:
从内存中取出由程序计数器(PC)指向的位置的内容。将该位置的内容加载到指令寄存器(IR)中。
IR ← [PC]
这个过程称为取指阶段(Fetch Phase)。
将程序计数器(PC)递增,指向下一条指令。假设内存是按字节寻址的,并且每条指令占4个字节。
PC ← [PC] + 4
这个步骤也属于取指阶段(Fetch Phase)。
执行指令寄存器(IR)中所指定的操作。执行阶段即根据从内存取出的指令执行相应的计算或操作。
这个过程称为执行阶段(Execution Phase)。
注意:
- 如果一条指令占用多个内存单元,则步骤1和2需要重复多次,直到完整地取出整条指令。
总结:
- 取指阶段:步骤1和步骤2
- 执行阶段:步骤3
指令执行的操作
除了少数例外,指令的执行通常通过按照特定顺序执行以下操作之一或多个来完成:
读取给定内存位置的内容并将其加载到处理器寄存器中。
从一个或多个处理器寄存器中读取数据。
执行算术或逻辑运算,并将结果存储到处理器寄存器中。
将处理器寄存器中的数据存储到给定的内存位置。
这些操作是指令执行过程中常见的基本步骤,通过这些操作,处理器能够完成计算、数据传输和存储等任务。
处理器的主要硬件组件
程序计数器(PC):提供指令的地址。
指令寄存器(IR):从内存中取出的指令被加载到此寄存器。
指令地址生成器:更新程序计数器(PC),指向下一条指令的地址。
控制电路:解释指令,并生成控制信号以执行所需的操作。
这些组件协同工作,确保处理器能够有效地获取和执行指令。
数据处理系统的结构
寄存器A的内容被处理并存放到寄存器B中。
组合电路的操作:组合电路执行的操作通常可以分解为多个更简单的步骤,每个步骤由原始电路的子电路执行。
为什么使用多阶段处理?
- 处理在每个时钟周期内从一个阶段移动到下一个阶段。
- 这种多阶段的系统被称为流水线。
- 高性能处理器通常采用流水线结构。
- 流水线使得连续的指令可以重叠执行,提高处理效率。
流水线将在第六章详细讨论。
指令执行
- 流水线结构的效果:如果所有指令都能在相同的步骤数内执行,流水线结构最为高效。
- 每个步骤在单独的硬件阶段完成。
- 处理器设计:处理器的设计将通过五个硬件阶段来进行说明。
- 如何将指令执行划分为五个步骤?
内存访问指令:
指令:Load R5, X(R7)
- 操作:使用索引寻址方式,从内存位置
X + [R7]
加载一个数据字到寄存器R5
。
执行此指令所需的五个步骤:
- 取指:取出指令并递增程序计数器(PC)。
- 解码:解码指令并读取寄存器
R7
中的内容。 - 计算有效地址:计算有效地址
X + [R7]
。 - 读取内存操作数:从内存中读取数据操作数。
- 加载操作数:将读取到的操作数加载到目标寄存器
R5
中。
计算指令:
指令:Add R3, R4, R5
- 操作:
Add
指令不需要访问内存中的操作数,因此可以在四个步骤内完成。
执行此指令所需的五个步骤:
- 取指:取出指令并递增程序计数器(PC)。
- 解码:解码指令并读取寄存器
R4
和R5
中的内容。 - 计算和:计算
R4 + R5
的和。 - 无操作:在这一步中不进行任何操作(用于保持流水线的一致性)。
- 加载结果:将计算结果加载到目标寄存器
R3
中。
流水线处理:
- 对于所有指令,使用相同的多阶段处理硬件是有利的。如果某些指令的执行步骤较少,可以在某个步骤中不执行任何操作,以保持流水线的连续性。
内存访问指令:
指令:Store R6, X(R8)
- 操作:将寄存器
R6
的内容存储到内存位置X + [R8]
。
执行此指令所需的五个步骤:
- 取指:取出指令并递增程序计数器(PC)。
- 解码:解码指令并读取寄存器
R6
和R8
中的内容。 - 计算有效地址:计算有效地址
X + [R8]
。 - 存储操作数:将寄存器
R6
的内容存储到内存位置X + [R8]
。 - 无操作:在这一步中不进行任何操作(用于保持流水线的一致性)。
流水线处理:
Store
指令不需要像Load
指令那样加载结果到目标寄存器,因此最后一步没有任何操作。
适用于所有指令的五步序列(RISC 风格指令集)
以下五个步骤适用于所有 RISC 风格的指令:
- 取指:取出指令并递增程序计数器(PC)。
- 解码:解码指令并从寄存器文件中读取所需的寄存器。
- 执行 ALU 操作:执行算术逻辑单元(ALU)操作。
- 读写内存:如果指令涉及内存操作数,则进行内存的数据读写。
- 写回结果:如果需要,将结果写入目标寄存器。
这个步骤序列适用于所有类型的指令,包括算术、逻辑、内存访问等操作。
寄存器文件(Register File)
2端口寄存器文件:
- 为了同时读取两个源寄存器,需要使用一个2端口寄存器文件。
- 寄存器文件有两个输出端口(A 和 B),这两个输出端口用于提供读取的源寄存器的内容。
- 寄存器文件有两个地址输入端口,用于选择要读取的两个寄存器,这些地址输入与指令寄存器(IR)中的源寄存器字段相连接。
- 寄存器文件还具有一个数据输入端口(C),以及一个相应的地址输入端口,用于选择目标寄存器。这个地址输入连接到 IR 中指定目标寄存器的字段。
2端口寄存器文件的替代实现:
另一种实现方法是使用两个单端口内存块来代替传统的2端口寄存器文件。
- 每个单端口内存块只能在一个时钟周期内进行一次读或写操作。为了实现2端口功能,需要通过两次时钟周期分别完成两个源寄存器的读取操作。
- 这种实现方法相对简单,但可能会增加延迟,因为需要两个时钟周期来完成两个寄存器的读取。
详细描述:
- 在 RISC 架构中,寄存器文件是一个非常关键的硬件组件,它用于存储和读取处理器的寄存器数据。寄存器文件需要能够高效地支持读取和写入操作。
- 2端口寄存器文件允许同时读取两个寄存器的内容,这是因为许多指令(例如加法、减法等算术运算指令)需要同时从两个寄存器中获取数据。通过为每个源寄存器分配一个独立的端口,2端口设计可以在单一时钟周期内并行执行这些读取操作。
- 目标寄存器通常是指令的执行结果所在的位置,因此,寄存器文件需要能够在执行后将计算结果写入到指定的目标寄存器中。
ALU(算术逻辑单元)
1. 什么是 ALU?
- ALU 是处理器的算术逻辑单元,负责对数据进行操作。
- 主要用于执行算术运算和逻辑运算。
2. ALU 的功能
- 算术运算:
- 加法(Addition)
- 减法(Subtraction)
- 逻辑运算:
- 与(AND)
- 或(OR)
- 异或(XOR)
3. 数据操作方式
- ALU 的操作数来源于寄存器文件(Register File)。
- 源操作数:[RA] 和 [RB]
- 结果存储位置:[RC]
- 数据流:
- 从寄存器 RA 和 RB 中读取操作数。
- 运算结果写入寄存器 RC。
4. 小结
- ALU 是处理器核心组件,负责执行关键的算术和逻辑操作。
- 所有的操作都基于寄存器之间的数据交互完成。
相关信号与组件
- AddressA、AddressB:
- 用于从寄存器文件中选择源操作数 [RA] 和 [RB] 的地址。
- AddressC:
- 指向寄存器文件中存储运算结果的目标地址 [RC]。
- Mux B:
- 多路复用器(Mux),用于选择第二个操作数的来源:
- 来自寄存器 [RB]。
- 或直接选择立即数(Immediate Value)。
- 多路复用器(Mux),用于选择第二个操作数的来源:
- Immediate Value:
- 从指令寄存器(IR)中取出的固定值,用于与寄存器操作数一起参与运算。
数据路径 (Datapath)
指令处理的两个阶段:
- 取指阶段 (Fetch Phase)
- 这个阶段负责从内存中获取指令。
- 取指阶段会对获取的指令进行解码,生成控制信号,进而指示执行阶段采取适当的操作。
- 执行阶段 (Execution Phase)
- 这个阶段根据解码后的指令,从寄存器或者内存中读取操作数。
- 执行阶段执行必要的计算操作,并将结果存储在寄存器或内存中。
处理器硬件的两个主要部分:
- 取指部分
- 负责从内存获取指令,解码指令并生成控制信号。
- 执行部分
- 负责读取指令中指定的数据操作数,进行相应的计算或操作,并将结果保存。
总结:
- 取指阶段 和 执行阶段 分工明确,前者主要负责指令的获取、解码和控制信号的生成,后者则执行实际的计算操作。
- 数据路径的设计确保了处理器高效执行指令,同时将指令执行过程中的每个步骤清晰分开,以便于管理和优化。
5阶段RISC处理器实现
指令处理过程
- 第1阶段:取指阶段 (IF - Instruction Fetch)
- 在这一阶段,指令从内存中获取并放入指令寄存器 (IR) 中。
- 第2阶段:解码阶段 (ID - Instruction Decode)
- 指令被解码,并且源寄存器的值被读取,为后续的计算做准备。
- 第3阶段:执行阶段 (EX - Execute)
- 这时,指令的运算操作在算术逻辑单元 (ALU) 中执行。
- 第4阶段:访存阶段 (MEM - Memory Access)
- 如果指令涉及内存操作(如读取或写入数据),则在这一阶段进行内存访问。
- 第5阶段:写回阶段 (WB - Write Back)
- 最终的计算结果会被存储回目标寄存器中。
总结
- 在这种5阶段的RISC处理器架构中,每个时钟周期都完成一个阶段的操作,确保指令流的连续性和处理的高效性。
- 各个阶段分工明确,从取指到写回每个阶段都在独立的时钟周期内执行,提升了并行性和处理器的吞吐量。
在RISC处理器的5阶段流水线中,阶段2到阶段5之间需要使用不同的中间寄存器来传递数据,这些寄存器使得数据能够从一个阶段传递到下一个阶段。以下是这些重要组件的作用和它们之间的数据流动:
关键组件
- 中间寄存器:
- RZ、RM、RY:这些是不同阶段之间的数据缓冲寄存器,它们用于在不同的阶段之间传递计算结果或操作数。例如:
- RZ可能存储从执行阶段到内存访问阶段的数据。
- RM可能存储从内存访问阶段到写回阶段的数据。
- RY用于存储来自执行阶段的数据,传递给寄存器写回阶段。
- RZ、RM、RY:这些是不同阶段之间的数据缓冲寄存器,它们用于在不同的阶段之间传递计算结果或操作数。例如:
- 寄存器文件 (Register File):
- 存储着处理器中的数据寄存器。指令在执行过程中会从寄存器文件中读取操作数(例如RA, RB)并将计算结果写回(RY)。
- ALU (算术逻辑单元):
- 在执行阶段,ALU对指令进行运算。例如,它可以执行加法、减法、与、或等运算。
- MUXB(多路复用器)用于在ALU输入中选择正确的操作数。根据不同的控制信号,MUXB可以选择寄存器文件中的寄存器值或直接使用立即数。
- 内存阶段 (Memory Stage):
- 访问内存进行读写操作。
- MUXY:内存阶段中的多路复用器,选择数据输入到内存或从内存读取数据,具体取决于指令的类型(读/写)。
- 写回阶段 (Write Back Stage):
- 将计算结果或从内存获取的数据写回寄存器文件中。
- RY:存储从内存或ALU得到的结果,用于写回寄存器文件。
数据流动
- RA 和 RB:寄存器文件中的操作数地址,通过这些地址从寄存器文件中读取数据。
- MUXB:多路复用器选择ALU输入数据,可能是来自寄存器文件的数据或立即数。
- RZ:存储ALU计算结果,传递到内存访问阶段。
- RM:在内存访问阶段存储从内存读取的数据或写入数据的地址。
- RY:在写回阶段存储最终结果,最后写回到寄存器文件。
例子:如何运作
假设我们有一个指令ADD R1, R2, R3
,它将R2
和R3
的值加起来,并把结果存储到R1
。
- 取指阶段 (IF):
- 从内存中取出指令,存入指令寄存器 (IR)。
- 解码阶段 (ID):
- 解码指令并读取寄存器
R2
和R3
的值(通过RA、RB)。 - 将这些数据传递到ALU阶段。
- 解码指令并读取寄存器
- 执行阶段 (EX):
- ALU进行加法操作,将
R2
和R3
相加,结果存入RZ
。
- ALU进行加法操作,将
- 内存阶段 (MEM):
- 此阶段不涉及内存读写操作,因为是计算指令。
- 将
RZ
中的数据传递到写回阶段。
- 写回阶段 (WB):
- 将ALU的计算结果(来自
RZ
)写回到寄存器R1
。
- 将ALU的计算结果(来自
通过这种方式,数据在各个阶段之间流动并最终得到处理。
数据路径:寄存器文件 (阶段 2 & 5)
在RISC处理器的流水线中,寄存器文件在指令的解码阶段(阶段 2)和写回阶段(阶段 5)扮演着重要角色。
寄存器文件的工作原理:
- 地址输入:
- 寄存器文件的地址输入与指令寄存器(IR)中的字段相连接。具体来说,指令中会指定需要读取的源寄存器地址(如
RA
和RB
)。 - 在解码阶段(阶段 2),从指令寄存器(IR)中读取操作数的寄存器地址。
- 寄存器文件的地址输入与指令寄存器(IR)中的字段相连接。具体来说,指令中会指定需要读取的源寄存器地址(如
- 读取源寄存器的值:
- 在阶段 2,指令解码时会根据地址输入(通常是IR中的寄存器字段)从寄存器文件中读取源寄存器的值。
- 被读取的寄存器值会存储到寄存器
RA
和RB
中,供后续的计算使用。
- 结果存储到目标寄存器:
- 在阶段 5,指令执行完毕后,计算的结果会被存储到目标寄存器中。目标寄存器由IR中的相应地址字段选定。
- 寄存器文件将写回计算结果到正确的寄存器,完成数据处理。
总结:
- 在阶段
2,寄存器文件主要负责读取源寄存器的数据,并将其存入
RA
和RB
中。 - 在阶段 5,寄存器文件将处理结果写回到目标寄存器,确保数据更新和存储。
这种操作流使得处理器能够有效地从寄存器中读取数据进行运算,并在指令执行完成后将结果写回寄存器,支持高效的计算过程。
数据路径:ALU阶段
在RISC处理器的流水线中的ALU阶段,主要处理指令指定的计算任务。ALU(算术逻辑单元)是执行实际运算的核心模块,涉及到数据的计算和处理。以下是ALU阶段的关键操作:
ALU阶段的工作原理:
- ALU执行计算:
- ALU根据指令中的操作码(opcode)执行特定的计算任务。这些任务可能包括加法、减法、与操作、或操作等。
- 选择输入数据:
- 多路选择器 MuxB
的作用是从两个输入数据中选择一个作为ALU的第二个操作数:
- 选择 RB(寄存器B的内容),或者
- 选择 立即数(Immediate) 字段,这个立即数来源于指令寄存器(IR)。
- 这种选择机制允许ALU处理不同类型的操作,比如立即数操作或者寄存器操作。
- 多路选择器 MuxB
的作用是从两个输入数据中选择一个作为ALU的第二个操作数:
- 存储计算结果:
- 计算结果会被存储在RZ寄存器中。这个寄存器用于保存ALU计算后的结果,供后续使用或存储。
- 数据转移至内存:
- 在ALU阶段,如果当前的指令涉及内存写操作(例如存储指令),那么数据会从寄存器RB转移到寄存器RM,然后准备写入内存中。
总结:
- ALU根据指令执行计算任务,处理寄存器中的数据或立即数。
- MuxB控制数据的选择,决定是从寄存器中读取数据还是使用立即数。
- 计算结果存储在RZ,如果有内存操作,数据将传送到RM。
通过这个阶段,ALU不仅完成了必要的计算任务,还决定了计算结果是写回寄存器、传送到内存,还是执行其他操作。
Datapath: Memory Stage(内存阶段)
注意一下RM。
在处理内存指令时,Memory stage(内存阶段)主要负责以下几个任务:
- RZ 提供内存地址:
- RZ(寄存器Z)提供了内存访问的地址,这通常是在执行内存读取或写入时,从ALU计算中获得的结果。
- MuxY 选择读取的数据放入 RY:
- MuxY 是一个多路复用器,它决定从哪个输入选择数据。对于内存读取指令,MuxY 会选择从内存读取的数据,并将其放入 RY(寄存器Y),这是存储数据的地方。
- 对于计算指令,MuxY 选择 RZ 中的内容放入 RY。
- RM 提供内存写入操作的数据:
- 对于写内存操作(如
SW
指令),RM 存储着要写入内存的数据。这个数据会传递到内存中进行存储。
- 对于写内存操作(如
- 用于子程序调用时的输入2(MuxY):
- 在进行子程序调用时,MuxY 的第二个输入会被使用,这可以将数据传递到内存操作或计算中。
关键点:
- RZ:用于提供内存地址,通常是从ALU计算得到的结果。
- MuxY:根据指令类型选择数据,内存读取时将数据放入 RY,计算指令时从 RZ 放入 RY。
- RM:对于内存写指令,提供要写入内存的数据。
- RY:存储从内存读取的结果,或者ALU的计算结果。
- 子程序调用时的输入2:用于特定情况下的数据选择,尤其是在处理函数调用时。
这个阶段主要负责内存操作和计算结果的存储,是数据从内存到寄存器的一个关键转接点。
Instruction Fetch Section(指令获取部分)
1. Memory Address Generation(内存地址生成)
- MuxMA 选择 PC 地址:在获取指令时,MuxMA 选择程序计数器(PC)的值作为内存地址,以便从内存中取出指令。
- 指令地址生成器:指令地址生成器在获取指令后会自增程序计数器(PC),指向下一条指令的地址。
- 生成分支和子程序地址:该模块还负责生成分支指令的目标地址,以及在调用子程序时生成返回地址。
- MuxMA 选择 RZ 读取或写入数据操作数:当进行数据操作数的读取或写入时,MuxMA 会选择 RZ 作为内存地址,确保数据从正确的位置读取或写入。
2. Processor Control Section(处理器控制部分)
- 指令读取并存储到 IR:当一条指令被从内存读取时,它会被放置到指令寄存器(IR)中,准备解码和执行。
- 控制电路解码指令:解码器负责将指令解码,理解指令的操作类型,确定如何驱动处理器的各个单元。
- 生成控制信号:根据指令的解码结果,控制电路会生成一组控制信号,来驱动处理器中的所有单元,以确保指令的正确执行。
- Immediate Block 扩展立即数操作数:在指令中,如果有立即数操作数,Immediate Block 会根据指令的要求将其扩展到 32 位,保证数据宽度与系统要求一致。
3. Instruction Address Generator(指令地址生成器)
- 与 RY 和 RA 连接,用于子程序调用和返回:指令地址生成器还与寄存器 RY 和 RA 连接,这些寄存器用于子程序调用和返回地址的存储。
在RISC处理器的指令获取阶段,PC-Temp、PC、MuxPC 和 MUXINC 都是涉及到程序计数器(PC)管理的关键组件。它们的作用如下:
1. PC-Temp(PC 临时寄存器)
- 功能:用于存储当前程序计数器(PC)的值,通常在需要更新PC值之前,将其临时存储在 PC-Temp 中。这个临时存储可以防止直接修改 PC,确保在决定下一个PC值时不会丢失当前PC的内容。
- 应用场景:比如在跳转指令(如分支指令)处理中,处理器需要保存当前PC值,以便之后返回。
2. PC(程序计数器)
- 功能:PC寄存器存储当前正在执行的指令的地址(内存地址)。在每个时钟周期结束时,PC会递增,指向下一条指令。
- 应用场景:每当处理器执行完一条指令后,程序计数器会更新为下一条指令的地址,通常会加1,也有例外情况(例如分支指令)。
3. MuxPC(程序计数器多路复用器)
- 功能:MuxPC 是一个多路复用器,用于选择下一个程序计数器的值。它根据控制信号的不同,选择不同的输入作为程序计数器的值。
- 输入来源:
- PC + 4:通常情况下,程序计数器指向当前指令的地址,加4后指向下一条指令(每条指令通常占4个字节)。
- 跳转目标地址:在执行跳转指令时,程序计数器会跳转到一个新的地址。此时,MuxPC 会选择跳转指令的目标地址而不是加4的值。
- 应用场景:分支、跳转等指令可能会修改程序计数器的值,因此通过 MuxPC 选择正确的地址。
4. MUXINC(PC 增量多路复用器)
- 功能:MUXINC 用来生成程序计数器递增的值。在大多数情况下,MUXINC 会生成一个常数值,通常是4,用来指向下一条指令的地址。
- 应用场景:用于PC更新时,通常PC值会增加4(假设每条指令是4字节)。但是在分支或跳转指令执行时,PC会变成一个新的地址。MUXINC 就是在常规情况下,用来递增PC的值。
他们如何协作:
- 在没有跳转指令时,程序计数器(PC)会自动递增,通常加4,以指向下一条指令。MUXINC 输出值4,MuxPC 选择该值并加到 PC 上。
- 如果遇到跳转或分支指令,MuxPC 会根据控制信号选择跳转目标地址或返回地址,而不是自动递增的PC值。
- 在跳转或分支指令中,程序计数器的更新会通过 PC-Temp 暂存当前PC值,然后通过 MuxPC 选择正确的新PC值。
关键点总结:
- MuxMA:选择程序计数器(PC)作为内存地址,或者在数据操作中选择 RZ 作为内存地址。
- 指令地址生成器:负责更新程序计数器(PC),并在需要时生成分支地址或子程序返回地址。
- IR:指令寄存器,存储当前从内存读取的指令。
- Immediate Block:负责扩展立即数操作数,确保它符合 32 位的要求。
- 控制电路:解码指令并生成控制信号,控制整个处理器的操作。
这些功能的组合确保了指令的顺利获取、解码和执行。
5.4 指令获取与执行步骤
示例 1: Add R3, R4, R5(将 R4 和 R5 相加,结果存入 R3)
这个过程分为多个步骤,在每个步骤中,处理器执行不同的任务以完成这条指令。下面是步骤的中文解释:
步骤 1:指令获取
- 内存地址 ← [PC]:程序计数器(PC)提供当前指令的内存地址。
- 读取内存,IR ← 内存数据:处理器从内存中读取指令并将其存入指令寄存器(IR)。
- PC ← [PC] + 4:指令获取完毕后,程序计数器(PC)递增4(假设每条指令占用4字节),指向下一条指令。
解释:第一步完成了从内存中获取当前指令,并更新了程序计数器,使得下一条指令的获取地址准备好。
步骤 2:解码指令
- RA ← [R4]:从寄存器文件中读取寄存器 R4 的值,存入临时寄存器 RA。
- RB ← [R5]:从寄存器文件中读取寄存器 R5 的值,存入临时寄存器 RB。
解释:在第二步,解码指令并准备好操作数。寄存器 R4 和 R5 的内容被加载到寄存器 RA 和 RB 中,供下一步计算使用。
步骤 3:执行计算
- RZ ← [RA] + [RB]:将 RA 和 RB 寄存器中的值相加,结果存入临时寄存器 RZ。
解释:在执行阶段,ALU(算术逻辑单元)对两个寄存器的值进行加法运算,计算出结果并存入寄存器 RZ。
步骤 4:保存计算结果
- RY ← [RZ]:将临时寄存器 RZ 中的结果存入寄存器 RY(这里假设 RY 是一个临时寄存器或计算结果的存储寄存器)。
解释:这一步可能是为了准备将计算结果进一步处理,或将结果传递给下一步。
步骤 5:写回结果
- R3 ← [RY]:将最终的计算结果从寄存器 RY 写回到目标寄存器 R3。
解释:最后,计算结果存回寄存器 R3,完成指令的执行。
指令编码格式
指令格式定义了指令中各个字段的布局。不同的操作数格式决定了指令的结构,下面是三种常见的指令编码格式:
(a) 寄存器操作数格式(Register-operand format)
这种格式用于那些操作数都来自寄存器的指令。格式如下:
1 | | Rsrc1 | Rsrc2 | Rdst | OP code | |
- Rsrc1 和 Rsrc2:表示操作数的源寄存器,通常是参与计算的两个寄存器。
- Rdst:表示目标寄存器,存储操作结果的寄存器。
- OP code:操作码,指定该指令执行的操作类型(例如加法、减法等)。
(b) 立即数操作数格式(Immediate-operand format)
这种格式用于指令中包含立即数的操作数。格式如下:
1 | | Rsrc | Rdst | Immediate operand | OP code | |
- Rsrc:源寄存器,操作数之一来自寄存器。
- Rdst:目标寄存器,存储操作结果的寄存器。
- Immediate operand:立即数操作数,直接在指令中给出的常数值。
- OP code:操作码,指定该指令执行的操作类型。
(c) 调用格式(Call format)
这种格式用于函数调用指令,通常在调用子程序时使用。格式如下:
1 | | Immediate value | OP code | |
- Immediate value:存储跳转目标地址或偏移量,指向调用的子程序地址。
- OP code:操作码,指明这是一个函数调用指令。
示例2:加载指令(Load R5, X(R7))
该指令的操作是从内存地址 X + [R7]
处读取数据,并将其加载到寄存器 R5
中。具体的步骤如下:
- 取指令
- Memory address ← [PC]:获取程序计数器(PC)指向的内存地址。
- Read memory, IR ← Memory data:从内存中读取指令,并将其存储到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
- 解码指令
- RA ← [R7]:从寄存器
R7
中读取数据,并将其存储到寄存器RA
中。
- RA ← [R7]:从寄存器
- 计算内存地址
- RZ ← [RA] + Immediate value X:将寄存器
RA
中的值与立即数X
相加,计算出内存地址RZ
。
- RZ ← [RA] + Immediate value X:将寄存器
- 访问内存
- Memory address ← [RZ]:使用计算出的内存地址
RZ
。 - Read memory, RY ← Memory data:从内存地址
RZ
读取数据,并将其存储到寄存器RY
中。
- Memory address ← [RZ]:使用计算出的内存地址
- 写回寄存器
- R5 ← [RY]:将从内存中读取的数据存入寄存器
R5
。
- R5 ← [RY]:将从内存中读取的数据存入寄存器
示例3:存储指令(Store R6, X(R8))
该指令的操作是将寄存器 R6
中的数据存储到内存地址
X + [R8]
处。具体的步骤如下:
- 取指令
- Memory address ← [PC]:获取程序计数器(PC)指向的内存地址。
- Read memory, IR ← Memory data:从内存中读取指令,并将其存储到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
- 解码指令
- RA ← [R8]:从寄存器
R8
中读取数据,并将其存储到寄存器RA
中。 - RB ← [R6]:从寄存器
R6
中读取数据,并将其存储到寄存器RB
中。
- RA ← [R8]:从寄存器
- 计算内存地址并准备写入数据
- RZ ← [RA] + Immediate value X:将寄存器
RA
中的值与立即数X
相加,计算出内存地址RZ
。 - RM ← [RB]:将寄存器
RB
中的值(即寄存器R6
的值)存储到寄存器RM
中,作为要写入内存的数据。
- RZ ← [RA] + Immediate value X:将寄存器
- 访问内存并写数据
- Memory address ← [RZ]:使用计算出的内存地址
RZ
。 - Memory data ← [RM], Write memory:将寄存器
RM
中的数据写入到内存地址RZ
指定的内存位置。
- Memory address ← [RZ]:使用计算出的内存地址
- 没有其他操作
- No action:此步骤不进行其他操作。
无条件跳转指令(Unconditional Branch)
无条件跳转指令的执行过程包括以下几个步骤:
- 取指令
- Memory address ← [PC]:获取程序计数器(PC)指向的内存地址。
- Read memory, IR ← Memory data:从内存中读取指令,并将其存储到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
- 解码指令
- 对指令进行解码,获取跳转目标地址的偏移量。
- 计算跳转地址
- PC ← [PC] + Branch offset:根据指令中的分支偏移量更新程序计数器(PC),跳转到新的指令位置。
- 没有其他操作
- No action:此步骤不进行其他操作。
- 没有其他操作
- No action:此步骤不进行其他操作。
总结
无条件跳转指令的执行通过更新程序计数器(PC)来实现跳转。首先,取指令并更新PC,然后根据指令中的偏移量修改PC,实现无条件跳转到指定位置。
条件跳转指令(Conditional Branch)
条件跳转指令的执行过程包括以下几个步骤:
- 取指令
- Memory address ← [PC]:获取程序计数器(PC)指向的内存地址。
- Read memory, IR ← Memory data:从内存中读取指令,并将其存储到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
- 解码指令
- 对指令进行解码,读取寄存器R5和R6的内容:
- RA ← [R5]:将寄存器R5的内容存储到RA中。
- RB ← [R6]:将寄存器R6的内容存储到RB中。
- 对指令进行解码,读取寄存器R5和R6的内容:
- 比较寄存器值
- Compare [RA] to [RB]:将寄存器RA和RB的值进行比较。
- If [RA] = [RB], then PC ← [PC] + Branch offset:如果RA的值与RB相等,程序计数器(PC)将跳转到根据指令中的分支偏移量计算的目标地址。
- 没有其他操作
- No action:此步骤不进行其他操作。
- 没有其他操作
- No action:此步骤不进行其他操作。
比较操作
为了判断RA和RB是否相等,可以通过执行 [RA] - [RB] 的减法操作来完成比较。但是这种做法可能比较耗时,因此可以使用更简单和更快速的比较器来进行此操作,避免消耗过多的时间。
总结
条件跳转指令通过判断寄存器中的值是否相等来决定是否跳转。取指令并解码后,比较两个寄存器的值,如果相等,则通过更新程序计数器(PC)跳转到目标地址。
子程序调用(带间接寻址)
子程序调用指令在执行时会进行跳转,并保存当前程序计数器(PC)的值,以便在子程序执行完毕后能够返回。下面是带间接寻址的子程序调用的步骤:
- 取指令
- Memory address ← [PC]:获取当前程序计数器(PC)指向的内存地址。
- Read memory, IR ← Memory data:从内存中读取数据并存储到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
- 解码指令
- 解码当前指令并读取寄存器R9的内容:
- RA ← [R9]:将寄存器R9中的值存储到寄存器RA中。此值通常是跳转目标的地址,表示要调用的子程序的入口地址。
- 解码当前指令并读取寄存器R9的内容:
- 保存当前程序计数器(PC)
- PC Temp ← [PC]:将当前的程序计数器(PC)的值存储到临时寄存器PC Temp中,准备稍后用来返回。
- 跳转到子程序
- PC ← [RA]:将RA中的值作为新的程序计数器(PC),即跳转到子程序的入口地址。
- 保存返回地址
- RY ← PC Temp:将临时保存的程序计数器值(PC Temp)存储到寄存器RY中,以便子程序结束后可以返回。
等待内存(Wait for Memory)
在计算机系统中,内存访问操作通常分为两个主要情境:
- 缓存命中:
- 当所需的指令或数据在缓存中找到时,内存读写操作通常会在一个时钟周期内完成。
- 缓存未命中:
- 当所需的数据不在缓存中,需要从主内存中提取时,可能需要多个时钟周期才能完成操作。
内存完成信号 (MFC)
- MFC (Memory Function Completed)
信号:用于指示内存操作是否已完成。
- 当数据在缓存中时,MFC信号会在发出内存请求的同一时钟周期结束之前生成,意味着操作在一个时钟周期内完成。
- 如果需要访问主内存,MFC信号的响应会延迟,直到内存操作完成,这个过程会延续多个时钟周期。
步骤 1:指令执行中的内存等待
在每条指令的执行过程中,第一步包括等待MFC信号:
- Memory address ← [PC]:根据程序计数器(PC)获取内存地址。
- Read memory:从内存中读取数据。
- Wait for MFC:等待内存操作完成信号(MFC)。
- IR ← Memory data:将从内存读取的数据加载到指令寄存器(IR)中。
- PC ← [PC] + 4:程序计数器自增,指向下一条指令。
加载和存储指令中的MFC等待
对于加载(Load)和存储(Store)指令,在步骤 4 中也需要等待 MFC 信号,确保内存操作完成后,数据才能继续传输和处理。
精华所在
“等待内存”主要是处理缓存命中与未命中的两种情形。通过使用 MFC 信号,系统能够有效地同步内存访问操作,确保在缓存未命中的情况下仍能完成指令执行,但会消耗更多的时钟周期。
控制信号 (Control Signals)
在处理器中,硬件组件的操作由控制信号来管理。这些信号确保数据流动的正确性和操作执行的顺利进行,具体功能包括:
- 控制多路复用器选择:
- 控制信号用于选择正确的数据流路径,指导数据在各个硬件单元之间的流动。比如,通过控制多路复用器(Mux),可以选择从寄存器、ALU或内存读取的数据。
- 设置ALU的功能:
- ALU(算术逻辑单元)的功能由控制信号来设定。控制信号决定ALU执行哪种运算(例如加法、减法、与运算、或运算等)。
- 确定何时写入数据:
- 控制信号还决定数据什么时候写入到以下几个地方:
- 程序计数器(PC)
- 指令寄存器(IR)
- 寄存器文件
- 内存 这些操作的时序和选择会影响程序执行的进度。
- 控制信号还决定数据什么时候写入到以下几个地方:
- 跨阶段寄存器始终启用:
- 在处理器的多个阶段之间,寄存器用于传递数据。控制信号确保跨阶段寄存器始终处于启用状态,以便能正确地传递数据。
寄存器文件控制信号 (Register File Control Signals)
ALU control signals
Result selection
内存访问 (Memory Access)
缓存内存:
- 缓存内存是比主内存更快但更小的存储器,作为主内存的辅助存储器,用于提高数据访问速度。
- 缓存内存的作用是加速对常用数据的访问。若数据已经存在于缓存中,内存访问可以在一个时钟周期内完成。
访问主内存:
- 当数据未在缓存中时,读取或写入操作可能需要多个时钟周期,从主内存加载数据到缓存中。
MFC 控制信号:
需要一个控制信号来指示内存操作已完成,通常这个信号被称为 Memory Function Completed (MFC) 信号。
例如,在指令获取步骤1中:
1
1. 内存地址 <- [PC], 读取内存,等待 MFC 信号,IR <- 内存数据,PC <- [PC] + 4
这表明在内存操作完成之前,必须等待 MFC 信号,以确保数据正确加载。
总结
- 缓存内存的引入大大提高了内存访问的速度,减少了从主内存读取数据的时间。
- 当数据不在缓存中时,需要通过主内存加载,并且通过 MFC 控制信号来确保操作完成,防止在数据准备好之前进行后续处理。
Memory and IR control signals
Control signals of instruction address generator
5.6 硬连线控制 (Hardwired Control)
- 简介:
- 我们已经描述了指令的获取和执行过程,以及执行这些操作所需的控制信号。
- 但是,如何生成这些控制信号,并确保操作按照正确的顺序和时机执行呢?
- 控制信号生成:
- 控制信号是用于驱动硬件执行特定操作的信号。
- 要确保每个步骤都按顺序执行并在合适的时机进行,需要设计合适的控制信号。
- 两种基本方法:
- 硬连线控制(Hardwired Control):
- 硬连线控制是通过组合逻辑电路来生成控制信号,硬件直接决定指令的执行。
- 这种方法实现速度快,但灵活性较低,不易修改或扩展。
- 微程序控制(Microprogramming):
- 微程序控制使用一组存储在内存中的微指令来生成控制信号,控制信号的生成是通过软件编程来实现的。
- 这种方法灵活性较高,但速度相对较慢。
- 硬连线控制(Hardwired Control):
总结
- 硬连线控制通过硬件逻辑来生成控制信号,适用于要求高速度的场景。
- 微程序控制则通过存储的微指令灵活控制,适用于更复杂的操作,但执行速度较慢。
硬连线控制信号生成 (Hardwired Generation of Control Signals)
- 硬连线控制概述:
- 硬连线控制涉及实现电路,这些电路需要考虑步骤计数器、指令寄存器(IR)、ALU 结果以A及外部输入(如 MFC 信号、中断请求等)。
- 步骤计数器:
- 步骤计数器用于跟踪指令执行的进度。
- 每个时钟周期对应前述五个步骤中的一个步骤。
- 步骤计数器帮助控制信号按顺序生成,以确保每个操作按正确的顺序执行。
- 信号生成的依据:
- 通过硬件电路,控制信号根据步骤计数器、IR的内容、ALU的计算结果以及外部信号(如内存操作完成信号 MFC 或中断请求)来生成。
- 硬连线控制通过直接的逻辑运算来产生所需的控制信号,使得操作能够自动且迅速地进行。
硬连线控制信号生成 (Hardwired Generation of Control Signals)
- 指令解码器:
- 指令解码器通过解读指令寄存器(IR)中的操作码(OP code)和寻址模式信息,并将对应的INSi输出设置为1,从而确定当前执行的操作。
- 步骤计数器:
- 在每个时钟周期,步骤计数器的T1至T5之一的输出被设置为1,指示当前正在执行五个步骤中的哪个步骤。
- 控制信号生成器:
- 控制信号生成器是一个组合逻辑电路,它根据输入信号(如INS、T、E、F等)生成相应的控制信号。
- 输入信号包括:INS(指令寄存器)、T(步骤计数器的输出)、E(外部输入信号)、F(功能信号)。
- 输出信号是C(控制信号),其生成是输入信号的某种函数。
硬连线控制的功能
- 输入:INS、T、E、F
- 输出:C = f(INS, T, E, F),控制信号是根据上述输入信号计算出来的。
步骤1:指令执行过程的硬连线控制
考虑执行过程中的步骤1:
- 新指令取指:在此步骤中,新指令被取出,并通过T1信号被识别。
- MA_select设置为1:这时选择程序计数器(PC)作为内存地址的来源。
- MEM_read激活:启动内存读取操作,取出指令数据。
- IR寄存器加载:当内存操作完成(MFC信号被触发)时,激活IR_enable信号将指令加载到指令寄存器中。
- PC增加4:通过设置INC_select为0和PC_select为1,程序计数器(PC)增加4,指向下一条指令。
- PC_enable激活:在时钟正边沿(步骤T1结束时),激活PC_enable信号,将新的PC值加载到程序计数器中。
总结:
硬连线控制通过组合电路和步骤计数器控制指令的执行过程,每个步骤都有相应的信号来激活所需的操作。
数据路径控制信号 (Datapath Control Signals)
- 控制信号的生成:
- 每条指令在执行过程中有多个步骤,每个步骤需要相应的控制信号来指导数据的流动和操作的执行。
- 控制信号的设定可以通过检查每个执行步骤中所采取的动作来确定。
- RF_write 信号:
- 例如,RF_write 信号在步骤 T5 中被设定为 1。它可以通过以下逻辑表达式生成: [ = T5 ( + + ) ]
- 这意味着 RF_write 信号既是指令操作的一部分,又依赖于时序信号。
- 选择信号的设定:
- 一些多路选择器的设置在不同的时序步骤中可能保持不变。例如,B_select 信号在所有需要使用立即数(Immediate)的指令中都会设为 Immediate。
- Immediate 代表的是所有在指令寄存器(IR)中使用立即数的指令。
总结:
- 控制信号的生成不仅依赖于指令本身的类型,还受到执行步骤的时序控制。控制信号的设置是由时序信号(如T5等)和操作信号(如ALU、Load、Call等)共同决定的。
处理内存延迟 (Dealing with Memory Delay)
- 时序信号 T1 到 T5:
- 这些时序信号按顺序触发,当步骤计数器(step counter)推进时。
- 通常情况下,步骤计数器在每个时钟周期结束时递增。
- 内存读取和写入操作的延迟:
- 在发出 MEM_read 或 MEM_write 命令时,该步骤在 MFC(Memory Function Completed)信号被触发之前不会结束。
- 为了处理这种延迟,需要禁用步骤计数器,以便将执行步骤的持续时间延长为多个时钟周期。
- 禁用步骤计数器:
- 使用 Counter_enable = WMFC + MFC 来控制步骤计数器的使能。
- 当 WMFC(Write MFC)没有触发或 MFC 已触发时,Counter_enable 信号被设置为 1。
- 确保 PC 仅在特定条件下递增:
- 当一个执行步骤延长为多个时钟周期时,需要确保程序计数器(PC)只在适当的时候递增。
- 在获取指令时,只有当接收到 MFC 信号时,PC 才能启用递增。
- 对于需要跳转的指令(如分支指令),在 T3 步骤中也需要启用 PC。
- PC 的使能:
- PC_enable = T1 · MFC + T3 · BR
- 在 T1 步骤且 MFC 信号触发时,PC 会被使能;
- 在分支指令(BR)的 T3 步骤中,PC 也会被使能。
- PC_enable = T1 · MFC + T3 · BR
总结:
- MFC 信号的处理是保证指令执行步骤按时完成的关键,特别是在涉及内存读写操作时。通过适当的时序控制和禁用步骤计数器,可以确保 PC 的递增行为和执行步骤的时间协调。
5.7 CISC 风格处理器 (CISC-style Processors)
- CISC 处理器的特点:
- CISC(复杂指令集计算机)风格的处理器具有更多复杂的指令。
- 不同的指令可能包含不同的操作数、操作类型和操作模式,因此每条指令的执行步骤可能会有所不同。
- 执行步骤的灵活性:
- CISC 处理器的指令集合:完整的指令集合不能在固定数量的步骤中实现,因为某些指令需要执行的步骤较多。
- 执行步骤的变化:不同的指令的执行步骤可能不遵循固定的顺序,指令执行可能会根据操作类型或操作数类型的不同而有所变化。
- 硬件组织的要求:
- 为了适应 CISC 风格的灵活性,硬件组织需要支持数据流和操作流程的灵活管理。
- 这意味着硬件结构必须能够处理多种不同的指令格式和不同的执行路径。
总结:
CISC 处理器通过更复杂的指令集提供强大的功能,但也要求硬件能够灵活地适应不同的指令执行需求,因此需要更复杂的数据流控制和硬件设计。
Hardware organization for a CISC computer
总线 (Bus)
- 总线概述:
- 总线是一种常见的互联网络 (interconnection network),用于连接系统中不同的功能单元。
- 在总线系统中,数据在多个模块之间传输,通常会有一个共享的传输通道。
- 三态驱动器 (Tri-state driver):
- 当多个功能单元共享一条总线时,使用三态驱动器来控制信号。
- 三态驱动器具有三种状态:驱动高电平、驱动低电平和高阻态(即不驱动信号)。通过这种方式,多个模块可以按需在总线上传递信号,而不发生冲突。
- 总线数据加载:
- 当
R_in = 1
时,多路复用器选择总线上的数据,并将其加载到触发器中。 - 触发器的输出连接到总线线,通过三态门将其输出。当
R_out = 1
时,三态门被打开,使触发器的输出连接到总线上。
- 当
三总线互连网络 (A 3-bus interconnection network)
- 三总线系统:
- 在三总线系统中,数据通过三个独立的总线进行传输,能够更高效地在多个功能单元之间共享数据。
- 每个总线可能有不同的功能,提供不同的连接路径,以支持复杂的数据流动。
总结:
总线是计算机内部用于连接不同模块的数据传输通道。通过三态驱动器,多个模块可以在同一总线上安全地发送和接收数据。三总线系统提供了更多的路径和灵活性,使得多个功能单元可以更高效地进行数据交换。
示例:加法指令
Add R5, R6
- 步骤 1:获取指令
- 内存地址<-[PC]:从程序计数器(PC)获取内存地址。
- 读取内存,等待 MFC:从内存中读取数据,并等待内存操作完成信号(MFC)。
- IR<-内存数据:将从内存读取到的数据加载到指令寄存器(IR)中。
- PC<-[PC] + 4:程序计数器加 4,指向下一条指令的地址。
- 步骤 2:解码指令
- 解析指令寄存器(IR)中的操作码,确定该执行加法操作。
- 确定源寄存器和目标寄存器(此例中为 R5 和 R6)。
- 步骤 3:执行加法
- R5<-[R5] + [R6]:将寄存器 R6 的值与 R5 中的值相加,并将结果存储回 R5。
示例:And X(R7), R9
指令
假设偏移量 X 是一个 32 位的值,作为指令的第二个字。
步骤 1:获取操作码
- 首先,获取指令的操作码(OP code)。这一步骤是指从内存中读取指令的第一部分,即操作码。
步骤 2:解码并获取偏移量 X
- 在指令解码过程中,当解码电路识别到使用 索引寻址模式(Index addressing mode)时,它会从指令中提取出偏移量 X。此时,偏移量 X 会作为指令的第二个字被提取。
步骤 3:执行操作
- 执行 AND 操作。操作数是内存地址
X(R7)
(即基址为 R7,偏移量为 X)和寄存器 R9。该操作会将 R9 的值与X(R7)
位置的数据进行 AND 运算,并将结果存储回寄存器 R9。
微程序设计(Microprogramming)
微程序设计是一种基于软件的生成控制信号的方式。它通过存储在微指令中的控制信号来控制处理器操作。
微程序设计的工作原理:
- 微指令存储:
- 每个时钟周期的控制信号的值存储在一个微指令(控制字)中。
- 每个控制信号对应控制字中的一个比特。
- 微程序:
- 处理器指令通过一系列微指令(微程序或微例程)来实现,这些微指令被存储在控制存储器中。
- 每条处理器指令的执行都对应一系列微指令的执行。
- 控制信号的生成:
- 在解码指令时,指令寄存器(IR)会提供信息,控制电路根据这些信息执行相应的微指令序列。
- 这些微指令通过控制存储器从控制信号生成。
- PC(程序计数器):
- PC 用来保持当前微指令的位置,指示下一条将要执行的微指令。
微程序设计的优点:
- 微程序设计比硬件控制更加灵活,可以通过修改微程序来改变处理器的控制逻辑,而无需更改硬件。
Quiz
选择题 1:硬件控制单元中,所需的控制信号是通过以下信息确定的,除了:
A. 控制步骤计数器的内容
B. 条件码标志的内容
C. 指令寄存器的内容
D. 程序计数器的内容
答案解析:
硬件控制单元中的控制信号通常依赖以下内容:
- A(控制步骤计数器的内容):控制步骤计数器记录指令执行的步骤,影响控制信号的生成。
- C(指令寄存器的内容):指令寄存器存储当前执行的指令,决定要执行哪些操作。
- D(程序计数器的内容):程序计数器指向下一条要执行的指令,控制指令的流。
B(条件码标志的内容)通常与指令执行后的结果相关,特别是在做分支或条件跳转时,但并不直接用于硬件控制单元的信号生成。因此,B 不是硬件控制单元所需的直接输入信息。
选择题 2:在微程序控制的机器中,机器指令所需的控制信号是由以下哪项生成的?
A. 控制存储器 (control store)
B. 控制字 (control word)
C. 微例程 (microroutine)
D. 微指令 (microinstruction)
答案解析:
在微程序控制的机器中,微指令(D)用于生成控制信号。每个微指令指定一个或多个控制信号,定义了机器操作的细节。多个微指令组合成一个微例程(C),而控制存储器(A)用于存储这些微指令。
- A(控制存储器):用于存储微程序(微指令)。
- B(控制字):是微指令的一部分,它由多个控制信号的位组成,用来具体控制硬件操作。
- C(微例程):是由一系列微指令组成的控制序列,用于完成某个机器指令的执行。
- D(微指令):直接生成控制信号,指示硬件执行特定的操作。
因此,D(微指令)是生成机器指令所需控制信号的直接来源。
选择题 3:计算机指令集中所有指令的微程序存储在一个特殊的存储器中,这个存储器叫做?
A. 内存控制器 (memory controller)
B. 主存 (main memory)
C. 缓存 (cache)
D. 控制存储器 (control store)
答案解析:
D. 控制存储器 (control store) 是用来存储计算机所有指令的微程序的地方。每条指令的执行都由一系列微指令来控制,这些微指令通常存储在控制存储器中。
- A. 内存控制器:控制存储器的访问,但不是存储微程序的地方。
- B. 主存:用于存储程序和数据,而非微程序。
- C. 缓存:用于加速数据访问,不存储微程序。
- D. 控制存储器:专门用于存储微程序,控制指令的执行。
因此,正确答案是 D. 控制存储器。
选择题 4:在微程序控制的计算机中,机器指令和微指令之间的关系是?
A. 一条机器指令由一条微指令执行
B. 一条微指令由若干机器指令组成
C. 一条机器指令由一段微程序执行,微程序由若干微指令组成
D. 以上都不对
答案解析:
C. 一条机器指令由一段微程序执行,微程序由若干微指令组成 是正确的。
在微程序控制的计算机中,机器指令的执行是通过微程序来实现的。微程序由一系列微指令组成,每条机器指令都需要一个特定的微程序来执行。
- A. 一条机器指令由一条微指令执行:不正确,因为机器指令通常需要多个微指令来执行。
- B. 一条微指令由若干机器指令组成:不正确,微指令控制机器指令的执行,而不是由机器指令组成。
- C. 一条机器指令由一段微程序执行,微程序由若干微指令组成:这是微程序控制机器的正确描述。
因此,正确答案是 C. 一条机器指令由一段微程序执行,微程序由若干微指令组成。
选择题 5:硬件控制与微程序控制的优缺点是什么?
硬件控制的主要优点:
- 快速操作:硬件控制由于是通过直接电路实现的,因此能够在每个时钟周期内迅速产生控制信号,从而提供更高的执行速度。
硬件控制的缺点:
- 成本较高:硬件控制需要复杂的电路设计,通常会导致较高的生产成本。
- 缺乏灵活性:一旦设计完成,硬件控制系统难以修改或扩展,增加新功能或改变现有功能通常需要重新设计硬件。
- 设计和实现时间较长:设计和实现硬件控制系统比微程序控制要更耗时,因为它涉及到硬件电路的设计和验证。
微程序控制的主要优点:
- 低成本:微程序控制的设计和实现依赖于存储程序(微程序),通常成本较低,因为它不需要专门的硬件电路。
- 高灵活性:微程序控制可以通过修改微程序来改变机器的行为,不需要硬件上的重大更改,具有更高的灵活性。
微程序控制的缺点:
- 操作速度较慢:由于每条机器指令由多个微指令执行,且微指令需要通过内存读取,微程序控制的速度较硬件控制慢,可能不适用于高性能计算机。
总结:
- 硬件控制具有快速操作的优点,但存在成本高、灵活性差的缺点。
- 微程序控制具有低成本和高灵活性的优点,但操作速度较慢,可能不适合高性能计算。
选择题 6:
问题描述:
使用5级RISC处理器执行以下指令:
Load R4, 100(R2)
该处理器的数据路径和所有控制信号如图所示。
简要分析:
这道题目考察了如何通过RISC处理器的五个阶段执行指令
Load R4, 100(R2)
。
在RISC体系结构中,典型的5阶段指令周期包括:
- 取指阶段 (IF): 从内存中取指令,并更新程序计数器 (PC)。
- 解码阶段 (ID): 解码指令,读取源寄存器 (如R2),并进行必要的操作。
- 执行阶段 (EX): 计算地址,基于
100(R2)
计算出内存地址。 - 内存访问阶段 (MEM): 根据计算出的地址,访问内存并将数据加载到寄存器。
- 写回阶段 (WB): 将从内存读取的数据存储到目标寄存器 R4 中。
数据路径和控制信号:
- 取指阶段 (IF):
- 使用
PC
生成内存地址,读取指令到 IR,PC 增加 4。
- 使用
- 解码阶段 (ID):
- 解码指令,
R2
的内容加载到RA
。
- 解码指令,
- 执行阶段 (EX):
- 计算内存地址,
R2
中的数据与偏移量100
相加,结果存储在RZ
中。
- 计算内存地址,
- 内存阶段 (MEM):
- 通过计算出的地址,访问内存并将数据加载到
RY
。
- 通过计算出的地址,访问内存并将数据加载到
- 写回阶段 (WB):
- 将内存中读取的数据写回到寄存器
R4
。
- 将内存中读取的数据写回到寄存器
在这个过程中,控制信号将决定各个阶段如何执行,如选择寄存器文件、控制内存读写、ALU 操作等。
选择题 7:
问题描述:
(1) 写出在执行指令 Load R4, 100(R2)
时第 3 阶段、第 4
阶段和第 5 阶段需要执行的动作。
(2) 写出第 3 阶段的 B_select
、第 4 阶段的
Y_select
和第 5 阶段的 RF_write
控制信号的值。
- 答案:
B_select = 1
Y_select = 01
RF_write = 1
解析:
- 阶段 3(执行阶段):
- 在这个阶段,计算内存地址。
- 执行:
- 通过将寄存器
R2
中的值与偏移量100
相加,计算出内存地址。
- 结果存储在
RZ
寄存器中。
- 通过将寄存器
- 在这个阶段,计算内存地址。
- 阶段 4(内存访问阶段):
- 在这个阶段,访问内存。
- 执行:
- 使用计算出来的内存地址
RZ
访问内存。
- 将从内存读取的数据存储到
RY
中。
- 使用计算出来的内存地址
- 控制信号:
Y_select = 01
(选择从内存读取的数据)。
- 在这个阶段,访问内存。
- 阶段 5(写回阶段):
- 在这个阶段,写回寄存器。
- 执行:
- 将内存读取到的数据存储到寄存器
R4
中。
- 将内存读取到的数据存储到寄存器
- 控制信号:
RF_write = 1
(允许向寄存器文件写数据)。
- 在这个阶段,写回寄存器。
控制信号解释:
- B_select = 1:表示在第 3 阶段,ALU
的第二个输入是立即数(
100
),或者是偏移量,而不是寄存器值。 - Y_select = 01:在第 4 阶段,选择内存读取的数据作为 Y 输入。
- RF_write = 1:在第 5
阶段,表示将数据写入寄存器文件,通常是把从内存读取的值写入目标寄存器(在本例中是
R4
)。