可软可硬——从电路的角度做加法

简介: 可软可硬——从电路的角度做加法

摄影:产品经理跟产品经理的吃吃喝喝

最近在听《三体》的广播剧,今天刚好讲到人列计算机。电路设计是我大学的老本行,后来却跑去做软件,真让人唏嘘。今天,我们就从逻辑电路的角度来讲一讲,加法是怎么实现的。

我们知道,5+9=14,这是再简单不过的一个加法。稍稍懂一些计算机的同学也知道,数字在计算机里面是二进制形式存放的,所以显然5+9在计算机里面是101 + 1001 = 1110

相信很多人到这一步就停下来了,就拿出去装逼了。

那么我们更进一步,二进制101和二进制1001在电路里面,到底是怎么做加法的?我们知道电路的导通表示1,电路的关闭表示0.现在给你一个几个开关,你能通过改变它的导通和关闭来做加法吗?

为了使用电路来做加法,我们需要知道三个电路元件:与门或门异或门。这三个门都有两个输入脚和一个输出脚。两个输入脚是否通电决定了输出脚是否通电。他们长下面这样:

与门

对于与门,只有两个输入引脚同时有电流流入,输出脚才有电流流出。否则输出脚没有电流流出。相当于 Python 里面的and关键字。

或门

对于或门,任何一个输入脚有电流流入或者两个脚同时有电流流入,输出脚都有电流流出。相当于 Python 里面的or关键字。

异或门

对于异或门,当两个输入引脚中,只有一个引脚有电流流入时,有电流流出。但是如果两个引脚同时有电流流入,或者同时没有电流流入,输出引脚都没有电流流出。相当于Python 里面的^符号。

那么如和使用这三种逻辑门电路,组合出一个做加法的电路呢?我们来看一下一位的二进制加法。

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 0 = 1
  • 1 + 1 = 0 并进1位。

如果不考虑进位,实际上这个结果就是异或门的结果。所以我们可以直接使用一个异或门,来表示1位二进制的加法。但由于最后的结果只有一个二进制位来存放,所以进位的1就丢失了。

现在我们来考虑,如何保留这个进位的1呢?注意到,只有两个1 + 1这一种情况才会出现进位。所以我们需要有一个电路,只对1 + 1起反应,而对另外三种不起反应。

显然,我们可以使用与门,只有在两个输入引脚都有电流流入的时候,才会有电流流出。我们通过这个与门是否有电流流出就能判断是否有进位发生。如下图所示:

与门异或门并联,实现记录相加的结果和进位信息。

现在我们增加一下难度,如果是两个二位二进制数相加呢?对于低位的二进制数数,显然我们上面的做法已经可以了。但是对于高位的二进制数而言,不仅本身要相加,还要加上低位进上来的进位数。所以要到高位异或出来的结果再与低位的进位输入再异或一次。并且这个和也要考虑是否进位。如下图所示:

为什么最后还有一个或门呢?是因为,进位有三种情况下是进1,还有一种情况下是进0.

高位的被加数(a)、加数(b)他们本身的进位可能是0或者是1. a 和 b 的和再与低位进位数(c)再求和,新的进位可能是0或者是1。但需要注意,当 a与 b 需要进1的时候,a 与 b 的和必定为0.此时与c的和不可能进位。只有当 a 与 b 一个是0,一个是1的时候,他们本身的进位是0,但他们在 c 为1的时候新的进位是1。

所以最后两个进位的输出汇入一个或门得到最终的进位输出,成为新的进位。

我们发现,第一副图实际上就是第二幅图在 c=0时候的特殊情况。所以只有一位数做加法的时候,也可以使用第二幅图对应的电路。

当我们把4个这样的电路连在一起的时候,也就实现了一个4位的全加器。

我们通过 Python 来模拟这个电路:

def full_add(a, b, c):    sum_of_a_b = a ^ b    final_sum = sum_of_a_b ^ c    increase_of_a_b = a & b    increase_of_sum_of_a_b_c = sum_of_a_b & c    final_increase = increase_of_a_b | increase_of_sum_of_a_b_c    return final_sum, final_increase

我们使用两个数字来测试一下这个全加器:

这个结果最后输出的数字,我们从下往上读,就是1110,正好是14对应的二进制数,说明计算成功。

我们再来个复杂的,1099 + 237 =  1336,运行效果如下图所示:

从下往上读,确实是正确的:

大家注意,我最后把进位的数打印了出来。并且通过一个while循环,无论加数和被加数有多少位都进行计算。但是在实际电路中,或者 C 语言中,我们需要定义整型的长度,例如32位整型,64位整型等等。那么,当最后的进位超出了这个最大位数,如果是无符号整型,就会发现两个很大的数相加结果竟然是一个很小的数,因为最后的进位1由于超过了最大位数,被丢掉了;如果是有符号整型,就会发现两个正数相加变成了负数,因为最高位本来是0,由于进位的关系,它变成了1,但最高位是1表示负数。

这两种情况就叫做数值溢出。

目录
相关文章
BJT放大电路的小信号模型分析法
BJT放大电路的小信号模型分析法是一种常用的分析方法,用于研究BJT放大电路在小信号条件下的放大特性。该方法基于线性化假设,将非线性的BJT放大电路近似为线性的小信号模型,以便进行分析和计算。
361 0
一阶动态电路时域分析
一阶动态电路时域分析是指研究电路在时间域内响应特性的一种分析方法。 一阶动态电路时域分析的主要特征和意义如下: 对象是一阶电路。一阶电路指其动态行为可以用一个一阶微分方程描述的电路,如RC电路、RL电路等。 分析域是时间域。研究的不是电路在不同频率下的频率响应,而是输入信号作用下输出量随时间的变化规律。 研究内容是电路的时域响应特性。如电路对阶跃输入的阶跃响应、对脉冲输入的脉冲响应曲线等。 主要方法是解一阶微分方程。根据电路的等效模型写出其一阶微分方程,然后选择适当解法求其时间域解。 目的是分析电路的动态性能。如过渡过程、时间常数、稳态误差等定量参数,为电路设计和应用提供参考。
257 0
|
7月前
|
算法
数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路
数字逻辑与模拟电子技术-部分知识点(2)——模电部分-半导体三极管、基本线性运放电路、正弦波振荡电路
61 0
动态电路方程
动态电路方程是描述电路中元件之间关系的数学方程。
99 1
|
8月前
|
Web App开发 容器
电容在微分、积分电路中的本质以及应用
电容在微分、积分电路中的本质以及应用
275 0
|
8月前
硬件设计中与门、或门、非门电路详解
硬件设计中与门、或门、非门电路详解
2185 0
|
前端开发 安全 关系型数据库
硬件知识之(低压差线性稳压器)LDO的选择
硬件知识之(低压差线性稳压器)LDO的选择
141 0
|
传感器
同相放大电路的介绍
同相放大电路是一种常见的电子放大电路,它可以将输入信号放大到更高的幅度,并保持输入信号的相位不变。本文将介绍同相放大电路的工作原理、特点以及应用领域。 一、工作原理 同相放大电路是由一个放大器和一个反馈网络组成的。放大器接收输入信号,并将其放大到更高的幅度。反馈网络将部分放大后的信号反馈给放大器的输入端,以实现对输入信号的放大。放大器和反馈网络之间通过一个电阻连接,用于控制反馈信号的幅度。 当输入信号进入放大器时,放大器会将其放大到更高的幅度。同时,反馈网络将放大后的信号反馈给放大器的输入端。由于反馈信号与输入信号具有相同的相位,因此放大器将继续放大相位相同的信号。这样,通过不断的反馈,
363 0
电路电子技术2电容电感伏安关系 & 计算电路中某两端电压
电路电子技术2电容电感伏安关系 & 计算电路中某两端电压
158 0
由浅入深——晶体管放大电路基础(二)
由浅入深——晶体管放大电路基础
251 1
由浅入深——晶体管放大电路基础(二)