从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

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

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

    • Spring基础
  • 主流框架

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

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

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

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

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

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

    • Spring基础
  • 主流框架

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

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

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

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 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-控制信号的集成
      • 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

  • 计算机网络

  • 数据库

  • 编程工具

  • 装机

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

403-乘法器的优化 1

# 403-乘法器的优化 1

计算机的最大优势在于它的运算速度。因此,当我们设计计算机当中的一个功能部件时 在保证其功能正确性的前提下,就得考虑,它是否拥有足够好的性能。那么在这一节,我们就要一起对这个乘法器,进行性能上的分析和优化。

‍

首先,我们来快速回顾一下 N 位乘法器的工作流程。 当我们做好初始化工作之后,首先检查“乘数寄存器”的最低位 如果最低位为 1,那么就将“被乘数寄存器”和“乘积寄存器” 的内容相加,并将结果放入到“乘积寄存器”当中。 那么这一步实际上是控制逻辑给出了若干个控制信号,包括让加法器完成加法运算,并给了“乘积寄存器”写入的控制信号。 因为加法器的输出是连接到“乘积寄存器”的输入端的,所以在下一个时钟上升沿来临的时候,“乘积寄存器”就会对加法器的输出进行采样,并保存起来, 这就完成了这一步所指的工作。

然后控制逻辑会向“被乘数寄存器”发出“左移”的控制信号 ,在下一个时钟上升沿来临的时候,“被乘数寄存器”就会完成左移一位的工作。 当然,如果在第一步中检查的“乘数寄存器”的最低位是 0 ,那控制逻辑就不会给出让加法器进行运算,和让“乘积寄存器”进行写入的控制信号 ,而会进入到第二步,完成“被乘数寄存器”左移的工作。

再到下一个时钟上升沿,“乘数寄存器”会发现其右移的控制信号有效,所以它就完成一次右移的工作。 然后判断是否已经到了第 N 次循环,如果没有,说明运算还没有结束, 再回到第 1 步继续执行;如果发现已经是第 N 次循环,说明运算已经完成 运算的结果就在当前的“乘积寄存器”当中。 ​

我们分析这个工作流程,我们可以发现第 1a 步执行这个加法 我们需要一个时钟周期,第 2 步的左移又需要一个时钟周期 第 3 步的右移还需要一个时钟周期。 因此这个乘法器工作时,每执行一轮,都需要 3 个时钟周期 那如果是一个 32 位的乘法器,那就大约需要 100 个时钟周期。 我们来想一想有没有优化的办法。

​

首先,我们很容易想到的优化,就是刚才 说的这些加法和移位的操作,是否能够并行起来。 虽然我们在介绍流程时这些步骤是一步一步进行的,这样只是便于我们理解。 在实际的实现上,它们并不需要一定有一个先后的顺序。 因此,问题就在于我们的实现结构能否支持让这些加法和移位并行操作。 我们知道,寄存器的内容只会在时钟上升沿来临的时候发生变化 而在其他时候,无论输入端如何变化,寄存器的内容都不会发生变化。 因此,我们就用这个乘法器的当前状态为例,进行分析。 假设现在时钟上升沿还没有来临,那“被乘数寄存器”的输出就是它当前所保存的内容 00001000,这八位信号会被送到加法器的输入端,而加法器的另一个输入端 连接的是“乘积寄存器”的输出端,因此,现在的信号值是全 0。 而当前“乘积寄存器”的最低位为 1,控制逻辑会据此 产生相关的控制信号,包括让加法器进行加法运算 ,这样加法器就会产生对应的运算结果。 与此同时,控制逻辑还会给出写输入信号 ,但是现在时钟上升沿还没有来,所以“乘积寄存器”其实什么也不会做。 那我们注意,在这个时候,控制逻辑实际上可以同时给出“被乘数寄存器”的移位信号 ,还可以给出“乘数寄存器”的移位信号。 那现在,控制逻辑就将刚才流程图当中的第 1a 步 ,第 2 步和第 3 步所对应的控制信号都置为有效了。 但是因为时钟上升沿还没有来,所以这些寄存器的内容都不会发生变化。

​ ‍

那么当时钟上升沿到来的时候,这些寄存器就会根据输入改变其内容。 “乘积寄存器”会将输入端的数保存起来,“被乘数寄存器” 会向左移动一位,“乘数寄存器“会向右移动一位。 而这些操作都是在同一个时钟上升沿到来的时候完成的。 请注意,我们现在假设这个时钟上升沿来了,注意观察这 3 个寄存器 它们是同时发生变化的。 而且根据我们对寄存器的了解,我们已经知道,在时钟上升沿之后很短的一个时间,寄存器所改变的内容就会传送到输出端。

因此我们可以注意到,”被乘数寄存器“的内容现在已经改变,因此很快,它的输出也会变成 0001 0000,并传递到加法器。 但是我们可以放心的是,即使这个信号经过了加法器,并产生了新的运算结果,这个运算结果也不会改变”乘积寄存器“的内容。 因为等这个信号传递到了”乘积寄存器“的输入端时,已经过去了一段时间,这时候”乘积寄存器“对输入端的采样工作已经完成,其输入端信号的改变不会影响这个寄存器的内容了。 这样我们就在同一个时刻完成了所有的加法和移位的操作。

​ ‍

那我们再回到刚才的那个流程图。 在这个流程图当中,这 3 个顺序执行的操作就可以进行优化 ,而我们这 32 位的乘法,也就不应该再需要 100 个时钟周期了。 经过优化以后的工作流程,在最开始的第 1 步,和最后的第 4 步,还是跟原来一样的。 而中间的这 3 步,我们可以把它并排地放在一起。 当第 1 步检查”乘数寄存器“的最低位,如果最低位是 1 的时候 第 1a 步、第 2 步和第 3 步将同时进行 。如果最低位为 0,则通过控制信号的不同,不执行第 1a 步,而同时执行第 2 步和第 3 步,完成之后,就直接进入第 4 步。 这样我们每一次循环只需要一个周期 ,我们用这个很简单的优化,就把性能提升为了之前的 3 倍。 这样我们就有了一个速度更快的乘法器。

​

现在,我们已有了一个经过优化后的乘法器了。当然,这个乘法器其实还有很大的性能提升空间。比如说,对于乘法运算,每一个中间结果实际上不需要依赖其他的中间结果的运算,那我们可不可以把所有的中间结果一次性都算出来? 然后再将这些中间结果进行相加,而不要经过一轮又一轮的迭代,这样是不是可以更好地提升性能呢?至于具体怎么做,就留给你自己分析吧

上次更新: 2025/6/3 17:50:46
402-乘法器的实现
404-乘法器的优化 2

← 402-乘法器的实现 404-乘法器的优化 2→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式