多周期数据路径和控制
概述:
多周期数据路径将指令分解为单独的步骤。它减少了平均教学时间。每个步骤需要一个时钟周期 每个功能单元可以在一条指令中多次使用,只要它在不同的时钟周期中使用即可。它减少了所需的硬件数量。
(一) 取指令:
通过向存储器提供相应给定指令的地址,将存储在存储器中的指令取出到CPU的控制单元中。
- 假设每条指令都存储在一个字中,每个字有 4 个字节,所以我们可以在这里声明内存是字节可寻址的。
- 我们知道,程序计数器(PC)包含下一条指令的地址。
IR <= [[PC]] , PC <= [PC] + 4
(二)解码(解释指令):
处理器的控制单元对指令进行解码,以便找到执行相应指令所需的操作序列。
- 读取操作码以确定指令的类型和字段长度。
- 然后,从所有必要的寄存器中读入数据。
例子:
A <= Reg [IR [25:21]]; // Register rs in opcode (instruction part)
B <= Reg [IR [25:21]]; // Register rt in opcode (instruction part)
(III) 执行、内存地址计算或分支指令:
例子 :
Memory Reference : ALUout <= A + sign-extend ( IR[15:0] )
Branch : if (A == B) PC <= ALUout // Conditional , it will calculate PC= Register + Branch Address
Jump : PC <= PC [ 31:28 ] . ( IR [25 : 0] << 2 ) //// unconditional
(IV) 内存存取/R型指令完成步骤:
例子 :
Memory Reference: MDR <= Memory [ALUout ]; // LOAD or Memory [ALUout ] <= B; // Store from register to memory
Arithmetic Logic Instruction (R-type) : Reg [ IR[15:11]] <= ALUout ; // register destination in opcode
(V) 内存读取完成步骤(寄存器写入):
- 大多数指令将某些计算的结果写入寄存器。
- 示例:算术、逻辑、移位、负载等。负载:Reg [ IR [20:16]] <= MDR
- 存储、分支、跳转最后不写入寄存器,它们保持空闲。
例子 :
Q1。找到数据路径和控制(执行序列)的阶段
添加R1,R2,R3;
这意味着 R3 <– R1 + R2
解决方案:给出指令 – 添加 R3、R1、R2;
- 阶段 1:获取指令并增加程序计数器。
- 第 2 阶段:解码以确定它是 ADD 指令,并读取寄存器 R1 和 R2。
- 第 3 阶段:添加在第 2 阶段检索到的相应两个值。
- 第 4 阶段:空闲(没有内容可写入内存)
- 阶段 5:将阶段 3 的结果写入寄存器 R3。
Q2。找到数据路径和控制(执行序列)的阶段
移动 30 (R1), R2;
这意味着 [30 + R1] <– R2
解决方案:给定指令 – MOV 30 (R1), R2;
- 阶段 1(取指):取指令并增加程序计数器。
- 第 2 阶段(解码):解码找到相应的指令是 MOV 和,读取寄存器 R1 和 R2
- 第 3 阶段(执行):将 30 加到相应寄存器 R1 中的值。
- 第 4 阶段(内存访问):将寄存器 R2 中的值写入在第 3 阶段计算的内存地址。
- 第 5 阶段(寄存器写入):这一步是空闲的(寄存器中没有写入内容)