从 01 开始 从 01 开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • 数据库
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Node
  • Windows 使用技巧
  • 最全面的输入法教程
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 各大平台
  • 远程控制
  • RSS
  • 图片类工具
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 电影

    • 电影推荐
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 反腐
  • GFW
  • 404 内容
  • 审查与自我审查
  • 互联网
  • 2022
  • 2023
  • 2024
  • 2025
  • 关于本站
  • 关于博主
  • 网站动态
  • 公告栏
  • 友人帐
  • 从零开始搭建一个博客
  • 搭建邮件服务器
  • 本站分享
  • 文章分类
  • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • 数据库
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Node
  • Windows 使用技巧
  • 最全面的输入法教程
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 各大平台
  • 远程控制
  • RSS
  • 图片类工具
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 电影

    • 电影推荐
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 反腐
  • GFW
  • 404 内容
  • 审查与自我审查
  • 互联网
  • 2022
  • 2023
  • 2024
  • 2025
  • 关于本站
  • 关于博主
  • 网站动态
  • 公告栏
  • 友人帐
  • 从零开始搭建一个博客
  • 搭建邮件服务器
  • 本站分享
  • 文章分类
  • 文章归档
  • 计算机历史

  • 数字电路

  • 计算机组成原理

    • 网课-计算机组成原理(北大-陆俊林)

      • 概述-计算机组成原理(北大-陆俊林)
      • 第1周-计算机组成章节视频简介
      • 101-电子计算机的兴起
      • 102-冯·诺依曼结构的要点
      • 103-冯·诺依曼结构的小故事
      • 104-计算机结构的简化模型
      • 105-计算机执行指令的过程
      • 106-计算机输入和输出
      • 107-冯诺依曼结构和具体实现
      • 201-设计自己的计算机
      • 202-x86 体系结构
      • 203-x86 指令简介
      • 204-复杂的 x86 指令举例
      • 205-MIPS 体系结构
      • 206-MIPS 指令简介
      • 301-算术运算和逻辑运算
      • 302-门电路的基本原理
      • 303-寄存器的基本原理
      • 304-逻辑运算的实现
      • 305-加法和减法的实现
      • 306-加法器的优化
      • 401-乘法的运算过程
      • 402-乘法器的实现
      • 403-乘法器的优化 1
      • 404-乘法器的优化 2
      • 405-除法的运算过程
      • 406-除法器的实现
      • 407-除法器的优化
      • 501-处理器的设计步骤
      • 502-数据通路的建立
      • 503-运算指令的控制信号
      • 504-访存指令的控制信号
      • 505-分支指令的控制信号
      • 506-控制信号的集成
        • 以 add 指令为例
        • 小结
      • 601-流水线的基本原理
      • 602-流水线的优化
      • 603-超标量流水线
      • 604-流水线的冒险
      • 605-数据冒险的处理
      • 606-控制冒险的处理
      • 701-存储层次结构概况
      • 702-DRAM 和 SRAM
      • 703-主存的工作原理
      • 704-主存技术的发展
      • 705-高速缓存的工作原理
      • 706-高速缓存的组织结构
      • 707-存储容量的计算
      • 801-中断和异常的来源
      • 802-中断向量表的结构
      • 803-中断向量表的发展
      • 804-中断的处理过程
      • 805-内部中断分类说明
      • 806-基于中断的功能调用
      • 901-输入输出接口的基本功能
      • 902-输入输出接口的编址方式
      • 903-输入输出的控制方式
      • 904-中断控制方式
      • 905-外部中断的处理过程
      • 906-直接存储器访问方式
  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 计算机小知识

  • 数据库

  • 计算机基础
  • 计算机组成原理
  • 网课-计算机组成原理(北大-陆俊林)
2023-06-13
目录

506-控制信号的集成

# 506-控制信号的集成

自己设计出一个处理器是一件非常有意义的工作, 那现在,我们离这个工作的目标只差最后一点点了, 而最后的这一步,又是非常关键的, 那就是把我们之前所产生的这些控制信号集成起来, 并且,让这个处理器能够自动地工作。

‍

现在我们已经分析完了这个事例的指令系统中所有的指令, 我们也知道了每一条指令应该设置怎么样的控制信号, 因此,我们现在就已经完成了这 5 个设计步骤当中的第 4 步, 接下来我们要做的就是考虑如何集成这些控制信号,形成完整的控制逻辑。

​

‍

那我们先把之前的数据通路中的实现细节隐藏起来,就由一个方框来表示,那控制这个数据通路正常运转的控制信号,一共有这样 8 个, 那这些控制信号是怎么产生的呢?还是要从来自指令存储器的指令编码开始说起。 之前,我们已经从指令编码当中提取了若干的信号,作为数据通路的输入, 但我们只要回忆一下指令格式就可以知道,还有两个位域,我们没有提及, 这就是 opcode 和 function,而正是这两个位域,是用来表明指令执行什么样的操作。 因此,我们正是需要用这两个信号,来产生下面这些控制信号,实现这一部分功能的电路,就被称为控制逻辑, 也就是我们之前提到的控制器。

​

# 以 add 指令为例

要想知道控制逻辑是怎么实现的,我们还是先来看一个例子。 我们以 add 指令为例,当我们取回一条指令的编码,如果是一条 add 指令,那它所需要 执行的操作就是这两个,一是将两个寄存器当中的数相加,并保存到另一个寄存器当中, 然后就将 PC+4 更新到 PC 寄存器当中。 对于这条指令所需要的各个控制信号的值,我们之前也已经详细分析过。

例如,这个 RegDst 信号应该为 1,而 RegWr 信号也应该为 1, 又比如,这个 MemtoReg 信号应该为 0。

​

‍

那我们把这些信号的值都摘出来,汇总成一张表格, 在这张表中,就是执行这条 add 指令时,各个控制信号的值,而 add 指令对应的 opcode 域的值和 function 域的值,我们也列在上面。那用 同样的方法,我们也可以列出减法指令所对应的所有控制信号的值, 以及其他指令各自对应的控制信号的值。 这样,我们就得到了一张完整的表格,描述了每条指令和每个控制信号之间的关系。 那刚才我们是用一列一列的方式得到了这张表格

​

‍

然后我们换一个角度来看,如果按行来看,那我们就可以得到每一个控制信号的逻辑表达式, 我们就以第一行这个 RegDst 信号为例, 那从这一行可以看出,只有当前指令是加法或者减法指令时, 这个控制信号才需要为 1,其他时候都为 0,就可以了。 那我们可以把这个控制信号的逻辑表达式写出来, 如果我们有一根信号标明现在是加法指令,即为 add, 另有根信号标明现在是减法指令,即为 sub, 那这个 RegDst 的控制信号就等于 add 和 sub 这两个信号进行或操作。

那我们还得进一步分析,add 和 sub 这两个信号应该如何生成。 那我们先来看 add 指令的编码,add 指令是一条 R 型指令, 根据 R 型指令的位域划分,其 opcode 域都应该为 0,而 function 域则指明了在 R 型指令当中,这细分的指令类别。因此,对于 I 的指令来说, 就是 opcode 域为全 0,而 function 域的第 0 位到第 4 位为 0, 第 5 位为 1。这样一种信号的组合就代表了当前指令是 add 指令, 那我们就可以把 add 指令的逻辑表达式写出来。 我们先用一根 rtype 信号,来表示当前是一个 R 型的 指令,然后我们来看后面的信号,就是 function 域的第 5 位, 对于 add 指令来说,这一位应该为 1, 而 function 的第 4 位,一直到第 0 位,都应该为 0, 所以我们将 function 0 到 4,每一位都先取非, 然后与 function 域的第 5 位,以及这个 rtype 信号,一起进行与操作, 这样就可以得到了 add 信号。

我们用类似的方法也可以得到 sub 这个信号。 那么 rtype 这个信号又是如何产生呢? 这非常地简单,因为 R 型指令就是 opcode 全为 0, 所以我们只需要把 opcode 中的每一位都先取非,然后进行与操作, 那么当 opcode 全为 0 时,这个 rtype 信号就会为 1。

​

我们把这些逻辑表达式连起来,就可以得到了 RegDst 这个控制信号的逻辑表达式, 有了这样的逻辑表达式,我们就可以用与门和非门画出产生这个控制信号的电路图来, 这样,对于这一个控制信号来说,它的控制逻辑就已经是确定的了。

‍

‍

那我们用同样的方法还可以得到其他控制信号的逻辑表达式, 例如 ALUSrc 这个信号,我们通过查询刚才的表格,可以知道,它是在 ori 指令、load 指令和 store 指令,这三条指令执行时是有效的。 因此我们注意下面,我们只要用类似的方法得到 ori、load 和 store, 这三条指令对应的逻辑表达式,我们就可以得到 ALUSrc 这个控制信号的逻辑表达式了。

类似地,我们就可以得到所有控制信号的逻辑表达式。 那我们注意到,在下面这个区域,所有的信号都是来自指定的编码了, 而且,在对一些信号进行取非操作之后,这些逻辑表达式全都只有与操作,而上面这个区域的表达式都是在下面这些信号的基础上,进行了或操作,从而产生了最终的控制信号。

​

‍

因此,我们可以画出这样的一个控制器的示意图。 我们把指令编码中 opcode 的这六位和 function 的这六位连出来,先接到一组由与门构成的逻辑电路中。那么这一个逻辑电路就实现了上一页中,下面这片区域的那些表达式,从而产生了一组中间信号, 那么再将这些信号接入一组由或门组成的逻辑电路,这组逻辑电路就实现了上一页中上半部分那些逻辑表达式,

最后又可以得到了我们想要的所有的控制信号。那么这些逻辑电路就是我们刚才所提到的控制逻辑, 这样我们就有了控制器的实现。 在这样的电路实现下,我们固定地将取回指令的最高六位和最低六位,连接到控制逻辑中, 那经过了这些与门和或门之后,就会自动地生成对应的控制信号, 而这些控制信号的值,肯定符合我们刚才对每条指令分析的需求, 这样在指令执行的过程中,就不需要任何智力因素的介入, 去分析当前到底是什么指令,以及需要产生什么样的控制信号, 一切都是通过这样的控制逻辑电路自动生成的, 这样,处理器就能一条接一条地取回指令,自动地执行下去。

那好,现在我们已经完成了控制信号的集成,并形成了完整的控制逻辑电路, 这最后一步工作,我们也就已经完成了。

‍

# 小结

现在,我们已经完成了一个处理器结构设计的步骤了, 虽然这个处理器只是单周期的,而且也只支持 6 条指令, 非常地简单,但是它确实是一个可以使用的处理器了。 如果你有兴趣,还可以继续深入到物理设计的环节,把它真正地制造出来。

上次更新: 2024/9/29 12:08:10
505-分支指令的控制信号
601-流水线的基本原理

← 505-分支指令的控制信号 601-流水线的基本原理→

最近更新
01
2025 年 2 月记
02-28
02
最全面的浏览器教程-完结撒花
02-16
03
这个工具可以轻松搞到你的浏览器账户密码!
02-15
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式