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

如上图所示为晶体管的一个粗略示意图,可以视为一个简单的开关。当我们将电流加入到基级也就是竖直的这根线上(基级)时,会允许电流从晶体管的一端流向另一端。各引脚位置如图2所示。
具体来说,基极上的电流能够激活晶体管内部的导电通道,使得原本可能处于阻断状态的电子流得以通过。这一变化直接导致了一个显著的效应:电流开始顺畅地从晶体管的一端(通常是发射极)流向另一端(集电极)。

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

本质上晶体管可以被视为开关,但它不是机械运动,而是通过使用电信号来操作,在此示例电路中我们使用的是 晶体管通过利用基极端子作为输入和发射极端子作为输出信号来打开和关闭 LED。
我们可以用开关模拟输入信号并用 LED 直观地表示输出信号让我们将其称为一个简单的门。 当输入为零时输出为零,当输入为 1 时输出为1 。这里的逻辑类似与门。

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

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

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

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


ADDER
0+0=0;
0+1=1;
1+0=1;
1+1=2;
因为2无法使用单个的二进制数来表示,所以遇到这个情况时,我们通常用进位溢出来表示该值。
简单来说就是将二进制的值用不同的位代替,其中sum的值采用异或门求得,

进位carry的值采用与门确定

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

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

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

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

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

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

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

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

ps:现代CPU通常采用流水线(Pipeline)或其他并行处理技术来提高指令执行效率。这意味着CPU可以同时处理多条指令的不同阶段,但每条指令的执行仍然是串行的(即一次只能执行一条指令的一个阶段)。
因此通过采用二进制解码器,我们就能够创建改变传入的二进制数就可以在多个运算单元中进行选择的电路。

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

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

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

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

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

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