目录
10.1 组合逻辑设计
组合逻辑控制单元通过硬连线逻辑实现指令操作控制,适用于简单指令系统。其核心是根据当前指令、状态信号和时序信号生成固定的控制信号序列。
10.1.1 组合逻辑控制单元框图
组合逻辑控制单元结构框图
10.1.2 微操作的节拍安排
微操作需按 CPU 周期(机器周期)和节拍电位 / 脉冲进行时序划分。假设采用四节拍模型(T0-T3),示例如下:
// 假设CPU周期为4个节拍,每个节拍处理不同微操作
public class TimingUnit {
private int currentCycle; // 当前机器周期
private int currentBeat; // 当前节拍(0-3)
// 生成节拍信号
public void generateBeatSignal() {
switch (currentBeat) {
case 0: // 节拍1:取指令操作码
System.out.println("T0: 从IR中提取操作码");
break;
case 1: // 节拍2:计算操作数地址
System.out.println("T1: 地址计算逻辑工作");
break;
case 2: // 节拍3:执行数据读写
System.out.println("T2: 存储器/IO读写控制");
break;
case 3: // 节拍4:结果回写与状态更新
System.out.println("T3: 运算结果写入寄存器");
break;
default:
throw new IllegalArgumentException("无效节拍");
}
}
}
10.1.3 组合逻辑设计步骤
- 确定指令集微操作:列出每条指令的微操作序列(如 ADD 指令需取指、取源操作数、运算、存结果)。
- 分配时序节拍:为每个微操作指定执行的节拍(如取指固定在 T0-T1)。
- 逻辑表达式推导:根据微操作与指令码 / 状态 / 节拍的关系,写出控制信号逻辑式(如
ALU_op = (IR_op==ADD) && (T==T2)
)。 - 电路实现:用门电路、编码器等搭建硬连线逻辑。
10.2 微程序设计
微程序控制将控制逻辑存储为微指令序列,通过读取微程序实现动态控制,灵活性远超组合逻辑。
10.2.1 微程序设计思想的产生
由英国剑桥大学 M.V.Wilkes 提出,核心思想:将每条机器指令拆解为若干微指令,存储在控制存储器中,通过微指令计数器(μPC)顺序执行。
10.2.2 微程序控制单元框图及工作原理
微程序控制单元工作流程
10.2.3 微指令的编码方式
1. 直接编码(水平型)
微命令字段每位独立表示一个控制信号,无需译码,执行速度快但编码长度长。
// 直接编码示例:32位微指令,每位对应一个控制信号
public class DirectEncodingMicroinstruction {
private boolean regWrite; // 寄存器写(第0位)
private boolean memRead; // 存储器读(第1位)
private boolean aluAdd; // ALU加法(第2位)
// ... 其他30个控制信号
}
2. 字段间接编码
字段内部分位组合表示微命令,需通过字段译码器解析。
// 字段间接编码示例:3位ALU操作字段(000-111对应8种操作)
public class IndirectEncodingMicroinstruction {
private int aluOpCode; // 3位字段,0-7表示加法/减法/逻辑与等
private boolean memOp; // 1位存储器操作(读/写)
public String getAluOperation() {
String[] ops = {"加法", "减法", "逻辑与", "逻辑或", "移位", "比较", "取反", "直通"};
return ops[aluOpCode];
}
}
10.2.4 微指令序列地址的形成
- 顺序执行:
μPC = μPC + 1
- 条件转移:根据状态标志(如 ZF=1 时跳转)
// 条件转移逻辑示例
public class MicroPC {
private int currentAddress;
private boolean zf; // 零标志
public int nextAddress(boolean isConditional, int targetAddress) {
if (isConditional && zf) { // 条件满足时跳转
return targetAddress;
} else { // 顺序执行或无条件跳转
return currentAddress + 1;
}
}
}
10.2.5 微指令格式
典型格式:
微命令字段 | 判别测试字段 | 下地址字段 |
---|---|---|
控制信号输出 | 条件判断依据 | 下条微指令地址 |
10.2.6 静态微程序设计和动态微程序设计
- 静态:微程序固化在 ROM 中,不可修改(如早期 CPU)。
- 动态:微程序存储在可写存储器(如 EEPROM),支持程序运行中修改(如微程序动态加载升级)。
10.2.7 毫微程序设计(分级微程序)
引入两级微程序:
- 垂直型微指令:用于控制基本操作(如寄存器传输)。
- 水平型微指令:用于解析垂直微指令,生成具体控制信号。
10.2.8 串行微程序控制和并行微程序控制
类型 | 特点 |
---|---|
串行 | 微指令按顺序执行,下一条微指令需等待前一条完成(控制简单,速度慢)。 |
并行 | 允许同时执行多个微操作(如同时读写寄存器和启动 ALU),需复杂时序控制。 |
10.2.9 微程序设计举例:ADD 指令执行流程
ADD 指令微程序流程图
微指令代码示例(简化版)
// 控制存储器模拟(存储微指令序列)
public class ControlMemory {
private Microinstruction[] cmemory;
public ControlMemory() {
// 初始化ADD指令微程序(假设地址0-3)
cmemory = new Microinstruction[4];
// 0号微指令:取指令(PC→MAR,读存储器)
cmemory[0] = new Microinstruction(
"regWrite=0, memRead=1, aluOp=0", // 控制信号
0, // 无测试条件,顺序执行
1 // 下地址1
);
// 1号微指令:译码(IR→操作码寄存器)
cmemory[1] = new Microinstruction(
"regWrite=1, memRead=0, aluOp=0",
"opCodeTest", // 测试操作码
2 // 操作码为ADD时跳转至2,否则跳转至其他地址
);
// 2号微指令:取源操作数(R1→ALU)
cmemory[2] = new Microinstruction(
"regRead=R1, aluOp=LOAD_A",
0,
3
);
// 3号微指令:执行加法(ALU=ADD,结果→R2)
cmemory[3] = new Microinstruction(
"aluOp=ADD, regWrite=R2",
0,
0 // 返回取指周期
);
}
}
// 微指令类
class Microinstruction {
String controlSignals; // 控制信号字段
String testCondition; // 判别测试字段
int nextAddress; // 下地址字段
public Microinstruction(String ctrl, String test, int nextAddr) {
this.controlSignals = ctrl;
this.testCondition = test;
this.nextAddress = nextAddr;
}
}
📌 总结对比
设计方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
组合逻辑控制 | 速度快、无需存储 | 灵活性差、修改困难 | 简单指令集、高性能 CPU |
微程序控制 | 可编程性强、易维护 | 存在取微指令开销 | 复杂指令集、可扩展架构 |
📚 扩展资源
- 推荐教材:《计算机组成原理(第 2 版)》唐朔飞
- 仿真工具:Logisim(组合逻辑设计)、MARS MIPS Simulator(微程序模拟)
如需进一步探讨具体实现细节,欢迎在评论区留言!🚀