• 数字电路——加法器


    我们之前了解了门,电路就是门的组合。

    电路又可以分为两大类,组合电路和时序电路。

    但作为计算机和编程的知识铺垫,我们要了解的是组合电路的使用方法。所以本篇讲的是组合电路的运算(电路的布尔运算。)


    推导过程略看也行。建议还是看看,了解一下。

    组合电路(可略过)

    输出仅由输入值确定的电路

    把一个门的输出作为另一个门的输入,就可以把门组合电路.
    在这里插入图片描述

    如上图,两个与门的输出被用作或门的输入。

    注意:

    1. A同时是两个与门的输入。
    2. 两条交叉的连接线的交汇处没有连接点,应该看做是一条连接线跨做了一条,他们互不影响

    电路分析 我们倒着看,按照门来分析

    1. 如果X=1则说明,D和E至少有一个是1.
    2. 如果D是1,则AB都必须是1
    3. 如果E是1,则AC都必须是1

    真值表如下

    ABCDEX
    000000
    001000
    010000
    011000
    100000
    101011
    110101
    111111

    三个输出就是8种组合哦( 23).中间显示了电路中间值(D和E)。

    此时我们可以用布尔代数来表示电路。因为电路是一组互相关联的门,所以表示电路的布尔表达式是布尔运算的组合

    在这个电路中,有两个表达式。每个运算的输出是或运算的输入。

    因此~(AB+AC) 这个布尔表达式表示了这个电路

    详细点就是

    1. (AB=D AC=E)
    2. D+E=X
    3. 然后参考真值表就行。

    我们现在从另一个方向入手,从布尔表达式绘制对应的真值表和逻辑框图。

    例如 A(B+C) 这个表达式中,两个输入值B和C进行或运算。这个结果和A作为与运算的输入,以产生结果。对应的逻辑框图如下

    在这里插入图片描述
    《计算机科学概论》P69

    分析:(门关系)

    1. A(B+C)为1,则A与B+C都必须为1
    2. B+C为1 则 B和C不能全部为0
    3. A为0则输出为0(A(B+C))

    对应的真值表如下

    ABCB+CA(B+C)
    00000
    00110
    01010
    01110
    10000
    10111
    11011
    11111

    我们可以使用真值表任一行去验证结果。
    比如第三行
    A=0 B =1 C=0 B+C=1+0=1(或门,有一个输出1就行) A(B+C)=0(B+C=1)=0
    (与门,两个输出必须同为1才输出1,否则输出0)

    逻辑代数(布尔代数)所表示的是逻辑关系,而不是数量关系。

    比较这两个例子的最后的一列,完全一致。这就是电路等价

    电路等价:对应每个输入值组合,两个电路都生成完全相同的输出

    在了解了上面的基础知识后,我们就可以利用可证明数学的法则来设计逻辑电路。

    性质
    交换律AB=BAA+B=B+A
    结合律(AB)C=A(BC)(A+B)+C=A+(B+C)
    分配率A(B+C)=(AB)+(AC)A+(BC)=(A+B)+(A+C)
    恒等A1=AA+0=A
    A(A’)=0A+(A’)=1
    德·摩根定律(AB)‘=A’OR’B’(A+B)‘=A’B’

    德·摩根定律:
    这个定律声明,对两个变量的与操作的结果进行非操作等于对每个变量进行非操作后再对他们进行或操作
    也就是说对与门的输出求逆,等价于先对每个信号求逆,然后再把他们传入或门
    (AB)‘=A’+B’
    这个定律的第二部分是,对两个变量的或操作的结果进行非操作,等于对每个变量进行非操作后在对它们进行与操作
    就是对或门的输出求逆,等价于先对每个信号求逆,在把他们传入到与门
    (A+B)‘=A’B’

    加法器

    在数字电路中,常用的组合逻辑电路加法器、编码器、译码器等,这里主要介绍加法器

    计算机能执行的最基本运算就是把两个数相加。那么是如何通过组合电路来实现的呢?这就是本篇重点呀~。

    与所有计数系统中的加法一样,对两个二进制数求和的结果可能产生进位值。二进制中,1+1=10.计算两个数位并生成正确进位的电路叫半加器。

    加法器:对二进制执行加法运算的电路
    半加器:计算两个数位并生成正确进位的电路
    全加器:计算两个数位的和。并考虑进位输入的电路

    半加器

    求二进制A和B的的所有可能,真值表如下:

    AB进位
    0000
    1010
    0110
    1101

    注意:1+1=10 (二进制就是2用10表示,单个门电路只输出1位,所以和为0,进位为1)

    如果把和与进位列同各种门的输出作比较,会发现~——和对应异或门进位对应与门

    于是此半加器表示如下:
    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
    布尔表达式如下:

    								 和=A⊕B(异或门)
    							    进位=AB	(与门)	
    
    • 1
    • 2

    异或门真值表

    ABX
    000
    011
    101
    110

    注意:半加器不会把进位(进位输入)考虑在计算之内,所以半加器智能计算两个位数的和,而不能计算两个多位二进制数的和。
    在这里插入图片描述
    计算01+01的和,表示如下 (低位和低位相加,高位和高位相加。上高下底。)
    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)

    现在这个值就不对了呀!下面得到的值没有传给上面。即无法接受进位。

    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)

    全加器

    全加:实现两个一位二进制数相加,且考虑来自低位的进位。

    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)

    可以用两个半加器构造一个全加器。求和的输入必须是进位输入以及两个输入值的和。也就是说,把从半加器得到的和与进位输入相加
    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)
    分析一下值哈(具体电路没必要了),这个电路有3个输入,即原始的数位A和B以及进位输入Ci。因此此真值表有8行(3个输入 23=8,有问题吗?没有问题)

    ABCiYCo
    00000
    00110
    01010
    01101
    10010
    10110
    11001
    11111

    最后简化公式。无视就行
    Y=(A⊕B)⊕Ci
    Co=AB+Ci(A⊕B)

    在这里插入图片描述
    在这里插入图片描述
    上图截取(https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d)

    8个全加器组合起来就可以计算8位的二进运算了哦~ 8位二进制就是1字节了~。

    两个八位值相加,需要复制8次全加器电路。一个位值得输出将作用于下一个位值得进位输入。最右边的进位输入是0,最左边的进位输出将被舍弃(通常会生成溢出错误,必然的,我就8个加法器也就能显示8位,到第9位可不就是超了~)

    参考资料

    1. 编程前你最好了解的基本硬件和计算机基础知识(数字电路) https://www.bilibili.com/video/BV1Hi4y1t7zY?p=5&vd_source=743ccd142aebf9f406282dcc02bc441d
    2. 《计算机科学概论 第5版》
  • 相关阅读:
    Python matplot工具包之一的 mpl_toolkits绘制属于你的世界地图
    Selenium入门教程
    Linux基础概念--进程、子进程、进程组和会话
    894. All Possible Full Binary Trees
    C++ 编译报错error: invalid new-expression of abstract class type
    Flink流数据生成器(DataGenerator)
    百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\TrajectoryStitcher类代码详解
    UnsatisfiedDependencyException: Error creating bean with name ‘
    GitHub+Hexo博客搭建
    从零开始搭建自己的cli脚手架
  • 原文地址:https://blog.csdn.net/weixin_45020839/article/details/125375362