【计算机组成 课程笔记】4.1 乘法器的硬件实现

news2024/11/28 0:59:21

 课程链接:

计算机组成_北京大学_中国大学MOOC(慕课)

4 - 1 - 401-乘法的运算过程(11-'33--)_哔哩哔哩_bilibili

乘法是比加减法更复杂的算数运算。小学的时候我们学习乘法,需要背一个九九乘法表。那么如果是计算机,又是如何实现乘法的呢?

1. 乘法的运算过程

我们回想一下手算乘法的过程。假设现在有两个数:2345 x 9876,首先我们要做的是最低位的乘法,5 x 6 = 30,这好像很简单,但其实这里蕴含了一个查询九九乘法表的操作。然后接着做下一步,4 x 6 = 24, + 进位3 = 27,以此类推,我们可以算出被乘数2345和乘数的最低位6的结果,14070。而这只是一个中间结果,即使是这一个中间结果,我们也进行了4次查表,4次加法运算,中间总共产生了4次进位输出。同样的中间结果我们一共有4个,最后把这4个中间结果加起来,才能得到最后的乘积。这样看来,乘法的运算实际上是非常繁琐的。

那么能不能不要这么繁琐?有没有比较简单的办法来解决问题?

想要找到简单的办法,我们不妨先来看一下简单的情况。我们找两个简单的数字:1000 x 1001。然后计算方法和上面是一样的,先拿乘数的最低位和被乘数的每一位相乘,得到1000,这是第一个中间结果。然后是乘数的第二位,也和被乘数的每一位相乘,从而得到了第二个中间结果0000。以此类推,得到4个中间结果,最后把这些中间结果加起来,就得到了最终的乘积。

对于这个例子,每个中间结果是怎么生成的呢?原则很简单,我们不用关心九九乘法表了,只用关心当前参与运算的乘数的位是不是1,如果是1,则直接将被乘数放置在与它对齐的位置上。如果是0,则直接将0放置在与它对齐的位置上。这样的运算过程就大大简化了。

但是十进制的数不可能只有0和1,上述例子对于十进制来说只是一种特殊情况。但是对于二进制来说,数字就是只有0和1,这时上面的运算方法就是通用的了。而这也正是计算机最终选择了二进制的一个重要的原因。

2. 一点历史

其实最开始的计算机也是使用十进制的,我们不妨回到二十世纪四十年代,去看两台我们非常熟悉的机器。左边这台就是ENIAC,它采用的就是十进制,右边这台是EDVAC,它采用的就是二进制。

ENIAC采用的是十进制,导致了它内部设计的电路非常复杂,而EDVAC采用了二进制后,就大大简化了控制逻辑。关于这一点,冯·诺依曼在他的报告中有详细的描述。

冯·诺依曼在《关于EDVAC的报告草案》中,对关于计算机应该采用什么样的进制进行了详细的分析,他主要说了这么几点:

关于电子计算机的更多历史,可以参看这篇博客:计算机组成_北京大学_中国大学MOOC(慕课)

3. 乘法器的硬件实现

我们还是以刚才的那个简单的例子来展示乘法器的实现结构。1000和1001都是4-bit的数,为此我们需要一个4-bit的乘法器。

首先我们需要一个寄存器来保存被乘数(Multiplicand),这里使用8位的寄存器,而且带有左移的功能,原因是在乘法过程中被乘数需要不断左移以实现和乘数位的对齐。

另外,这个保存被乘数的寄存器有一个左移的信号输入,当外部的控制逻辑将这个信号置为有效时,在下一个时钟上升沿到来的时候,被乘数寄存器当中的内容就会向左移动一位。

第二个寄存器是乘积寄存器(Product),这也是一个8位的寄存器,用来保存中间结果和运算的最终结果。

被乘数寄存器中的内容和乘积寄存器中的内容需要进行加法运算,这里我们需要一个8位的加法器。

另外我们还需要一个寄存器来保存乘数(Multiplier),这是一个4位的寄存器。乘数寄存器的最低位被连到了控制逻辑,控制逻辑据此来生成相关的控制信号,这些控制信号就包括是否要让加法器进行加法运算,以及是否要让乘积寄存器保存当前的计算结果,另外这个乘数寄存器还要有向右移位的功能,同样是由控制逻辑发出的控制信号来控制的。

现在我们就有了一个完整的乘法器,我们就来看一下这个乘法器是如何工作的。

0. 初始化

首先我们要做的是初始化,也就是对三个寄存器的内容进行设置。被乘数是1000,是1个4-bit的数,放到8-bit的寄存器中时,高4位置为0,为了便于区分,运算所得的数用粗体表示,填充的数用斜体表示。乘数寄存器很简单,4-bit的1001直接放到4-bit的寄存器中即可。然后是乘积寄存器,初始化为全0。

1. 加法运算

初始化结束后,就可以开始运算了。首先检查乘数寄存器的第一位,看是否为1。如果是1,则需要将被乘数寄存器中的内容和当前乘积寄存器中的内容相加。

在这一步,控制逻辑会控制加法器将两个输入进行加法运算,然后将加法器的运算结果送入乘积寄存器,在下一个时钟上升沿来临的时候,因为乘积寄存器的写入信号是有效的,所以它就会采样输入端的数据并保存到寄存器当中。这样在这个时钟上升沿之后,乘积寄存器中的内容就变成了00001000。

2. 对被乘数进行左移

在乘数的最低位的乘法完成后,为了为下一轮的计算做准备,我们需要对被乘数进行左移。控制逻辑会给出左移信号,在下一个时钟上升沿来临的时候,被乘数就会执行一次左移,变成00010000。

3. 对乘数进行右移

控制逻辑给出右移的控制信号到乘数寄存器,在下一个时钟上升沿来临的时候,乘数就会执行一次右移,变成0100。这样做是为了对乘数的最低位进行判断。在硬件上,如果要依次地对乘数从低位到高位进行逐位的判断,那就要用硬件来记住之前判断到了哪一位,那与其记住这样的信息,不如把乘数每次向右移一位,这样只需要每次判断乘数寄存器的最低位就可以了。而且对于乘数寄存器来说,低位使用过以后就不会再用了,所以可以丢弃。

4. 判断是否进行下一轮

控制逻辑进行判断,现在是否已经完成了运算。对于4位的乘法器来说,一共要进行4次循环。简单的计数对硬件来说是很容易的,所以控制电路可以很容易地判断出当前是否已经是第4次循环了。

如果不是最后一轮循环,那么我们就要进行下一轮。第二轮的运算方式和刚才是完全一样的,重复上面的1~4步。

如果是最后一轮,则结束。最终结果如下所示。

5. 总结

我们对上述乘法器的工作过程进行一个总结,流程图如下。

4. 乘法器的优化1

在保证乘法器功能正确性的情况下,我们再来考虑一下它的性能。

根据上面的工作流程图,我们来分析一下,进行1a步的加法,需要1个时钟周期,进行2,3步的左移,右移,各需要1个时钟周期,因此每进行1轮都需要3个时钟周期。那如果是一个32位的乘法器,则需要约100个时钟周期!我们得想一想有没有优化的办法。

首先我们很容易想到的优化,就是刚才说到的这些加法和移位的操作,能不能并行起来。是可以的。

我们知道在时钟上升沿到来之前,寄存器内容不会发生变化。因此,以当前状态为例,假设现在时钟上升沿还没有来临,那被乘数寄存器的输出就是它当前所保存的内容00001000,这8位信号会被送到加法器的输入端,而加法器的另一个输入连接的是乘积寄存器,现在的信号值是全0。而当前乘积寄存器的最低位为1,控制逻辑会据此产生相关的控制信号,让加法器进行加法运算,这样加法器就会产生对应的运算结果。与此同时,控制逻辑还会给出写的输入信号,但现在时钟上升沿还没有来,因此乘积寄存器中的值不会改变。

我们注意,这个时候,控制逻辑实际上可以同时给出被乘数寄存器和乘数寄存器的移位信号,这样现在控制逻辑就将刚才流程图上的第1a,2,3步的控制信号都置为有效了,但因为时钟上升沿还没有来,所以这些寄存器的内容都不会发生变化。

当时钟上升沿到来的时候,这些寄存器就会根据输入改变其内容。这样我们就在同一个时刻完成了加法和移位的操作。

经过上述优化后,工作流程变成了下图这样。这样每次循环只需要1个时钟周期,性能为又花钱的三倍。

5. 乘法器的优化2

当我们购买一台计算机时,不仅希望它的性能足够好,还希望它的价格足够低。那对于CPU这样的集成电路芯片来说,它的价格的一个重要因素就是其中晶体管的数量,或者说是芯片的面积。因此在我们设计各个功能部件的时候,如何减小芯片的面积,也是一个重要的优化方向。所以对于乘法器的优化,我们也来考虑一下有哪些不必要的硬件资源可以被省略。

首先我们来看被乘数寄存器,它是一个8-bit的寄存器,但实际其中的有效数字始终只有4位。那我们可能会说这是为了进行移位啊,移位是为了和乘积的中间结果进行对齐,然后进行运算,这就是这个乘法运算的要点之一啊。其实这是我们当时为了实现的简便所做出的选择。我们先不管这些,在这里用一个8位的寄存器来保存一个4位的数,这显然就是浪费了。

再来看一下乘数寄存器,乘数寄存器是4-bit的,看起来没有浪费。但是仔细想一想,这个寄存器里的有效数字每个周期都会减少1位,所以在运算的过程中,这个寄存器逐渐就出现了浪费的问题。

再来看一下乘积寄存器,最终的乘积确实需要8-bit来保存,但是问题在于,这个寄存器初始时有效数字只有4位,高4位是浪费的,而随着每个周期的运算,乘积寄存器的有效位数每周期会增加1位。

最后说到加法器,实际上每次参与运算的有效数字只有4位,因此并不需要8位的加法器。

好,现在我们就找到了4个浪费的点,那我们就来看一下如何优化。

然后,将上述的优化推广到N位乘法器,我们就得到了如下的结构:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息化发展18

存储技术 1 、存储分类 2 、常用存储模式的技术与应用对比: ( 1 ) 存储虚拟化( Storage Virtualization ) 是“ 云存储” 的核心技术之一。 它带给人们直接的好处是提高了存储利用率, 降低了存储成本, 简…

Python基础教程:内置函数之字典函数的使用方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片 len(字典名): 返回键的个数,即字典的长度 # len(字典名): # 返回键的个数,即字典的长度dic {a:123,b:456,c:789,d:567} pri…

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。

HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现。 HashMap相关问题 1、你用过HashMap吗?什么是HashMap?你为什么用到它?用过,HashMap是基于哈希表的Map接口的非同步实现, 它允许null键…

被车撞了!

买了新车之后,因为是新手司机上路,开了不到4个月,车身已经被划伤好多处了,有的是我自己不小心划的,有的是车在停车场,不知道被谁划伤的,找不到肇事者了。不过好在都是小小的划伤,不影…

微信小程序|基于小程序实现发送语音消息及转文字

此文主要在小程序内聊天的基础上实现语音发送及文字转换。 小程序账号创建及工具准备页面大体设计实现录音功能实现对话界面语音转换文字账号创建及应用申请实现语音转文字小程序 账号创建及工具准备 访问微信公众平台,点击账号注册。选择小程序,并在表单填写所需的各项信息…

两个线程并发(乱序)执行:乱箭穿心 std::thread

C自学精简教程 目录(必读) C并发编程入门 目录 在 创建2个线程并执行 创建10个线程并执行 中,我们已经看到了多个线程执行的顺序是没有任何保证的。 他们之间就是各自独立的同时在执行。 下面我们来看看两个线程同时往控制台打印信息,控制台会乱成什…

Blender插件:GLTF 2.0 导入/导出工具

推荐:使用 NSDT场景编辑器快速搭建3D应用场景 用法 glTF™(GL传输格式)用于3D模型的传输和加载 在 Web 和本机应用程序中。glTF 减小了 3D 模型的大小和 解包和呈现这些模型所需的运行时处理。 这种格式在网络上常用,并且在各种3…

COSCon'23 开源市集:共赴一场草坪上的开源派对

一年一度的开源盛会,第八届中国开源年会(COSCon23 ),将于10月28~29日,在四川成都市高新区菁蓉汇召开!本次大会的主题是:“开源:川流不息、山海相映”! 我们预期会有超过1…

腾讯云免费SSL证书申请流程_每年免费50个HTTPS证书

2023腾讯云免费SSL证书申请流程,一个腾讯云账号可以申请50张免费SSL证书,免费SSL证书为DV证书,仅支持单一域名,申请腾讯云免费SSL证书3分钟即可申请成功,免费SSL证书品牌为TrustAsia亚洲诚信,腾讯云百科分享…

构建知识库——一文解决跨平台科研文献及笔记同步问题

文章目录 需求及目标现有方案调研文献管理方案云存储方案Markdown编辑器Windows端Ipad端 图床管理方案 最终方案操作流程最后 作为一个十级懒人,要么躺着要么在探寻提效工具的路上。 开始打工生涯之后,除了正常工作时间,总想利用业余时间提升…

详解Vue中的render: h => h(App)

声明:只是记录,会有错误,谨慎阅读 我们用脚手架初始化工程的时候,main.js的代码如下 import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({// 把app组件放入容器中render: h > h(App), }).$mount(#ap…

PaddleNLP使用Vicuna

LLaMA 模型 LLaMa 是一个大型语言模型,由 Meta 开源。它的全称是 Large Language Model Meta AI,参数量从 70 亿到 650 亿不等。例如,130 亿参数的 LLaMA 模型在大多数基准上可以胜过参数量达 1750 亿的 GPT-3,而且可以在单块 V1…

Vue框架--Vue中的事件

1.事件处理 事件的基本使用: (1).使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名; (2).事件的回调需要配置在methods对象中,最终会在vm上; (3).methods中配置的函数,不要用箭头函数!否则this就不是vm了; (4).methods中配置的函数,都是被Vue所管理的函数,this的…

python 之import与from import 导入库的解析与差异

文章目录 1. **使用import导入整个模块**:2. **使用from import导入特定内容**:注意事项别名的使用 在Python中,import和from import是用于导入模块中内容的两种不同方式。下面详细介绍它们的用法和差异: 1. 使用import导入整个模…

python in excel 如何尝鲜 有手就行

众所周知,微软在8月下旬放出消息python已入驻excel,可到底怎么实现呢。 今天我就将发布python in excel的保姆级教程,开始吧! 获取office 365 账号 首先我们要有微软office365 这时候需要再万能的某宝去找一个账号,…

梯度下降算法入门

提到梯度下降我们知道梯度下降算法是很多机器学习算法、深度学习算法的基础。 首先我们需要明确一些概念什么是梯度: 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处…

嵌入式学习笔记(10)mkv210_image.c代码详解

第1步:检验用户传参是不是3个。 第2步:分配16KB buffer并且填充为0. 第3步:打开源bin(led.bin),判断bin长度是否不大于16KB-16Bytes 第4步:以16个字符串填充0~15这16个Bytes 第5步&#xff…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆

Zabbix部分避坑知识点

一、密码重置 在使用zabbix的过程中由于默认密码过于简单,往往会修改密码并配置为自动登录,时间一长往往忘记密码,造成无法登录的情况,这种情况就需要重置密码。Zabbix的密码存储在数据库中,可通过数据库重置。在Zabb…

Jpeg文件格式详解

摘要:之前做过一些Jpeg相关的需求,对Jpeg进行了一些了解但是不够系统,因此整理下Jpeg文件相关的内容。本文描述了Jpeg文件格式的详细构成以及JPEG/JFIF,JPEG/EXIF的区别。   关键字:JPEG,JFIF,EXIF 1 简介 JPEG&…