计算机底层知识点(一)晶体管与CPU执行指令之间的联系

该文主要通过详细介绍晶体管在CPU执行指令时的作用。本文所讲解例子为NPN型二极管。这里简单介绍一下,NPN是共阳极,即两个NP结的P结相连为基极,另两个N结分别做集电极和发射极,发射极电流 =集电极电流 + 基极电流

图5 LED两脚分别接NPN型三极管的发射极与集电极

如上图所示为晶体管的一个粗略示意图,可以视为一个简单的开关。当我们将电流加入到基级也就是竖直的这根线上(基级)时,会允许电流从晶体管的一端流向另一端。各引脚位置如图2所示。

具体来说,基极上的电流能够激活晶体管内部的导电通道,使得原本可能处于阻断状态的电子流得以通过。这一变化直接导致了一个显著的效应:电流开始顺畅地从晶体管的一端(通常是发射极)流向另一端(集电极)。

图2 晶体管各引脚定义
图2 晶体管各引脚定义

一个晶体管中,通常有三个端子,一个集电极,一个发射极和一个电路中的基极,它可以充当绝缘体,防止电流在集电极和集电极之间流动。 发射极端子,但如果我们向基极端子施加小电流,它就会充当允许电流流动的导体。如图3所示为导通后的晶体管。

图3 导通的晶体管示意图

本质上晶体管可以被视为开关,但它不是机械运动,而是通过使用电信号来操作,在此示例电路中我们使用的是 晶体管通过利用基极端子作为输入和发射极端子作为输出信号来打开和关闭 LED。

我们可以用开关模拟输入信号并用 LED 直观地表示输出信号让我们将其称为一个简单的门。 当输入为零时输出为零,当输入为 1 时输出为1 。这里的逻辑类似与门。

图4 LED两脚均接NPN型三极管的发射极

改变LED之间的排列方式。此时当LED两个引脚分别接在三极管的集电极和发射极之间时。三极管导通时,LED之间的电压差非常小。此时两侧的正向电压不足以达到需要发光的阈值状态,保持熄灭状态。此时输入设置为1时,LED灯熄灭为0。当输入设置为0时,LED亮起为1。这里的逻辑类似非门。

将两个晶体管串联起来,可以抽象为与门。

图6 与门与其真值表
​​​​​

与门,当输入有0时输出为0,仅当仅有输入全时输出为1。

图7 与门性质

将两个晶体管串联起来,可以抽象为或门。

图8 或门结构与真值表

我们可以利用这些基础的逻辑门组成更复杂的逻辑电路。下图就是一个基础的异或门。

图9 异或门的构成及其真值表

图10 异或门的内部晶体管排列位置

ADDER

0+0=0;

0+1=1;

1+0=1;

1+1=2;

因为2无法使用单个的二进制数来表示,所以遇到这个情况时,我们通常用进位溢出来表示该值。

简单来说就是将二进制的值用不同的位代替,其中sum的值采用异或门求得,

图11 利用异或门确定半加法器中的sum值

进位carry的值采用与门确定

图12 利用与门确定半加法器中的进位carry的值

将与门及异或门相结合就可以得到我们想要实现得二进制加法器,但是该加法器存在一个缺陷。就是只可以对单个位的二进制数进行加减。

图13 半加法器结构图

但是对于以下大于或者等于两位的二进制数计算来说,加法器不仅需要考虑原来两个输入二进制单位数相加,还需要考虑将前一个半加法器的进位相加。此时一个半加法器只有两个输入,无法满足要求。

图14 半加法器在进行多位二进制数相加时会进位溢出

此时我们根据需要设置一个电路结构,该电路结构可以同时对三个输入进行处理。我们将其称为全加器。

图15 全加器及其真值表

例如1+1就时x=1,y=1,进位为0,此时结果为0B10。0B101+0B111=0B1100则可以使用三个全加器进行计算。

图16 使用全加器进行二进制的计算

以此类推,所以八位的二进制数与八位的二进制数应该使用八个加法器来进行运算。

图17  使用八个全加器进行两个八位二进制数之间的运算

但是这个时候需要注意,此时当两个输入的值之和等于大于0B1111 1111+0B0000 0001时,会导致该八位加法器的值溢出。

图18  使用多一位来检测进位是否溢出

以此类推,我们可以利用晶体管搭建逻辑门搭建对应的运算单元。CPU就可以通过这些单元来进行对应的计算。右边为汇编语言,也就是机器所使用的语言。常用的运算单元由加减乘除,常用的逻辑单元有与、或、非、异或。

图19 ALU的部分组成单元

但是计算机并不能直接识别LOAD这些语言来去控制对应的运算单元,只可以识别最底层的0和1。此时我们需要一个二进制解码器,将读取到的指令进行解码从而去进行操作对应的单元。这里的每个组合在接收到我们所希望的输出位置的二进制数后,都会触发要激活的特定输出,同时停用所有其他输出。

图20 二进制解码器的逻辑门组成结构

ps:现代CPU通常采用流水线(Pipeline)或其他并行处理技术来提高指令执行效率。这意味着CPU可以同时处理多条指令的不同阶段,但每条指令的执行仍然是串行的(即一次只能执行一条指令的一个阶段)。

因此通过采用二进制解码器,我们就能够创建改变传入的二进制数就可以在多个运算单元中进行选择的电路。

图21  二进制解码器的使用

现在我们回到上面所提到的汇编指令,汇编代码其实就是机器代码的人类友好表示。实际代码由计算机可以理解的0和1组成。

图22 汇编代码在计算机中的实际表示

在计算机中,如果指令的前两位为0,计算机将其解释为算术运算。第三第四位则确定将要执行的算数运算的类型。如果为00则表示加法,如果是01则表示减法。这两位数我们通常将之称为操作代码,每个操作代码有且仅有一种算术运算。

图23 汇编指令中的操作码

当CPU确定当前指令是算术运算时,神秘组件会接收到该操作代码,并在内部将这两个位链接到解码器,用于识别所需的内部操作。这里的直接方法是允许所有电路接收输入。并生成各自的输出。但是解码器的输出是互连的。以一种只允许所选操作的输出通过此操作的方式控制组件。

图24 操作代码在cpu中被识别所起到的作用

我们的神秘组件也可以装在一个盒子里,这是一个基本的以及被称为算术逻辑的东西的不完整版本。这就时我们常说的ALU(算术逻辑单元)。

图25 ALU算术逻辑单元

但在此之前,算术逻辑单元接受输入值以及一个告诉内部电路的操作码在这些值之间执行什么算术运算它生成指定操作的结果以及其他信息如结果是否为负 0或者如果它已经溢出。

图26 算术逻辑单元的宏观展示

到这里,我们就大概了解了晶体管是如何通过不同方式的连接来实现cpu的运算功能啦。后面能挤出时间应该会陆陆续续地更新其他部分的内容。

猜你喜欢

转载自blog.csdn.net/qq_51519091/article/details/140281872