首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >《计算机组成原理》第 9 章 - 控制单元的功能

《计算机组成原理》第 9 章 - 控制单元的功能

作者头像
啊阿狸不会拉杆
发布2026-01-21 11:36:00
发布2026-01-21 11:36:00
1020
举报

🔍 9.1 微操作命令的分析

🔹 9.1.1 取指周期

功能:从内存中取出指令并送入指令寄存器(IR)。 核心微操作

  • PC 内容送地址总线(MAR)
  • 发读命令(Memory Read)
  • 内存数据送数据总线(MDR)→ IR
  • PC 自动加 1

Java 代码示例:取指周期模拟

代码语言:javascript
复制
/**
 * 模拟取指周期操作
 */
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;
    }
}

流程图位置

🔹 9.1.2 间址周期

功能:处理指令中的间接寻址,获取操作数真实地址。 核心微操作

  • MDR 内容送 MAR(间接地址→MAR)
  • 发读命令(读取操作数地址)
  • 内存数据送 MDR(真实地址→MDR)

Java 代码示例:间址周期模拟

代码语言:javascript
复制
/**
 * 模拟间址周期操作
 */
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
    }
}

流程图位置

🔹 9.1.3 执行周期

功能:根据指令操作码执行具体运算或逻辑操作。 案例:加法指令(ADD R1, R2) 微操作

  • R1 内容送 ALU
  • R2 内容送 ALU 并执行加法
  • 结果送 R1

Java 代码示例:执行周期模拟

代码语言:javascript
复制
/**
 * 模拟执行周期(加法指令)
 */
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;
    }
}

流程图位置

🔹 9.1.4 中断周期

功能:响应中断请求,保存断点并转入中断服务程序。 核心微操作

  • PC→内存(保存当前程序计数器)
  • 中断服务程序入口地址→PC

Java 代码示例:中断周期模拟

代码语言:javascript
复制
/**
 * 模拟中断周期操作
 */
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 + ")");
    }
}

流程图位置

🚀 9.2 控制单元的功能

🔹 9.2.1 控制单元的外特性

输入信号

  • 时钟信号(Clock)
  • 指令操作码(OP Code)
  • 中断请求(IRQ)
  • 状态信号(如 ZF 标志位)

输出信号

  • 内存读写命令(Read/Write)
  • 寄存器控制信号(如 RegWrite)
  • 总线控制信号(如 BusEnable)
🔹 9.2.2 控制信号举例

信号名称

功能描述

示例场景

PCOut

允许 PC 内容输出到总线

取指周期 PC→MAR

IRWrite

允许数据写入指令寄存器

取指周期 MDR→IR

MemRead

内存读命令

取指周期读取指令

ALUOp

控制 ALU 运算类型(加法 / 减法等)

执行周期加法指令

代码关联: 在前面的 Java 示例中,FetchCycle类的execute()方法隐含了PCOutIRWrite等控制信号逻辑。

🔹 9.2.3 多级时序系统

三级时序结构

  1. 机器周期(CPU 周期):完成一个基本操作的时间(如取指周期)
  2. 节拍电位(时钟周期组):机器周期内的分段时序(如取指周期分为 4 个节拍)
  3. 节拍脉冲(时钟周期):最小时间单位

Java 模拟思路

代码语言:javascript
复制
// 简化的时序系统类
public class TimingSystem {
    private int machineCycle; // 机器周期计数器
    private int beat; // 节拍计数器

    public void nextCycle() {
        machineCycle++;
        beat = 0; // 每个机器周期重置节拍
    }

    public void nextBeat() {
        beat++;
    }
}
🔹 9.2.4 控制方式
1. 同步控制方式
  • 所有操作由统一时钟信号控制
  • 优点:时序简单,易于设计
  • 缺点:效率低(复杂操作需等待最长时钟周期)
2. 异步控制方式
  • 操作由事件驱动,无统一时钟
  • 优点:效率高(按需分配时间)
  • 缺点:设计复杂,需处理异步信号
3. 联合控制方式
  • 核心操作同步控制,复杂操作异步扩展
  • 示例:取指周期同步,I/O 操作异步

💡 总结

控制单元是计算机的 “指挥中心”,通过微操作命令与时序系统协调硬件运行。建议读者结合示例代码动手调试,重点理解不同周期的微操作序列及时序逻辑。如需进一步探讨 CPU 设计,可关注后续章节的硬布线控制与微程序控制内容。

希望这篇帖子能帮助您系统掌握控制单元核心知识!欢迎在评论区交流学习心得~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔍 9.1 微操作命令的分析
    • 🔹 9.1.1 取指周期
    • 🔹 9.1.2 间址周期
    • 🔹 9.1.3 执行周期
    • 🔹 9.1.4 中断周期
  • 🚀 9.2 控制单元的功能
    • 🔹 9.2.1 控制单元的外特性
    • 🔹 9.2.2 控制信号举例
    • 🔹 9.2.3 多级时序系统
    • 🔹 9.2.4 控制方式
      • 1. 同步控制方式
      • 2. 异步控制方式
      • 3. 联合控制方式
  • 💡 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档