前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >计算机如何进行加减乘除计算—算术逻辑单元(一)

计算机如何进行加减乘除计算—算术逻辑单元(一)

作者头像
硬核编程
发布于 2019-08-19 13:40:31
发布于 2019-08-19 13:40:31
2.7K0
举报

ALU

上节,我们谈了如何用二进制表示数字,比如二进制 00101010 是十进制的 42,表示和存储数字是计算机的重要功能,但真正的目标是计算,有意义的处理数字。比如把两个数字相加,这些操作由计算机的 "算术逻辑单元 "处理。但大家会简称:ALU。

ALU 是计算机的数学大脑,等你理解了 ALU 的设计和功能之后,你就理解了现代计算机的基石。ALU 就是 计算机里负责运算的组件基本其他所有部件都用到了它。

先来看看这个美人,这可能是最著名的 ALU,英特尔 74181,1970 年发布时,它是第一个封装在单个芯片内的完整 ALU,这在当时是惊人的工程壮举。

今天我们用上周学的布尔逻辑门,做一个简单的 ALU 电路,功能和 74181 一样,然后接下来几周,用它从头做出一台电脑,所以会有点复杂,但我觉得你们搞的定。

ALU 有 2 个单元,1 个算术单元和 1 个逻辑单元,我们先讲"算术单元",它负责计算机里的所有数字操作,比如加减法它还做很多其他事情,比如给某个数字+1,这叫增量运算,我们之后会说。

今天的重点是一切的根本 - "把两个数字相加",我们可以用单个晶体管一个个拼,把这个电路做出来,但很快就会复杂的难以理解。所以与其用晶体管,我们会像第 3 节,用更高层的抽象,用逻辑门来做,我们会用到 AND,OR,NOT 和 XOR 逻辑门,最简单的加法电路, 是拿 2 个 bit 加在一起(bit 是 0 或 1),有 2 个输入:A 和 B, 1 个输出:就是两个数字的和,需要注意的是:A, B, 输出,这3个都是单个 Bit ( 0 或 1 )。

输入只有四种可能,前三是 0 + 0 = 0 ; 1 + 0 = 1 ; 0 + 1 = 1。记住二进制里,1 与 true 相同,0 与 false 相同。这组输入和输出,和 XOR 门的逻辑完全一样,所以我们可以把 XOR 用作 1 位加法器(adder)。但第四个输入组合,1+1,是个特例 1+1=2(显然),但二进制里没有 2。上节说过,二进制 1+1 的结果是0,1进到下一位和是 10 (二进制)。XOR 门的输出,只对了一部分, 1+1 输出 0,但我们需要一根额外的线代表 "进位",只有输入是 1 和 1 时,进位才是 "true"。因为算出来的结果用 1 个 bit 存不下,方便的是,我们刚好有个逻辑门能做这个事!没那么复杂 , 就两个逻辑门而已让我们抽象化。把 "半加器" 封装成一个单独组件,两个输入 A 和 B 都是 1 位, 两个输出 "总和" 与 "进位"。这进入了另一层抽象,我好像说了很多次,说不定会变成一个梗。

全加器

如果想处理超过 1+1 的运算,我们需要"全加器",半加器输出了进位,意味着,我们算下一列的时候,还有之后的每一列,我们得加 3 个位在一起,并不是 2 个。全加器复杂了一点点,全加器表格,有 3 个输入:A, B, C (都是 1 个 bit),所以最大的可能是 1 + 1 + 1,"总和"1 "进位"1 , 所以要两条输出线: "总和"和"进位",我们可以用半加器做全加器。我们先用半加器将 A 和 B 相加,然后把 C 输入到第二个半加器,最后用一个 OR 门检查进位是不是 true,这样就做出了一个全加器!

我们可以再提升一层抽象,把全加器作为独立组件,全加器会把 A,B,C 三个输入加起来输出 "总和" 和 "进位"。现在有了新组件,我们可以相加两个 8 位数字,叫两个数字叫 A 和 B 好了。我们从 A 和 B 的第一位开始,叫 A0 和 B0 好了。现在不用处理任何进位,因为是第一次加法,所以我们可以用半加器,来加这2个数字,输出叫 sum0。现在加 A1 和 B1,因为 A0 和 B0 的结果有可能进位,所以这次要用全加器,除了 A1 和 B1,还要连上进位,输出叫 sum1。然后,把这个全加器的进位,连到下个全加器的输入,处理 A2 和 B2。以此类推,把 8 个 bit 都搞定。注意每个进位是怎么连到下一个全加器的,所以叫 "8位行波进位加法器"。

溢出

注意最后一个全加器有 "进位" 的输出,如果第 9 位有进位,代表着 2 个数字的和太大了,超过了 8 位,这叫 "溢出" (overflow),一般来说 "溢出" 的意思是, 两个数字的和太大了,超过了用来表示的位数,这会导致错误和不可预期的结果。著名的例子是,吃豆人用 8 位存当前关卡数,如果你玩到了第 256 关( 8 位 bit 最大表示 255),ALU 会溢出,造成一连串错误和乱码,使得该关卡无法进行,这个 bug 成了厉害吃豆人玩家的代表。

如果想避免溢出,我们可以加更多全加器,可以操作 16 或 32 位数字,让溢出更难发生,但代价是更多逻辑门。另外一个缺点是,每次进位都要一点时间,当然时间不久,因为电子移动的很快。但如今的量级是每秒几十亿次运算,所以会造成影响,叫 "超前进位加法器"。它更快,做的事情是一样的 - 把二进制数相加,ALU 的算术单元,也能做一些其他数学运算,一般支持这 8 个操作。

就像加法器一样,这些操作也是由逻辑门构成的,有趣的是,你可能注意到没有乘法和除法,因为简单的 ALU 没有专门的电路来处理,而是把乘法用多次加法来实现。假设想算 12x5,这和把 "12" 加 5 次是一样的,所以要 5 次 ALU 操作来实现这个乘法,很多简单处理器都是这样做的。比如恒温器,电视遥控器和微波炉,慢是慢,但是搞的定。然而笔记本和手机有更好的处理器,有专门做乘法的算术单元,你可能猜到了,乘法电路比加法复杂,没什么魔法,只是更多逻辑门。所以便宜的处理器没有。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员成长充电站 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
教你自己制作一个ALU
1970年,第一个封装在单个芯片内的完整ALU——英特尔74181诞生,这在当时是惊人的工程壮举!
小柔
2022/10/09
1.2K0
教你自己制作一个ALU
『计算机的组成与设计』-计算机的算数运算
要注意: 在执行立即数加法时,imm 是 16 位。而寄存器是 32 位,这就出现转换的问题。在手册中是使用 imm 的符号扩展,也就是将高 16 位采用低 16 位的最高位复制 16 次进行填充。(符号扩展不会改变原数值)。
1ess
2021/10/29
9930
『计算机的组成与设计』-计算机的算数运算
重学计算机组成原理(十二)- 加法器
这些基本的门电路,是我们计算机硬件端的最基本的“积木” 包含十亿级别晶体管的现代CPU,都是由这样一个一个的门电路组合而成的。
JavaEdge
2022/11/30
9660
重学计算机组成原理(十二)-  加法器
组合逻辑硬件建模设计(二)算术电路
加法和减法等算术运算在处理器逻辑的设计中起着重要作用。任何处理器的算术逻辑单元(ALU)都可以设计为执行加法、减法、增量、减量运算。算法设计由RTL Verilog代码描述,以实现最佳区域和较少关键路径。本节用等效的Verilog RTL描述描述执行算术运算的重要逻辑块。
碎碎思
2022/03/11
1.2K0
组合逻辑硬件建模设计(二)算术电路
HDLBits: 在线学习 SystemVerilog(十二)-Problem 65-71(加法器)
HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~
碎碎思
2022/11/14
9380
HDLBits: 在线学习 SystemVerilog(十二)-Problem 65-71(加法器)
【自己动手画CPU】运算器设计
(2) 熟悉 Logisim 平台基本功能,能在 logisim 中实现多位可控加减法电路。
SarPro
2024/02/20
1.1K0
【自己动手画CPU】运算器设计
计算机如何进行逻辑计算—算术逻辑单元(二)
比如之前讨论过的 AND,OR 和 NOT 操作,它也能做简单的数值测试,比如一个数字是不是负数,例如,这是检查 ALU 输出是否为 0 的电路,它用一堆 OR 门检查其中一位是否为 1,哪怕只有一个 Bit (位) 是1,我们就知道那个数字肯定不是 0,然后用一个 NOT 门取反,所以只有输入的数字是 0,输出才为 1。
硬核编程
2019/08/19
1.2K0
【计算机组成原理】加法器原理及其优化
这章在王道书里好像没有专门讲,估计不是考纲 但觉得对后面的理解还是有帮助的 故记录学习
苏泽
2024/04/21
1530
【计算机组成原理】加法器原理及其优化
最强大脑,计算机中1+1=2的实现逻辑
在计算机硬件层面上,你知道1+1是如何实现的吗?本文先介绍了继电器的基本原理,然后从分析与或非等逻辑门电路入手,推导出异或门的实现,借助异或门从而实现1+1,并得出全加器的基本原理。 前言 计算机中处理的都是二进制,1+1=2转成二进制表示为 1 + 1 = 10, 10表示相加结果为0, 并且有进位。如图所示,该运算可以拆分成求和和求进位。 求和的特点是0 + 0 = 0, 1 + 1 = 0, 0 + 1 = 1, 1 + 0 = 1. 可以看到,相同的数相加为0, 相反为1, 其实就是作异或。
腾讯技术工程官方号
2018/01/30
3.9K3
最强大脑,计算机中1+1=2的实现逻辑
计算机科学概论复习笔记(4)
一般来说,0-2伏的电压属于低电平,用二进制数字0表示,2-5伏的电压属于高电平,用二进制数字1表示
灯珑LoGin
2022/10/31
5970
计算机科学概论复习笔记(4)
国庆期间,我造了台计算机
今天我就和大家一起来探索一下底层的奥秘,但是术业有专攻,我们大致的了解一下即可,很多细节不清晰也不影响。
程序员小浩
2020/10/26
5810
国庆期间,我造了台计算机
数据的表示和运算
这期本来是想写hashMap的,但是里面哈希和扩容之类的,很多都是位运算,不太熟悉的同学看着会很难受,所以先补充一些计算机组成的知识。
三哥
2020/01/17
9660
数据的表示和运算
五分钟搞不定系列- 1+1=?
甄建勇,高级架构师(某国际大厂),十年以上半导体从业经验。主要研究领域:CPU/GPU/NPU架构与微架构设计。感兴趣领域:经济学、心理学、哲学。
Linux阅码场
2021/12/09
1.3K0
五分钟搞不定系列- 1+1=?
计算机是如何实现加法的
我们除去右下角看其他部分,和或运算结果是完全一致的。再单独看一下右下角,输入都为1时输出为0这不就是与非的操作结果吗。那我们将输入同时给到或门和与非门看下他们的输出:
蛋不炒饭
2018/11/26
2.8K0
计算机是如何实现加法的
JavaWeb 基础知识(一)——计算机是如何组成的
  冯诺依曼提出了计算机结构体系的一个设想,规定了计算机大概要有什么设备,还有计算机要使用二进制等等…,后人为了纪念这个伟大的人物,就将这个计算机体系定义为冯诺依曼体系.
RAIN7
2021/10/12
3750
FPGA实验1组合逻辑实验
此次实验为设计一个16位全加器模块并对其进行测试,本实验是以数据流的方式描述全加器模块,其中16位全加器有一个进位输入端和一个进位输出端,以及16位的数据输入和输出端,实现16位数据的计算,具体的实验如下。
timerring
2022/07/20
8370
FPGA实验1组合逻辑实验
计算机如何从0到1的?
现代计算机已经发展的非常复杂,要理解计算机的运行原理都已经变得异常艰难,虽说我们无法亲自去制造他,但我们可以了解下计算机系统是怎么从0发展而来的。
用户1260737
2019/07/30
1.2K0
计算机如何从0到1的?
CrashCourseComputerScience(1)-计算机历史及硬件
本文是在回顾Crash Course计算机系列视频的笔记,本系列课程的老师是外网有名的Carrie Anne.
打铁读书郎
2024/04/11
3030
CrashCourseComputerScience(1)-计算机历史及硬件
2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管
所以想要准确的保存一个比特,你需要保持住D的值,持续经过CP从0~1然后再到0的过程
noteless
2018/09/11
1.7K0
2.计算机组成-数字逻辑电路   门电路与半加器 异或运算半加器  全加器组成 全加器结构  反馈电路 振荡器  存储 D T 触发器  循环移位 计数器   寄存器  传输门电路 译码器  晶体管
从零开始的计算机系统,从本质上深入理解计算机
逻辑门是搭建计算机的基础元件,主要用于完成逻辑运算。逻辑运算又称为布尔运算,无论是输入还是输出,都只有0和1,用来表示两种对立的逻辑状态。用来执行与、或、非这三种最基本逻辑运算的元件称为与门、或门、非门。使用这三种基本的逻辑门,就可以实现所有的逻辑运算,进而构造一整套的计算。
网络交换FPGA
2019/10/29
1.3K0
从零开始的计算机系统,从本质上深入理解计算机
推荐阅读
相关推荐
教你自己制作一个ALU
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档