认识 CPU 底层原理(2)——逻辑门
本文为B站UP主硬件茶谈制作的系列科普《【硬件科普】带你认识CPU》系列的学习笔记,仅作个人学习记录使用,如有侵权,请联系博主删除
上一篇文章我们从最基本的粒子的角度认识了组成CPU的最基本单元MOSFET的原理。CPU作为计算机的核心硬件,其最主要的功能是进行运算,本章我们将会介绍CPU设计者是如何使用MOSFET组合出更强大的运算单元的。
逻辑运算
为了能够讲清楚计算机是怎么进行计算的,我们首先要从逻辑运算讲起。
逻辑运算指的是“条件”与“结论”之间的一种关系,是对因果关系进行分析的运算,其运算结果并不表示数制的大小,而是表示逻辑概念成立还是不成立。
举例:小帅喜欢吃苹果,小美不喜欢吃苹果。则我们可以得到推论:两人都喜欢吃苹果这个事情为假;两人其中至少一个人喜欢吃苹果这个事情为真;两人都不喜欢吃苹果这个事情为假。
上面这个例子中,小帅喜欢吃苹果,小美不喜欢吃苹果就是“条件”,后面的推论就是逻辑运算的“结论”。逻辑运算就是对逻辑进行代数抽象,用数学的方式表达逻辑推论的过程的一种代数运算。
逻辑运算的种类
从代数的角度看,最简单的逻辑运算有这么几种:非运算,与运算,或运算,异或运算,同或运算。
如果我们用数字1表示条件为真,数字0表示条件为假,则上述几种逻辑运算可以被表示为以下运算表(数学上称为真值表),最后一列均表示括号中的推论是否为真:
非运算
条件A | 推论(非A成立) |
---|---|
1 | 0 |
0 | 1 |
与运算
条件A | 条件B | 推论(A与B同时成立) |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
或运算
条件A | 条件B | 推论(A或B成立) |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
异或运算
条件A | 条件B | 推论(A与B不同) |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
同或运算
条件A | 条件B | 推论(A与B相同) |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
逻辑运算与算数运算的关系
明白了逻辑运算的原理,你可能会问这跟计算机有什么关系?
我们都知道,任何信息在计算机中都是使用二进制的方式存储和计算的。比如十进制数19在二进制中表示为10011,十进制数5在二进制中表示为101,19+5的结果是24,用二进制数表示为11000。
下图为十进制竖式加法的运算过程
先加个位,9加4超过10,因此向十位进1,个位写4,再把十位上的数和进位相加,1加1等于2没有超过10,因此十位相加的结果是2,最后算出来的结果是十进制数24。
下图是对应的二进制竖式加法的运算过程
其实运算法则与十进制相同,十进制是每一位相加满10进1,二进制加法同样是每一位相加,满2进1。最后得到二进制结果11000,刚好也是十进制的24。二进制计算结果与十进制是等价的,由于1和0在计算机中非常天然的可以使用高低电平来表示,因此计算机使用二进制数进行与十进制等价的各种运算。
让我们看一下最基本的两个1位二进制数相加的结果,如果不考虑进位的话,那么1+1的结果是0,1+0的结果是1,0+1的结果也是1,0+0的结果是0。发现了吗,这其实与上一节逻辑运算中异或运算的真值表是相同的。
我们再看一看两个1位二进制数相加的进位是什么情况,1+1进位是1,1+0进位是0,0+1进位是0,0+1进位是0,同样的与上一节逻辑运算的结果比较,可以发现这个结果是与逻辑运算中的与运算真值表相同。
这是两个一位二进制数相加的情况,可以想象,两个多位二进制数相加其实就是对每一位先用异或运算求出该位的值,再用与运算求出该位的进位,就能得到最终的结果。这样我们就把计算机中的算数运算与逻辑运算建立了关系。只要进行简单的逻辑运算,我们就可以在计算机中计算加法。如果能计算加法就能计算减法,因为减法相当于一个数加另一个数的负数。同样如果能计算加减法就能计算乘除法,因为乘法相当于是多个相同的数的加法。
可以想象到,当有了四则运算,计算机就可以做大部分数学计算了。
逻辑门电路
好啦,现在已经掌握了所有基础知识,我们就可以学习逻辑运算是如何通过电路实现的了。MOSFET的作用其实就是构建上述几种逻辑运算器的基本组件,那么我们就看一下如何使用MOSFET来构建上述的逻辑运算。由电子元器件构成的逻辑运算单元就被称为逻辑门电路。
非门电路
上一篇文章我们已经简单的介绍了非门电路的组成,这里我们再复习一下。
供电电压是高压电平,接地电压是低压电平。上面的MOSFET是PMOS,下面的是NMOS。由PMOS和NMOS的特性可知:
- 当A接入高电平,PMOS不导通,NMOS导通,B端相当于与接地电压联通,输出低电平。
- 当A接入低电平,PMOS导通,NMOS不导通,B点相当于与供电电压联通,输出高电平。
当我们把高电平定义为1,低电平定义为0,那么这正是非门的运算结果,电路符号如下图:
或门电路
或门电路的组成,符号和真值表如下图所示:
让我们看看当A和B输入0时,Y是如何得到输出结果的
当A和B输入0时,两个PMOS导通,两个NMOS不导通,左半边输出高电平,红框是我们上面讲的非门电路,因此最终Y端输出低电平0。其他情况大家可以自行推导。
或门的作用是,只要有一个输入为1,输出就是1,只有当两个输入都为0,输出才是0。
与门电路
下图是与门电路的组成,符号和真值表:
我们来看一下当A和B均输入1时,Y的输出情况:
当A和B同时输入1,左边两个PMOS不导通,两个NMOS导通,这时左半边输出为低电平0,经过右边的非门转化为高电平1。其他情况大家可以自己推导。
与门电路的作用是,只有当两个输入都为1时输出才是1,否则输出均为0。
异或门电路
下图展示了异或门电路的组成,符号和真值表,同时也展示了当A和B端均输入1时,输出端Y的结果推导过程:
异或门电路的主要作用是,当A和B的输入相同时,输出0,否则输出1。
可以看出上图中为了构建异或门电路,一共使用了10个MOSFET,然而真实使用中,人们研究出了一种更节省材料的方法来实现异或门电路,其电路图如下所示:
中间由一个PMOS和一个NMOS两端相连组成的单元叫做传输门,虽然两个MOS组合在一起,其各自的作用还是不变的,与原始电路比较,这里只用了6个MOSFET就组成了异或门电路。
总结
本篇我们学习了逻辑运算与算数运算的等价性,更进一步认识了组成这些基本逻辑运算的电路。下一篇文章我们会继续深入,看看这些基本的逻辑运算电路是如何组成一个计算加法的加法器的。
认识 CPU 底层原理(2)——逻辑门的更多相关文章
- 并发之volatile底层原理
15.深入分析Volatile的实现原理 14.java多线程编程底层原理剖析以及volatile原理 13.Java中Volatile底层原理与应用 12.Java多线程-java.util.con ...
- NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理
NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 之 ...
- volatile底层原理详解
今天我们聊聊volatile底层原理: Java语言规范对于volatile定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致性地更新,线程应该确保通过排它锁单独获得这 ...
- JMM和Volatile底层原理分析
JMM和volatile分析 1.JMM:Java Memory Model,java线程内存模型 JMM:它是一个抽象的概念,描述的是线程和内存间的通信,java线程内存模型和CPU缓存模型类似,它 ...
- Docker底层原理介绍
1.docker介绍 1.1什么是docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻 ...
- Java面试底层原理
面试发现经常有些重复的面试问题,自己也应该学会记录下来,最好自己能做成笔记,在下一次面的时候说得有条不紊,深入具体,面试官想必也很开心.以下是我个人总结,请参考: HashSet底层原理:(问了大几率 ...
- 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理
1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...
- (前篇:NIO系列 推荐阅读) Java NIO 底层原理
出处: Java NIO 底层原理 目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步 ...
- 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看
前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ ...
- 「MoreThanJava」一文了解二进制和CPU工作原理
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
随机推荐
- Maven项目的创建教程
1.创建Maven项目 首先File->New新建一个Maven项目,选择相应地址保存,点击CREATE完成新建 2.改成Web项目 右键选择Add Framework Support... 再 ...
- 使用 zeromq与cppzmq 程序退出遇到的坑
在使用zeromq 退出的时候还遇到一点坑,对于服务deaman(守护进程)化的进程可能会遇到这个问题. 现象: 这个问题导致的现象是服务一旦关闭(stop),就会 core dump,core du ...
- RunnerGo可视化场景管理,还原真实场景
在进行性能测试时,测试场景的正确配置非常关键.首先,需要根据业务场景和需求,设计出合理的测试场景,再利用相应的工具进行配置,实现自动化的性能测试. 在JMeter中,用户需要自己组织测试场景,或是在同 ...
- 解放生产力:30+实用AI工具汇总
除了ChatGPT,还有哪些好用AI工具?带着这个问题,也为了解AIGC已经在哪些场景落地,我体验了30多个AI工具并且分享出来,希望对你有帮助. 文字 ChatGPT -- 解决任何问题地址:htt ...
- .net core 自定义授权策略提供程序进行权限验证
.net core 自定义授权策略提供程序进行权限验证 在这之前先了解一下鉴权和授权的概念: 鉴权 鉴权可以说是身份验证,身份验证是确定用户身份的过程: 在ASP.NET Core 中身份验证是由身份 ...
- Linux 大文件按大小切割,合并还原
工作中,由于堡垒机限制,大文件无法上传,故产生切割大文件上传后合并还原的需求. 不说废话,直接上干货: 切割: 1.1G文件,切割为200M大小的几个文件: split ...
- LabVIEW Actor Framwork (2)________ 边学边做server&client
回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...
- kubernetes 的TCP 数据包可视化
kubernetes 的TCP 数据包可视化 介绍 k8spacket是用 Golang 编写的工具,它使用gopacket第三方库来嗅探工作负载(传入和传出)上的 TCP 数据包.它在运行的容器网络 ...
- AndroidBanner - ViewPager 03
AndroidBanner - ViewPager 03 上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题: 当banner不可见的时候,也需要停止 ...
- day08 元组字典集合
day08 元组 集合 字典 元组 """ 小括号括起来,内部存放多个元素,元组之间逗号隔开,元素不可改变,元素类型不能是任意的, """ ...