

功能:从内存中取出指令并送入指令寄存器(IR)。 核心微操作:
Java 代码示例:取指周期模拟
/**
* 模拟取指周期操作
*/
public class FetchCycle {
private int pc; // 程序计数器
private int mar; // 存储器地址寄存器
private int mdr; // 存储器数据寄存器
private int ir; // 指令寄存器
// 取指周期执行方法
public void execute() {
// 1. PC内容送MAR
mar = pc;
System.out.println("取指周期:PC(" + pc + ") → MAR(" + mar + ")");
// 2. 发读命令(模拟内存读取)
mdr = simulateMemoryRead(mar); // 假设内存返回指令码
System.out.println("取指周期:内存读取数据 → MDR(" + mdr + ")");
// 3. MDR数据送IR
ir = mdr;
System.out.println("取指周期:MDR(" + mdr + ") → IR(" + ir + ")");
// 4. PC自动加1(假设指令占1字长)
pc += 1;
System.out.println("取指周期:PC自增 → PC(" + pc + ")");
}
// 模拟内存读取(简化逻辑)
private int simulateMemoryRead(int address) {
// 假设地址0存储指令码0x1234(示例数据)
return (address == 0) ? 0x1234 : 0;
}
}流程图位置:

功能:处理指令中的间接寻址,获取操作数真实地址。 核心微操作:
Java 代码示例:间址周期模拟
/**
* 模拟间址周期操作
*/
public class IndirectCycle {
private int mdr; // 存储器数据寄存器(存储间接地址)
private int mar; // 存储器地址寄存器
private int memory[] = new int[1024]; // 模拟内存(简化)
// 间址周期执行方法(假设MDR已存间接地址)
public int execute() {
// 1. MDR→MAR(间接地址→地址总线)
mar = mdr;
System.out.println("间址周期:MDR(" + mdr + ") → MAR(" + mar + ")");
// 2. 发读命令(读取操作数真实地址)
int realAddress = memory[mar];
System.out.println("间址周期:内存读取真实地址 → MDR(" + realAddress + ")");
return realAddress; // 返回操作数真实地址
}
// 初始化内存(示例数据:地址100存储间接地址200)
public void initMemory() {
memory[100] = 200; // 间接地址指向200
}
}流程图位置:

功能:根据指令操作码执行具体运算或逻辑操作。 案例:加法指令(ADD R1, R2) 微操作:
Java 代码示例:执行周期模拟
/**
* 模拟执行周期(加法指令)
*/
public class ExecuteCycle {
private int[] register = new int[4]; // 模拟寄存器R0-R3
private ALU alu = new ALU(); // 算术逻辑单元
// 执行加法指令(ADD dst, src)
public void executeAdd(int dst, int src) {
int op1 = register[dst];
int op2 = register[src];
int result = alu.add(op1, op2); // 调用ALU加法功能
register[dst] = result;
System.out.println("执行周期:R" + dst + "(" + op1 + ") + R" + src + "(" + op2 + ") → R" + dst + "(" + result + ")");
}
// 初始化寄存器(示例:R1=5, R2=3)
public void initRegisters() {
register[1] = 5;
register[2] = 3;
}
}
// ALU类(简化实现)
class ALU {
public int add(int a, int b) {
return a + b;
}
}流程图位置:

功能:响应中断请求,保存断点并转入中断服务程序。 核心微操作:
Java 代码示例:中断周期模拟
/**
* 模拟中断周期操作
*/
public class InterruptCycle {
private int pc; // 程序计数器
private int[] memory = new int[1024]; // 模拟内存(保存断点)
private final int INTERRUPT_VECTOR = 0x100; // 中断向量地址
// 中断周期执行方法
public void execute() {
// 1. 保存当前PC到内存(假设内存地址0存储断点)
memory[0] = pc;
System.out.println("中断周期:PC(" + pc + ") → 内存[0]");
// 2. 加载中断服务程序入口地址到PC
pc = INTERRUPT_VECTOR;
System.out.println("中断周期:PC←中断向量(" + INTERRUPT_VECTOR + ")");
}
}流程图位置:

输入信号:
输出信号:
信号名称 | 功能描述 | 示例场景 |
|---|---|---|
PCOut | 允许 PC 内容输出到总线 | 取指周期 PC→MAR |
IRWrite | 允许数据写入指令寄存器 | 取指周期 MDR→IR |
MemRead | 内存读命令 | 取指周期读取指令 |
ALUOp | 控制 ALU 运算类型(加法 / 减法等) | 执行周期加法指令 |
代码关联:
在前面的 Java 示例中,FetchCycle类的execute()方法隐含了PCOut和IRWrite等控制信号逻辑。
三级时序结构:
Java 模拟思路:
// 简化的时序系统类
public class TimingSystem {
private int machineCycle; // 机器周期计数器
private int beat; // 节拍计数器
public void nextCycle() {
machineCycle++;
beat = 0; // 每个机器周期重置节拍
}
public void nextBeat() {
beat++;
}
}控制单元是计算机的 “指挥中心”,通过微操作命令与时序系统协调硬件运行。建议读者结合示例代码动手调试,重点理解不同周期的微操作序列及时序逻辑。如需进一步探讨 CPU 设计,可关注后续章节的硬布线控制与微程序控制内容。
希望这篇帖子能帮助您系统掌握控制单元核心知识!欢迎在评论区交流学习心得~