【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现
课程链接:
计算机组成_北京大学_中国大学MOOC(慕课)
3 - 2 - 302-门电路的基本原理(11-'39--)_哔哩哔哩_bilibili
现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路,想要了解计算机组成的基本原理,还是需要有一些集成电路的基本知识。就让我们从最简单的门电路的实现开始吧。
1. 门电路的基本原理
晶体管是构成现代集成电路的基本原件,通常使用的是MOS晶体管,MOS晶体管又主要有2种类型,N型MOS管和P型MOS管。N MOS导通的条件是Gate端连接了高电平,P MOS正好相反,其导通条件是Gate端连接了低电平。这就好比我们有2种类型的水龙头,一种当我们把把手向下压的时候会出水,另一种当我们把把手向上拉的时候会出水。
那如何用晶体管构建逻辑门呢?
1. 非门
最简单的一种逻辑是非门,只需要两个晶体管就可以实现。我们来看一下非门是如何工作的,VDD连接的是电源,也就是高电平(1),接地表示低电平(0)。当A为0是,P MOS导通,N MOS不通,此时高电平1传送到Y。当A为1时,P MOS不同,N MOS导通,此时低电平0传送到Y。这样就实现了非门的功能。
2. 与门
虽然我们需要的是与门,但实际上与非门比与门的实现更为简单,所以实际用与非门和非门来实现与门。
与非门使用4个晶体管来实现。我们这里来看一下与非门的工作过程。当A=1,B=1时,两个N MOS导通,两个P MOS不通,所以低电平0传送到了Y。当A=1,B=0时或A=0,B=1或A=0,B=0时,两个P MOS中至少有一个导通,所以高电平1传送到了Y。
除了非门和与门,其他比较常见的还有或门和异或门。这些逻辑门可以用于实现计算机中所要求的各种逻辑运算,如and, or等。

2. 寄存器的基本原理
在CPU中,用来存储信息的非常重要的部件就是寄存器。比如说0号通用寄存器,在MIPS的体系结构中,是一个32位的寄存器,从电路实现上来说,这32个bit都是一样的,我们来看其中一个,它可以用一个叫做D触发器的部件来实现。

1. D触发器
触发器是一个具有存储信息能力的基本单元,它也是由若干逻辑门构成的,这里我们不深入到它的实现细节,而关注它提供的功能。触发器有很多种类型,D触发器是其中一种。
D触发器有一个数据输入,一个数据输出和一个时钟输入。它的功能表现是这样的:在时钟的上升沿,采样输入D的值,传送到输出Q,其余时间输出Q的值不变。

如果我们把32个D触发器组合起来就可以构成一个32位的寄存器,当然这只是一个简单的原理性实现,现实中寄存器的实现要复杂得多。用这样一个32位寄存器,就可以构成CPU中的一个通用寄存器,用同样的方法可以做出其他的通用寄存器以及PC,IR这样的寄存器,再将这样的寄存器与其他由逻辑门构成的电路相连,就构成了我们这个复杂的CPU了。
3. 逻辑运算的实现
现在我们已经掌握了基本的门电路,可以提供简单的逻辑运算,例如与门可以实现2个bit的与操作。但是这和计算机中与运算指令所需要的功能还是有差距的,例如and rd,rs,rt这条指令,它的两个源操作数和目的操作数都是32位的寄存器。那么我们怎么用与门来完成呢?其实也很简单,我们就把32个与门并排连起来,将32位的输入分别连接到这32个与门上,输出再整合到一起变成1个32位的输出。

类似地,如果要完成或运算指令,则需要32个或门。

那在ALU当中,实际上是包含了多种不同的功能部件,包括刚才提到的32位的与运算,32位的或运算,以及其他的逻辑运算和算数运算。那它们是怎样合成一个整体的呢?通过一个多选器来实现,这个多选器实际上也是由若干个门组成的。

回到之前的逻辑运算的实例。如果要实现and $8,$9,$10的运算,实际上是在控制电路的控制下,将9号,10号寄存器的内容分别传送到ALU的两个输入端,根据控制电路给出的and指令进行操作,最后将结果送回到8号寄存器。
这就相当于左边这张图所显示的电路的连接。最上面是由32个D触发器组成的8号寄存器,中间是9号寄存器,下面是10号寄存器,9号和10号寄存器的Q端的输出会被连接到ALU的输入,同时ALU的功能选择信号输入了与运算所对应的编码,然后ALU的输出会被连接到8号寄存器的输入D端,所以在某一个时钟周期内,ALU会完成相关的计算,等到下一个时钟上升沿来临时,8号寄存器就会将ALU的输出存入到寄存器内部。

4. 算数运算的实现
加法和减法是两种基本的算数运算,它们在硬件上是如何实现的呢?
1. 加法运算
先来考虑如下两个4-bit二进制数相加的情况,对于每一位的相加来说,实际上需要做这么几项工作,1. 两个1-bit二进制数相加,2.如果低位有进位的输入的话,需要参与运算,3.最后如果产生进位,也要进行输出。

对于两个1-bit二进制数相加,可以通过半加器实现。半加器由一个异或门和一个与门组成,它有两个输入端口A,B,两个输出端口S,C(表示进位)。举例,当输入A,B分别为0,1时,异或门结果为1,与门结果为0,正好符合相加的运算。

半加器距离实现一个完整的加法运算还差一点:它不能将低位的进位输入加进来。所以为了实现这个功能,需要引入另一个半加器,构成一个全加器。

现在我们再回头看4-bit的加法,其实就是将4个全加器串联起来。

和4位加法器一样,我们可以很容易地构建出32位的加法器。这样的加法器就可以满足加法运算指令的需求。

add和addu这两条指令的区别,在于对溢出的处理不同。
2. 溢出的处理
溢出(Overflow)是指运算结果超出了正常的表示范围。溢出是仅针对有符号数运算来说的。具体表现就是如果两个正数相加,结果变成了负数,或者两个负数相加,结果变成了正数,这显然是不正确的,这种情况就是由溢出造成的。
来看一个例子,0011(=3)和0101(=5)相加,如果这两个数是无符号数,那计算结果是1000(=8),是正确的,但如果是有符号数,那1000相当于-8,这就是不正确的。
这里我们还需要注意进位和溢出的差别,下面给出了两个例子,有时会出现有溢出,无进位的情况,有时也会出现有进位,无溢出的情况。因为溢出表示的是有符号数超出表示范围的情况,进位也可以看作是无符号数超出表示范围的情况。

但是进位是很好判断的,全加器本身就有进位的输出,那溢出又该如何判断呢?其实也很简单,就是当 最高位的进位输入 != 最高位的进位输出 时,就是发生了溢出。以上面的0011+0101为例,最高位的进位输入是1,而最高位的进位输出是0,此时发生了溢出。
在硬件上如何实现溢出的判断呢?可以在刚才的全加器上做一点改动。C31是最后一位的进位输入,Cout是最高位全加器的进位输出,把这两个信号连出来接一个异或门即可。

另外还需要说明的一点是,对于一个加法器的硬件实现,它并不关心这两个输入数是有符号数还是无符号数,或者说它对于有符号数和无符号数的处理是一样的。因此是不是要处理溢出,以及如何处理溢出,就不能只交给硬件来做。不同体系结构有不同的方法。
1. MIPS对溢出的处理
对于MIPS来说,它提供了两类不同的指令来分别处理。如果编程人员想将操作数看成有符号数,需要处理溢出,则需要使用add,addi指令。这样的运算在发生溢出时会产生异常,也就是说控制电路会检查加法器产生的overflow的信号,如果overflow信号有效,控制电路就会当作一个异常的情况处理。如果编程人员想将操作数堪称无符号数,不处理溢出,则需要使用addu和addiu指令。在使用这两条指令时,控制电路不会检查加法器输出的overflow信号。
所以说MIPS处理溢出的方式是提前做准备,按照是否要处理溢出采用不同的指令进行运算。

2. X86对溢出的处理
X86则采取了另一种方式。它并没有根据是否处理溢出分成两种指令,X86指令如果产生溢出,并不会直接由控制电路检查到并进行处理,而是将加法器产生的溢出信号传送到了标志寄存器的OF位。如果想对溢出进行处理,则在后续的指令中需要检查标志寄存器的OF位是否为1并进行相应的操作。

3. 减法运算
其实减法是可以很容易地转换成加法的,例如A-B=A+(-B)。但我们需要注意的是怎么把B转换成-B呢?计算机当中是用补码来保存二进制数的,把B转换成-B可不是在前面加一个负号这么简单。补码表示的二进制数的相反数有如下的转换规则:按位取反,末位加一。规则是如何来的,可以看右边的举例。

根据这个规则,我们在加法器的基础上实现减法器就容易了。在加法器的基础上,原来的输入A和B都不变,我们增加了一个新的输入,叫做sub-mode,只有1个bit,它首先控制了一个二选一的多选器,如果sub-mode=0,代表执行加法操作,那么会将多选器的左边这个通路选通。如果sub-mode=1,代表执行减法操作,这时将多选器的右边这个通路选通,此时B需要经过一个非门变成~B,同时sub-mode=1控制了C0=1,表示多加1,和减法的计算公式相符。
这样我们通过这个改动,这个功能部件又能实现加法,又能实现减法。

4. 加法器的优化
ALU提供的加法和减法,究其本质都是由加法器来实现的。我们现在学习的加法器,是由一个一个的全加器串联而成,它在性能上存在着很大的问题。以4-bit加法器为例,当把所有输入都准备好时,其实只有最右边的全加器可以开始工作,等它计算完了产生新的进位,第二个全加器才能开始工作。这样进位输出像波浪一样从低位向高位传递的加法器叫做行波进位加法器(Ripple-Carry Adder, RCA)。这种加法器的优点是电路布局简单,设计方便。它的缺点也很明显,就是高位的运算必须等待低位的运算完成,延迟时间长。

我们来分析一下行波进位加法器的延迟情况。延迟最长的路径(也被称为关键路径)的延迟时间是(2n+1)T。也就是说对于4-bit的加法器,延迟时间是9T,对于32-bit的加法器,延迟时间是65T。

这个时间,参考28nm的制造工艺,1.3GHz的主频表示时钟周期是0.66ns,这就是最近的两个时钟上升沿之间的时间长度。因为加法器的输入是来自寄存器,而且加法器的输出,包括运算的核,进位的输出,都是要传递到寄存器保存起来的,所以说这些信号从前一级的寄存器经过加法器的所有逻辑一直到下一级寄存器的输入,不能超过0.66ns。但实际情况是,对于32-bit RCA来说,延迟时间大约为1.3ns,远远超过了0.66ns。采用这样的加法器,它的主时钟频率最多也只能达到769MHz。所以说这样的加法器与现实中使用的加法器,性能差距是非常大的。那我们应该如何进行优化呢?

分析行波进位加法器的问题所在,影响性能的主要问题在于高位的运算必须等待低位的进位输出信号。那么优化思路就是,能否提前计算进位输出信号?
我们对进位输出信号进行分析。对于每一个全加器,它的进位输出信号记为Ci+1,它能通过3个输入(Ai,Bi,Ci)计算得到。通过换算,我们设置两个新的变量Gi和Pi,这两个变量是由Ai和Bi产生的,他们都是在运算之初就能确定了的信号。

通过代入计算,C1,C2,C3,C4都能够通过Gi,Pi和C0计算得到,这些都是在运算之初就能确定了的信号,因此我们就有了提前计算进位输出信号的方法。用这样的方法实现的加法器叫做超前进位加法器(Carry-Lookahead Adder, CLA)。

那它在硬件上是如何实现的呢?如下图,可以看到计算Ci+1的延迟时间固定为3级门延迟,与加法器的位数无关。然后最后一级的全加器还要计算S位的输出,因此再多1级门延迟,总延迟时间为4T。

我们再考虑32-bit加法器,如果采用行波进位加法器,总延迟时间为65T,如果采用超前进位加法器,理想的总延迟时间为4T,但是实际上电路过于复杂,难以实现。所以通常的实现方法,是采用多个小规模的超前进位加法器拼接而成,例如用4个8-bit的超前进位加法器用行波进位的方式连接起来,从而构成一个32-bit的加法器。这样的实现下,4级CLA的延迟时间为0.26ns(0.02*3级门延迟得到C4*3级CLA+0.02*4级门延迟得到S*最后1级CLA=0.26ns),这样就可以运行在3.84GHz的时钟频率下,那么它就不会成为我们整个复杂的CPU设计的关键路径了。

相关文章:
【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现
课程链接: 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理(11-39--)_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路,想要了解计算机组成的基本原理,还是需要有…...
python元组的不可变性和应用场景
Python元组是一种不可变的数据类型,也就是说一旦创建后,其元素无法被修改、添加或删除。元组使用圆括号来表示,元素之间使用逗号进行分隔。 以下是创建和访问元组的方法和语法: 创建元组: 使用圆括号直接创建ÿ…...
配置化开发的核心设计 - Schema
前端配置化SchemaServerless FaaS BaaS useImperativeHandle() react-helmet 参考链接 schema进入...
HTTP协议概述
HTTP 协议定义 HTTP协议,直译为超文本传输协议,是一种用于分布式、协作、超媒体的信息系统的应用协议。HTTP协议是万维网数据通信的基础。HTTP协议在客户端-服务器计算模型中充当请求-响应协议。客户端向服务器提交HTTP请求消息。服务器提供HTML文件和其…...
fastjson2 打开 AutoType
1. 功能简介 FASTJSON支持AutoType功能,这个功能在序列化的JSON字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。 2. AutoType安全机制介绍 必须显式打开才能使用。和fastjson 1.x不一样,fast…...
封装(个人学习笔记黑马学习)
1、格式 #include <iostream> using namespace std;const double PI 3.14;//设计一个圆类,求圆的周长 class Circle {//访问权限//公共权限 public://属性//半径int m_r;//行为//获取圆的周长double calculateZC() {return 2 * PI * m_r;} };int main() {//通…...
PyTorch 模型性能分析和优化 - 第 3 部分
这[1]是关于使用 PyTorch Profiler 和 TensorBoard 分析和优化 PyTorch 模型主题的系列文章的第三部分。我们的目的是强调基于 GPU 的训练工作负载的性能分析和优化的好处及其对训练速度和成本的潜在影响。特别是,我们希望向所有机器学习开发人员展示 PyTorch Profi…...
【力扣每日一题】2023.9.1 买钢笔和铅笔的方案数
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们三个数,一个是我们拥有的钱,一个是钢笔的价格,另一个是铅笔的价格。 问我们一共有几种买笔…...
实现不同局域网间的文件共享和端口映射,使用Python自带的HTTP服务
文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用…...
Kubernetes技术--k8s核心技术Pod
(1).概述 Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型。 k8s不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成。 一个pod中的容器共享网络命名空间。 Pod是一个短暂存在的。 (2).为什么k8s中最小单元是…...
基于Springboot实现的Echarts图表
概述 ECharts是百度开源的一个前端组件。它是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等)&…...
adb server version (41) doesn‘t match this client (39)
异常: adb server version (41) doesnt match this client (39); killing... ADB server didnt ACK安装ADB后:查看版本 $ adb version Android Debug Bridge version 1.0.39 Version 1:8.1.1-1r23-5.4-1eagle Installed as /usr/lib/android-sdk/platf…...
B080-RabbitMQ
目录 RabbitMQ认识概念使用场景优点AMQP协议JMS RabbitMQ安装安装elang安装RabbitMQ安装管理插件登录RabbitMQ消息队列的工作流程 RabbitMQ常用模型HelloWorld-基本消息模型生产者发送消息导包获取链接工具类消息的生产者 消费者消费消息模拟消费者手动签收消息 Work QueuesSen…...
关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿
题1:岛屿周长 给定一个 row x col 的二维网格地图 grid ,其中:gridi 1 表示陆地, gridi 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰…...
lintcode 1081 · 贴纸拼单词【hard 递归+记忆化搜索才能通过】
题目 https://www.lintcode.com/problem/1081/ 给出N种不同类型的贴纸。 每个贴纸上都写有一个小写英文单词。 通过裁剪贴纸上的所有字母并重排序来拼出字符串target。 每种贴纸可以使用多次,假定每种贴纸数量无限。 拼出target最少需要多少张贴纸?如果…...
HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)
三、拖动手势(PanGesture) .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功&am…...
计算机毕设之基于Python+django+MySQL可视化的学习系统的设计与实现
系统阐述的是使用可视化的学习系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。利…...
Kotlin inline、noinline、crossinline 深入解析
主要内容: inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的,inline 修饰一个函数表示该函数是一个内联函数。编译时,编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…...
在 CentOS 7 / RHEL 7 上安装 Python 3.11
原文链接:https://computingforgeeks.com/install-python-3-on-centos-rhel-7/ Python 是一种高级解释性编程语言,已被用于各种应用程序开发,并在近年来获得了巨大的流行。Python 可用于编写广泛的应用程序,包括 Web 开发、数据分…...
SVN基本使用笔记——广州云科
简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比,有什么优势 使用简单,上手快 目录级权限控制,企业安全必备 子目录Checkout,减少不必要的文件检出…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
