编码:二进制加法器
本文是基于《编码》、《穿越计算机的迷雾》两部著作进行读后整理的记录性博客。对书中较为重要的内容进行归纳整理进行二次创作,略去了繁琐的讲述细节,力求简明扼要。
加法是算术运算中最基本的运算,因此如果想搭建一台计算机(这也正是这两本书所隐含的内容),那么首先就要造出可以计算两个数的和的器件。
本文中我们将基于前文介绍的开关、灯泡、导线、电池、逻辑门等这些简单的元件搭建一个二进制加法器。这个加法器完全用于二进制数的计算,而且没有现代加法器那么便利。你不能使用键盘来给出需要相加的两个数,相反所要用到的是一排开关。计算结果是通过一排灯泡来显示的,而非以数字的形式来显示。但是,这个加法器确实可以将两个数相加,其方法与计算机计算加法的方式非常相似。
在开始构建二进制加法器之前,我们先来回顾一下我们小学学习的十进制加法的运算规则。在实际做加法的时候,要将被加数和加数从右边对齐,而开始计算的时候,也同样是从最右边的那一列开始。
首先是 5+7,“5 加 7 等于 2,进 1”,得到结果 “2”,并向左产生一个进位。现在左边只剩下“1”了,因为这一列只有它自己,所以通常是直接拽下来,作为结果的一部分。但是别忘了,这一列上还趴着一个进位。所以,我们还要再 “1加1等于2” 来得到这一列的结果 “2”。至此,我们已经完成了这道加法题,结果是 22。
通过对十进制加法规则的回顾,我们了解了加法的运算规则。二进制和十进制类似,加法的计算方式和十进制一样,但需要注意的是由于进制的不同,两者之间还是存在细微的差别。类比于十进制,二进制加法时,需要知道: 1 加 1 等于 0,进 1 。和十进制加法一样,二进制情况下两个要加起来的数先是右对齐,然后从最右边的列开始计算。
任何一个二进制数都是由一个以上的比特组成的,是一个比特串。为了突出组成它的每个比特,一个二进制数可以表示成:
在这里, 都是单个的比特,是这个二进制数的每一位。让我们来看看,随便两个二进制数相加时会怎样,比如:
它们可以是任意两个数。照惯例,要先把它们右对齐,叠在一起,如下图所示。
因为最先相加的是最右边那一列,即 和 ,所以这里没有从其他列来的进位,属于单纯的两个比特相加。如下图所示,这里有 4 种可能的情况。
接着我们考虑右侧第二列的情况,这一列与前面一列不同,它可能会接受到来自前一位(最右侧)的进位,这样这一列实际上就是三个比特相加。如果最右边一列产生了进位,那么这一列实际上是另外 4 种可能,如下图所示。
结合上述讨论结果,就得到了二进制加法在这一列上做加法时,所有可能出现的情形,共 8 种。而且我们需要明确如果产生进位,这个进位必定是 1。
既然加法都是按列进行的,而且每一列的计算过程都一样,那么完全可以设计一个电路来完成每一列的相加过程,如下图所示。
在图中, 和 分别是来自被加数和加数的一个比特,它们位于同一列上; 是来自右边一列的进位; 是本列产生的进位; 是本列的 “和”。为了表明这个电路的用途,我们在图的中间加了一个符号 “∑”。
在这里我们先略去电路的内部构造,我们直接结合相加时的情况构思出上述一个设备,这个设备能够接受来自前一列的进位并将二进制加法中每一列的相加计算出结果,输出该列向下一列的进位和计算结果。
有了全加器,解决了二进制加法过程中每一列的计算问题,那么,我们可以搞一大堆全加器,根据被加数和加数的比特数,把它们串联起来组成一个完整的加法电路,下图显示了这一过程。
观察上述加法机可以发现 3 比特位的加法机结果是 4 比特,即四个输出结果。可以看出,第一个(左下角那个)全加器的进位输入端没有使用,意思是 “没有进位输入”,或者 “从后面来的进位是0”。其余的全加器,它们的进位输入端都和前一个全加器的进位输出端相连,意思是 “前面的,你产生进位了吗?如果有,我得加上它”。 是最后一个全加器产生的进位,由于这是最后一个全加器,所以它的进位也是最终结果的一部分。
构思设计完成后,我们在结合前文已知的知识来进行具体实现。我们再来分析一下二进制加法中一列加在一起的情况:
观察进位结果表时我们不难发现它与我们与门的输出结果时一样的。因此我们利用与门可以计算两个二进制数加法的进位。
观察加法结果表时,我们发现加法结果表和或门相似,除了右下角的结果。与非门同样和我们想要的结果很相似,除了左上角的结果。
那么我们可以结合两个逻辑门的特点实现加法结果表,我们将或门和与非门连接到相同的输入上,如下图所示。
下表总结了或门和与非门的输出,并将其与我们想要的结果进行了对比。
注意,我们想要的是 1,那么这种情况只有在或门和与非门的输出都为 1 时才会出现。这表明两个输出端可以通过一个与门连接到一起。而这也就是我们想要的结果。
实际上这个电路有个专门的名称,叫做异或门,简写为 XOR。之所以称为异或门是因为若想其输出结果为 1,要么仅让输入 A 为 1,要么仅让输入 B 为 1,两输入端都为 1 则输出为 0。们可以使用一个电气工程师所采用的特定电气符号来表示异或门,如下图所示。
异或门在输入端比或门多出了一条曲线,除此之外它看上去和或门非常相像。异或门的特征如下表所示。
两个二进制数相加的结果是由异或门的输出给出的,而进位位是由与门的输出给出的。因此我们可以将与门和异或门连在一起来计算两个二进制数(即 A 和 B)的和。
结合我们前文介绍的半加器,可以发现上述组合即为我们的半加器,不考虑前一位的进位,只考虑这一列相加的结果以及向下一位的进位。半加器没有做到将之前一次的加法可能产生的进位位纳入下一次运算。
在二进制加法计算时,我们只能将半加器用于最右面一列的相加,对于从右面算起的第二列,由于进位位的存在,实际上需要将三个二进制数相加,而随后每一列的加法都是这样的。随后的每一列二进制数相加都需要将进位位算进来。
为了对三个二进制数进行加法运算,我们需要将两个半加器和一个或门做如下连接。从而使得半加器能够实现对任意比特位的相加。我们选取二进制加法时的中间的比特位相加的场景,在这种情况下,相加时需要考虑下一位的进位,这一列相加的结果以及该列向下一列的进位情况。
先略去中间的电路情况,观察输入和输出情况,输入 A 和输入 B 即为该列的两个比特位的值,进位输入即为上一列向这一列的进位。最后输出即为这一列的加和结果以及该列向下一位的进位。
先看输入 A 和输入 B 的半加器,在这个半加器中先不考虑上一列向这一列的进位直接将这一列的比特位加起来,得到这两个比特位的计算结果以及进位。之后我们便利用第二个半加器将上一列向这一列的进位(即进位输入)和这一列的加和结果相加,得到最终的加和输出以及进位,最后将两个半加器的进位利用或门得到最终的进位输出。两个半加器的进位输出又被输入到一个或门中。你可能会觉得,这里还需要一个半加器,这当然是可行的。但是如果你了解了所有的可能性之后,你会发现,两个半加器的进位输出是不会同时为 1 的,那么两个半加器的进位在其他情况下的结果和或门相同。当然采用异或门也能达到相同的效果,因为或门除了在输入都为1的时候以外,其他情况下结果和异或门结果相同。
下图是结合上述过程进行演示的示例计算过程的拆解图:
为了避免重复地画上面的那个图,我们用以下形式来替代上图中的一堆符号,它也即我们前面想要实现的全加器(Full Adder)。
构建二进制加法器的时候我们可以将多个全加器连接起来,每个全加器的进位输出都作为下一个全加器的进位输入。
下面是画成一个盒子的完整的 8 位二进制加法器,输入标记为 和 ,输出标记为 。
一旦你搭建起了 8 位二进制加法器,你就可以再搭建另外一个加法器。把它们级联起来就可以很容易地扩展出一个 16 位加法器。
编码:二进制加法器篇总结了利用前文介绍的简单电子器件创建的二进制加法器的实现。为了精简内容删减了部分较为详细的书写,仅作为整理总结。
加法器的逻辑电路图,简洁版本
构建8位全加器的壮丽篇章当你将8个全加器串联,如图8所示,你便得到了一个8位全加器。每个A和B比特作为输入,生成的S比特作为输出,构成了一个完整的字节运算,A + B = S。这一过程在《编码:隐匿在计算机软硬件背后的语言》等参考书籍中有详尽阐述。二进制加法器的逻辑电路,虽看似简单,却承载...
一位无进位二进制加法器例子?
而第一列不会!所以加法器的进位输入端是接地的。这表示第一位的进位输入是一个0。第一列二进制数相加后很可能会产生一个进位输出,这个进位输出是下一列加法的输入 c、加法器的8个全加器连接起来,应该就是如下图所示:d、则8位二进制加法器的示意图如下所示:
如何用1块四位二进制加法器实现2个三位二进制数相加?
将两个三位二进制数分别表示为 A 和 B,并且假设 A 的前三个字节为 a1,a2,a3,B 的前三个字节为 b1,b2,b3。则可以用一块四位二进制加法器来实现以下操作:将 A 和 B 的后两个字节相加,得到 sum2,存储在加法器的进位位 C 中。将 A 和 B 的前两个字节相加,得到 sum1,存储在加法...
二进制转换成余3码需要几级加法器
根据余3码的定义可知,余3码是由8421码加3后形成的代码。所以用4位二进制并行加法器实现8421码到余3码的转换,只需从4位二进制并行加法器的输入端A4、A3、A2和A1输入8421码,而从输入端B4、B3、B2和B1输入二进制数0011,进位输入端C0接上“0”,便可从输出端F4、F3、F2和F1得到与输入8421码...
总结四位二进制加法器的使用方法
四位二进制数加法器的数据流描述,由于被加数A和加数B都是4位的,而低位来的进位Cin为1位,所以运算的结果可能为5位,用{Cout,Sum}拼接起来表示。moduleadder(input[3:0]A,input[3:0]B,inputCin,output[3:0]SUM,outputCout); assign{Cout,SUM}=A+B+Cin;Endmodule ...
multisim用加法器、显示译码器和七段数码管实现Y=2X(X、Y均为2位二进...
实现Y=2X的功能可以使用以下步骤:1. 使用两个二位二进制加法器,将X与自身相加,得到2X。2. 将2X的结果输入到一个显示译码器中,该译码器能够将二进制数转换为对应的十六进制数。3. 将译码器的输出连接到一个七段数码管上,用于显示2X的十六进制结果。连接电路如下图所示:![multisim_Y=2X](...
二位二进制全加器的真值表该怎么写?
注意,根本就没有《二位二进制全加器》。前面列出的,全加器的真值表。进行多位数的加法,称为《加法器》。加法器,是用全加器级联而成,从不列真值表。如果是《二位的加法器》,真值表规模就够大了:---+--- A1 B1 A0 B0 C-1 | C S1 S0 ---+--- 0 0 0 0 0 | 0 0 0 ?
如何用CD4013构成2位二进制加法计数器?
CD4013是双D触发器,每一个触发器先组成一位计数器,低触发器的反相输出端接高位CP端。CD4060是14级二进制串行计数分频器,并包含一个振荡器,可以采用RC,或晶振来振构成电路;只要选择合适的振荡频率(常用32K晶振)及分频级数,是可以直接得到秒脉冲信号的,而D触发器(CD4013)可以不用的。
二进制并行加法器采用超前进位的目的是什么
二进制并行加法器采用超前进位的目的是简化电路结提高加法器的运算速度。简化电路结构,提高加法器的运算速度,并行加法器采用超前进位的目的是提高速度,9.a1、a2、a3、a4、a5是五个开关,设它们闭合时为逻辑1,断开时为逻辑0,电灯F=1时表示灯亮。
试用74283构成16位二进制加法器。
【答案】:用四个74283(四位全加器)串接而成,加法器间的CO端与CI端相连,最后产生16位相加和与一个高进位CO15。
穆蕊薄芝: #include main() { char* one = "1101"; char* other = "1101"; int carry = 0; // =0没有进位 =1 有进位 int i = 3; int j = 0; int temp = 0; int result[5] = {0}; while(i >= 0) { if(carry == 0) { temp = 0; } else { temp = 1; carry = 0; } temp += (other[i] - '0') + (one[i] -...
长乐市15969583664: 四位二进制加法器74LS283可完成的二进制加法运算的范围是多少? - ?
穆蕊薄芝: 这很简单,用两个74ls283和一个四位二进制计数器,第一个74ls283四个输出端接接第二个74ls283输入端a1,a2,a3,a4,将第二个四位二进制计数器调成Q1,
长乐市15969583664: 求用C++编一个二进制加法器.就随意输两个二进制数(100位以内),得出结果. - ?
穆蕊薄芝: //#include "stdafx.h"//If the vc++6.0, with this line. #include <iostream> using namespace std; int main(void){char a[102],b[102],*pa,*pb,*ta,*tb,t;cout << "Please enter the two binary integer...\n";cin >> a+1 >> b+1;*a=*b='0';strlen(a)>=strlen(...
长乐市15969583664: 设计一个一位余3码的加法电路,选用四位二进制加法器74ls283 - ?
穆蕊薄芝:[答案] 这很简单,用两个74ls283和一个四位二进制计数器,第一个74ls283四个输出端接接第二个74ls283输入端a1,a2,a3,a4,将第二个四位二进制计数器调成Q1,Q2,Q3,Q4,分别为0011既3了,并将其对应接到74ls283另四个输入端b1,b2,b3,b4,这样第...
长乐市15969583664: 组合逻辑电路的常用组合逻辑电路 - ?
穆蕊薄芝: 1.半加器与全加器 ①半加器 两个数A、B相加,只求本位之和,暂不管低位送来的进位数,称之为“半加”.完成半加功能的逻辑电路叫半加器.实际作二进制加法时,两个加数一般都不会是一位,因而不考虑低位进位的半加器是不能解决问题...
长乐市15969583664: verilog调用四位二进制加法器来写八位二进制加法器 - ?
穆蕊薄芝: 四位二进制加法器做底层,顶层调用它,输入8位,拆成[7:4]和[3:0]两个四位,低位一个加法器,高位一个加法器,然后把低位的进位送高位加法器再做一次计算.输入8位...
长乐市15969583664: 求一个两位二进制加法器,有功能介绍和原理图!!! - ?
穆蕊薄芝: s=a xor b xor cin ; cout=(a and b) or ( cin and (a xor b))s 是和输出,cout是进位输出,cin是进位,这是全加器公式,两位的加法器,只要将两个全加器级联就行...
长乐市15969583664: 利用加法器设计一个代码转换电路,将bcd代码的8421码转换成余3码 - ?
穆蕊薄芝: 根据余3码的定义可知,余3码是由来8421码加3后形成的代码.所以,用4位二进制并行加法器实现8421码到余3码的转自换,只需从4位二进制并行加法器的输入端A4、A3、A2和A1输入zd8421码,而从输入端B4、B3、B2和B1输入二进制数0011,进位输入端C0接上“0”,便可从输出端F4、F3、F2和F1得到与输入8421码对应的余3码.
长乐市15969583664: 关于"二进制加法器实现十进制数加法运算". - ?
穆蕊薄芝: 用二进制实现十进制运算时,每一个十进制位用四位二进制表示,比如十进制的9表示为'1001',十进制的10表示为'0001 0000';因此二进制都是每四位为一组来表示对应的十进制,且每一组的最大值都是'1001'即十进制的9,这样才能保证7断显示码等工具输出时能显示为正常的十进制的数字;当用二进制进行加运算时每一组(四位二进制)可能大于'1001'(9),即没能正常进位;所以当每一组四位二进制大于'1001'时,(用'XXXX'表示),应该修正为:XXXX-1010+10000=XXXX+0110,解释:'-1010'后剩余的二进制即为当前组的十进制的二进制表示;'+10000'为向前进'1'.还不明白继续问我
长乐市15969583664: 利用EDA设计加法器和减法器并且附有程序代码的实验报告 - ?
穆蕊薄芝: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity full is port(cin:in std_logic; a,b:in std_logic_vecter(7downto 0); ...