句容网站建设开发,动漫设计专业就业前景,无忧传媒在短视频领域的成就,聊城百度做网站的课程链接#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理#xff08;11-39--#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路#xff0c;想要了解计算机组成的基本原理#xff0c;还是需要有… 课程链接 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理11-39--_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路想要了解计算机组成的基本原理还是需要有一些集成电路的基本知识。就让我们从最简单的门电路的实现开始吧。
1. 门电路的基本原理
晶体管是构成现代集成电路的基本原件通常使用的是MOS晶体管MOS晶体管又主要有2种类型N型MOS管和P型MOS管。N MOS导通的条件是Gate端连接了高电平P MOS正好相反其导通条件是Gate端连接了低电平。这就好比我们有2种类型的水龙头一种当我们把把手向下压的时候会出水另一种当我们把把手向上拉的时候会出水。
那如何用晶体管构建逻辑门呢
1. 非门
最简单的一种逻辑是非门只需要两个晶体管就可以实现。我们来看一下非门是如何工作的VDD连接的是电源也就是高电平1接地表示低电平0。当A为0是P MOS导通N MOS不通此时高电平1传送到Y。当A为1时P MOS不同N MOS导通此时低电平0传送到Y。这样就实现了非门的功能。
2. 与门
虽然我们需要的是与门但实际上与非门比与门的实现更为简单所以实际用与非门和非门来实现与门。
与非门使用4个晶体管来实现。我们这里来看一下与非门的工作过程。当A1,B1时两个N MOS导通两个P MOS不通所以低电平0传送到了Y。当A1,B0时或A0,B1或A0,B0时两个P MOS中至少有一个导通所以高电平1传送到了Y。
除了非门和与门其他比较常见的还有或门和异或门。这些逻辑门可以用于实现计算机中所要求的各种逻辑运算如and, or等。 2. 寄存器的基本原理
在CPU中用来存储信息的非常重要的部件就是寄存器。比如说0号通用寄存器在MIPS的体系结构中是一个32位的寄存器从电路实现上来说这32个bit都是一样的我们来看其中一个它可以用一个叫做D触发器的部件来实现。 1. D触发器
触发器是一个具有存储信息能力的基本单元它也是由若干逻辑门构成的这里我们不深入到它的实现细节而关注它提供的功能。触发器有很多种类型D触发器是其中一种。
D触发器有一个数据输入一个数据输出和一个时钟输入。它的功能表现是这样的在时钟的上升沿采样输入D的值传送到输出Q其余时间输出Q的值不变。 如果我们把32个D触发器组合起来就可以构成一个32位的寄存器当然这只是一个简单的原理性实现现实中寄存器的实现要复杂得多。用这样一个32位寄存器就可以构成CPU中的一个通用寄存器用同样的方法可以做出其他的通用寄存器以及PCIR这样的寄存器再将这样的寄存器与其他由逻辑门构成的电路相连就构成了我们这个复杂的CPU了。
3. 逻辑运算的实现
现在我们已经掌握了基本的门电路可以提供简单的逻辑运算例如与门可以实现2个bit的与操作。但是这和计算机中与运算指令所需要的功能还是有差距的例如and rd,rs,rt这条指令它的两个源操作数和目的操作数都是32位的寄存器。那么我们怎么用与门来完成呢其实也很简单我们就把32个与门并排连起来将32位的输入分别连接到这32个与门上输出再整合到一起变成1个32位的输出。 类似地如果要完成或运算指令则需要32个或门。 那在ALU当中实际上是包含了多种不同的功能部件包括刚才提到的32位的与运算32位的或运算以及其他的逻辑运算和算数运算。那它们是怎样合成一个整体的呢通过一个多选器来实现这个多选器实际上也是由若干个门组成的。 回到之前的逻辑运算的实例。如果要实现and $8,$9,$10的运算实际上是在控制电路的控制下将9号10号寄存器的内容分别传送到ALU的两个输入端根据控制电路给出的and指令进行操作最后将结果送回到8号寄存器。
这就相当于左边这张图所显示的电路的连接。最上面是由32个D触发器组成的8号寄存器中间是9号寄存器下面是10号寄存器9号和10号寄存器的Q端的输出会被连接到ALU的输入同时ALU的功能选择信号输入了与运算所对应的编码然后ALU的输出会被连接到8号寄存器的输入D端所以在某一个时钟周期内ALU会完成相关的计算等到下一个时钟上升沿来临时8号寄存器就会将ALU的输出存入到寄存器内部。 4. 算数运算的实现
加法和减法是两种基本的算数运算它们在硬件上是如何实现的呢
1. 加法运算
先来考虑如下两个4-bit二进制数相加的情况对于每一位的相加来说实际上需要做这么几项工作1. 两个1-bit二进制数相加2.如果低位有进位的输入的话需要参与运算3.最后如果产生进位也要进行输出。 对于两个1-bit二进制数相加可以通过半加器实现。半加器由一个异或门和一个与门组成它有两个输入端口A,B两个输出端口SC(表示进位)。举例当输入AB分别为01时异或门结果为1与门结果为0正好符合相加的运算。 半加器距离实现一个完整的加法运算还差一点它不能将低位的进位输入加进来。所以为了实现这个功能需要引入另一个半加器构成一个全加器。 现在我们再回头看4-bit的加法其实就是将4个全加器串联起来。 和4位加法器一样我们可以很容易地构建出32位的加法器。这样的加法器就可以满足加法运算指令的需求。 add和addu这两条指令的区别在于对溢出的处理不同。
2. 溢出的处理
溢出Overflow是指运算结果超出了正常的表示范围。溢出是仅针对有符号数运算来说的。具体表现就是如果两个正数相加结果变成了负数或者两个负数相加结果变成了正数这显然是不正确的这种情况就是由溢出造成的。
来看一个例子00113和01015相加如果这两个数是无符号数那计算结果是10008是正确的但如果是有符号数那1000相当于-8这就是不正确的。
这里我们还需要注意进位和溢出的差别下面给出了两个例子有时会出现有溢出无进位的情况有时也会出现有进位无溢出的情况。因为溢出表示的是有符号数超出表示范围的情况进位也可以看作是无符号数超出表示范围的情况。 但是进位是很好判断的全加器本身就有进位的输出那溢出又该如何判断呢其实也很简单就是当 最高位的进位输入 ! 最高位的进位输出 时就是发生了溢出。以上面的00110101为例最高位的进位输入是1而最高位的进位输出是0此时发生了溢出。
在硬件上如何实现溢出的判断呢可以在刚才的全加器上做一点改动。C31是最后一位的进位输入Cout是最高位全加器的进位输出把这两个信号连出来接一个异或门即可。 另外还需要说明的一点是对于一个加法器的硬件实现它并不关心这两个输入数是有符号数还是无符号数或者说它对于有符号数和无符号数的处理是一样的。因此是不是要处理溢出以及如何处理溢出就不能只交给硬件来做。不同体系结构有不同的方法。
1. MIPS对溢出的处理
对于MIPS来说它提供了两类不同的指令来分别处理。如果编程人员想将操作数看成有符号数需要处理溢出则需要使用addaddi指令。这样的运算在发生溢出时会产生异常也就是说控制电路会检查加法器产生的overflow的信号如果overflow信号有效控制电路就会当作一个异常的情况处理。如果编程人员想将操作数堪称无符号数不处理溢出则需要使用addu和addiu指令。在使用这两条指令时控制电路不会检查加法器输出的overflow信号。
所以说MIPS处理溢出的方式是提前做准备按照是否要处理溢出采用不同的指令进行运算。 2. X86对溢出的处理
X86则采取了另一种方式。它并没有根据是否处理溢出分成两种指令X86指令如果产生溢出并不会直接由控制电路检查到并进行处理而是将加法器产生的溢出信号传送到了标志寄存器的OF位。如果想对溢出进行处理则在后续的指令中需要检查标志寄存器的OF位是否为1并进行相应的操作。 3. 减法运算
其实减法是可以很容易地转换成加法的例如A-BA(-B)。但我们需要注意的是怎么把B转换成-B呢计算机当中是用补码来保存二进制数的把B转换成-B可不是在前面加一个负号这么简单。补码表示的二进制数的相反数有如下的转换规则按位取反末位加一。规则是如何来的可以看右边的举例。 根据这个规则我们在加法器的基础上实现减法器就容易了。在加法器的基础上原来的输入A和B都不变我们增加了一个新的输入叫做sub-mode只有1个bit它首先控制了一个二选一的多选器如果sub-mode0代表执行加法操作那么会将多选器的左边这个通路选通。如果sub-mode1代表执行减法操作这时将多选器的右边这个通路选通此时B需要经过一个非门变成~B同时sub-mode1控制了C01表示多加1和减法的计算公式相符。
这样我们通过这个改动这个功能部件又能实现加法又能实现减法。 4. 加法器的优化
ALU提供的加法和减法究其本质都是由加法器来实现的。我们现在学习的加法器是由一个一个的全加器串联而成它在性能上存在着很大的问题。以4-bit加法器为例当把所有输入都准备好时其实只有最右边的全加器可以开始工作等它计算完了产生新的进位第二个全加器才能开始工作。这样进位输出像波浪一样从低位向高位传递的加法器叫做行波进位加法器Ripple-Carry Adder, RCA。这种加法器的优点是电路布局简单设计方便。它的缺点也很明显就是高位的运算必须等待低位的运算完成延迟时间长。 我们来分析一下行波进位加法器的延迟情况。延迟最长的路径也被称为关键路径的延迟时间是2n1T。也就是说对于4-bit的加法器延迟时间是9T对于32-bit的加法器延迟时间是65T。 这个时间参考28nm的制造工艺1.3GHz的主频表示时钟周期是0.66ns这就是最近的两个时钟上升沿之间的时间长度。因为加法器的输入是来自寄存器而且加法器的输出包括运算的核进位的输出都是要传递到寄存器保存起来的所以说这些信号从前一级的寄存器经过加法器的所有逻辑一直到下一级寄存器的输入不能超过0.66ns。但实际情况是对于32-bit RCA来说延迟时间大约为1.3ns远远超过了0.66ns。采用这样的加法器它的主时钟频率最多也只能达到769MHz。所以说这样的加法器与现实中使用的加法器性能差距是非常大的。那我们应该如何进行优化呢 分析行波进位加法器的问题所在影响性能的主要问题在于高位的运算必须等待低位的进位输出信号。那么优化思路就是能否提前计算进位输出信号
我们对进位输出信号进行分析。对于每一个全加器它的进位输出信号记为Ci1它能通过3个输入Ai,Bi,Ci计算得到。通过换算我们设置两个新的变量Gi和Pi这两个变量是由Ai和Bi产生的他们都是在运算之初就能确定了的信号。 通过代入计算C1,C2,C3,C4都能够通过Gi,Pi和C0计算得到这些都是在运算之初就能确定了的信号因此我们就有了提前计算进位输出信号的方法。用这样的方法实现的加法器叫做超前进位加法器Carry-Lookahead Adder, CLA。 那它在硬件上是如何实现的呢如下图可以看到计算Ci1的延迟时间固定为3级门延迟与加法器的位数无关。然后最后一级的全加器还要计算S位的输出因此再多1级门延迟总延迟时间为4T。 我们再考虑32-bit加法器如果采用行波进位加法器总延迟时间为65T如果采用超前进位加法器理想的总延迟时间为4T但是实际上电路过于复杂难以实现。所以通常的实现方法是采用多个小规模的超前进位加法器拼接而成例如用4个8-bit的超前进位加法器用行波进位的方式连接起来从而构成一个32-bit的加法器。这样的实现下4级CLA的延迟时间为0.26ns0.02*3级门延迟得到C4*3级CLA0.02*4级门延迟得到S*最后1级CLA0.26ns这样就可以运行在3.84GHz的时钟频率下那么它就不会成为我们整个复杂的CPU设计的关键路径了。