2.2.1_1 加法器
*文章整理自王道公开课程《王道计算机考研 计算机组成原理》,文中时间节点与本节课程视频相对应。
课程重点详细勾画请WX搜索GZH:玄默冲虚
00:00
各位同学大家好,在这个视频中我们要学习怎么设计一个加法器。首先我们会介绍加法器应该具备的基本功能。然后我们会尝试着用门电路实现一个支持一比特加法的一位全加器。接下来基于一位全加器,我们会实现一个可以支持N比特并行相加的并行加法器。并行加法器又可以进一步的划分为串行进位和并行进位这样的两种。最后我们又会基于并行加法器进行扩充,得到加法器的终极形态,也就是带标志位的加法器。
00:38
好,首先来看一下加法器应该具备的基本功能。顾名思义,加法器就是用于实现加法运算的,比如我们可以用加法器完成7加12等于19这样的加法运算。被加数A加数B分别用8比特来表示加数。被加数作为加法器的两个输入,经过加法器的处理之后,得到恩比特的运算结果,也就是输出。
01:11
如果我们能用逻辑门电路去实现这样的一个N比特加法器,那么这件事情简直是太酷了。我们不妨先分析一下,我们手算这两个二进制加法的时候是怎么处理的。我们会从最低位开始逐位的相加,并且向更高位产生一个进位,对每一个位的处理都是一样的,当我们从低到高处理完所有位的加和运算之后,就得到了最终的一个结果。
01:43
为了方便描述,我们不妨当前正在进行运算的这两个位称为本位。Ai表示来自被加数A的本位,Bi表示来自加数B的本位。除了这两个本位的信息之外,我们还需要考虑来自更低位的进位信息。我们把这三个比特相加就可以得到本位的和。另外我们还会向更高位产生一个进位的信息。N个比特的加法运算可以被拆解为N次的一位加法,我们只需要一位一位的往前加就可以。
02:26
好,现在我们尝试着用门电路去实现一位的加法,我们要设计这样的一个电路,有三个输入值,分别来自于被加数和加数的本位信息,以及来自更低位的一个进位信息,这是电路的输入值。经过电路的处理之后,我们希望得到这样的两个输出,分别是本位和SI以及向更高位的进位CI,首先来看怎么用这三个输入值来确定SI的值。经过观察不难发现,当这三个输入值有奇数个1的时候,那本位和就是一。而如果这三个比特有偶数个1,那本位和肯定就是0。那本位和SI的逻辑表达式就可以用异或运算来实现。三个比特进行异或运算,如其中有奇数个一,那么运算的结果肯定就是一,接下来把这个逻辑表达式变成电路,我们可以用两个异或门就可以实现这个逻辑,AI,BI,CI-1,经过两次异或得到本位和SI,这样我们解决了怎么用电路求出本位和的问题。
03:48
接下来还需要确定怎么用电路求出本位向更高位的进位信息。通过观察不难发现,当这三个比特当中只有一个一的时候,那向更高位的进位肯定是0。而如果三个比特当中有两个或者两个以上的一的时候,那向更高位的进位肯定就是一。所以这就是进位信息CI的一个运算逻辑。
04:17
我们可以用这样的方法确定CI的值。首先当两个本位都为一的时候,一定会向更高位产生进位。另外如果AI和BI当中只有一个一,并且来自更低位的进位,CI减一也等于一,那么在这种情况下也会向更高位进一。那这两个条件当中满足任何一个条件都会向更高位进一。所以在这个逻辑表达式当中,这儿我们用一个或运算把它们连起来。基于这个逻辑表达式,我们可以得到相应的电路,大家可以对比着看一下。
05:02
好,现在我们已经得到了两个输出的值,本位和SI向更高位的进位CI接下来我们把这两个电路合并一下,得到一个统一的电路。在这个电路当中我们输入AI、BI、CI-1,3个信号。经过电路的处理可以输出本位和SI以及向更高位的进位CI,通过这个电路就可以实现一比特的加法运算。
05:34
我们不妨把这个电路封装一下,屏蔽内部的这些细节,仅对外暴露出输入和输出的几条线。这就是所谓的一位全加器,英文缩写叫FA,它可以支持一比特的加法。之前我们说过N比特的加法可以拆解为N次一比特的加法。好,接下来我们把N个一位全加器给连起来。通过这个电路就可以实现N比特数的相加。我们只需要把被加数和加数的这N个比特分别接到对应的这个引脚里边就可以了。最终这个电路会给我们输出N比特的运算结果,也就是加和的信息。好,这个电路图过于复杂,我们不妨把它封装一下,屏蔽内部的一些细节,最终就呈现出这样的一个加法器的形态。
06:38
好,接下来我们来分析一下这种加法器的实现方式还有什么不足的地方。这个地方大家需要知道,虽然电路的运算速度很快,我们输入电信号之后可以很快的得到输出的电信号。但是从我们输入电信号一直到输出的电信号到达稳定的状态,中间还是需要一定的时间。也就是说前一个一位全加器,它产生的这个进位信息有一定的延迟。而只有这个进位信息确定了之后,后一个一位全加器才可以得到正确的输出的结果。因此在这个电路当中,加法进位信息的产生是一级一级的往下传递的。也就说这些定位信息是串行产生的这就意味着整个加法器的运算速度取决于这些进位产生和传递的速度。另外这个加法器的位数越多,显然运算速度也会变慢。
07:45
这种串行进位的方式又可以称为行波进位,就像一个水波一样不断的往前传,有点类似于多米诺骨牌,前面这一块倒了,后面那一块才会倒,一级一级的往前传递。好,这就是这种加法电路的不足之处,进位信息是串行产生的。那刚才这个加法器它的两个输入端可以并行的输入N个比特,因此这种加法器属于并行加法器。另外由于这种加法器它的进位信息是串行产生的,所以从进位方式的这种角度来看,它属于串行进位的加法器。
08:31
很多教材会把这两个定语都用上,把这种加法器称为串行进位的并行加法器。前者描述的是进位方式,后者描述的是可以同时支持N比特的信息并行输入。也有的教材会把这种加法器直接简称为串行进位加法器。好,这些术语需要注意一下。刚才我们分析了这种加法器的不足之处,它的主要缺点是进位信息是串行产生的那如果我们能让这些进位信息并行的同时产生,那加法器的速度就可以得到进一步的提升。
09:12
基于之前设计的这个串行进位的并行加法器,我们再增加一点点细节,就可以得到一个并行进位的并行加法器。具体来说就是把这个电路稍微的改造一下,再增加一个CLA部件。这个CLA部件会同时产生每一个进位的信息,这样就可以实现并行进位的一个效果。经过改造的这个加法器,由于它的进位信息都是并行产生的,同时产生的,所以它的运算速度也会有进一步的提升。那这个电路到底是怎么改造的,可以不用深究。感兴趣的同学可以看我们的补充视频,我们只需要知道这种并行进位的并行加法器,它的进位信息是并行产生的,知道和前面那种加法器的区别就可以。好,无论是并行进位还是串行进位,当我们把这个加法器封装了之后,都可以用这样的一个图示来表示。我们只需要关注这个加法器的逻辑功能就可以,它里面到底是串行还是并行进位,我们不用关心。
10:23
接下来我们对这个加法器再进行一点点拓展。我们思考一下加法器运算的结果一定是正确的吗?不一定,对吧?两个N比特的数相加,结果同样用N比特来表示。我们知道N比特的二进制数,它可以表示的范围是有限的,所以如果两个数相加超出了N比特能表示的范围,那最终输出的这个结果肯定就是错误的,那计算机硬件应当发现这种出错的情况,对吧?
11:02
好,另外我们有时候还需要关心加法运算的这个结果是否为零。比如当我们想要判断A和B两个数是否相等的时候,计算机硬件在背后的处理逻辑就是用A和B进行相减的操作,或者也可以把它转换成A加上负B的操作。那A加上负B就可以用加法器来实现加和的结果。如果等于0,那么是不是就说明A等于B这个条件是成立的?如果加和的结果不等于0,那么就说明A不等于B对吧?所以有时候我们需要关心这个加法器输出的结果是否为零,这对于程序的逻辑判断是非常重要的。
11:53
好,我们顺着这个思路继续思考一下。有时候我们写程序还会判断A和B到底谁大,那要判断A是否大于B是不是可以用A减掉B,那A减B就等价于A加上负B所以这个减法操作也可以用加法器来实现,对吧?而这个加法运算的结果如果大于0,那么是不是就说明A大于B这个条件是成立的?如果不大于0,那就说明这个条件不成立,对吧?好,因此有的时候我们还需要关心这个加法器的运算结果到底是正的还是负的。
12:37
好,梳理一下刚才提到的三种情况。第一种情况,我们需要关心这个加法运算是否发生了溢出。也就是说这个加法的运算结果是否超出了N比特的数可以表示的范围。第二种情况,有时候我们需要关心这个加法的运算结果是否为零。而第三种情况,我们有可能还需要关心这个加法运算的结果到底为正还是为负。好,为了让计算机硬件能识别出刚才提到的这些种情况,我们把这个加法器增加一些标志位的信息,分别叫ZF、OF、SF和CF。通过这几个标志位是零还是一就可以判断出我们刚才所关心的这几个问题。
13:27
好,来看一下。首先第一个标志位OF标志位overflow,它是溢出标志,用于判断带符号数的加减运算是否产生了溢出。当OF等于一的时候表示发生了溢出,OF等于0的时候表示没有发生溢出。
13:47
好,那与之相对应的有另一个标志位叫做CF如果把英文直译过来叫做进位借位的标志,我们先不用管它的这个翻译。CF标志位在实际应用当中,通常是用于判断无符号数的加减运算是否产生了溢出。CF等于一的时候发生溢出,CF等于0的时候没有发生溢出。
14:11
显然我们判断带符号数是否溢出和判断无符号数是否溢出这个逻辑肯定是不一样的,对吧?比如8比特的带符号数,8比特的补码可以表示的范围和8比特的无符号数可以表示的范围它肯定不一样。所以当我们对带符号数和无符号数进行加减运算的时候,判断溢出的逻辑也会不一样。因此我们需要设置OF和CF这样的两个标志位,来分别对应这两种数加减运算是否发生了溢出。
14:47
好,接下来SF这个标志位,它是符号标志,这个标志位用于判断带符号数的加减运算结果到底是正还是负。等于一的时候为负,等于0的时候为正。最后一个标志为ZF它是零标志,顾名思义就是用于判断这次加法运算的结果是否为零。当ZF等于一的时候表示结果为零,ZF等于0的时候表示结果不为零。好,这就是带标志位的加法器。我们大致了解了这四个标志位分别意味着什么。接下来我们展开介绍一下这几个标志位到底是怎么用电路来生成的。
15:36
我们把这个加法器展开,看一看它的内部实现细节。首先刚才提到的OF这个标志位,它的逻辑表达式是用最高位产生的进位CN和次高位产生的进位CN减1进行一个异或,用这样的方式去生成OF标志位,用一个异或门就可以实现刚才我们说这个标志位反映了带符号数的加减运算是否发生了一溢出。在计算机内部所有的带符号数都是用补码进行加减运算的,也就是说如果我们用两个补码进行加减运算,那么判断这个补码是否发生溢出,只需要看加法器生成的OF标志位就可以。那关于为什么可以用这样的方式去判断补码是否发生了溢出这个问题,我们留到之后再来学习。现在我们只需要知道个大概就可以。好,总之基于之前实现的这个加法电路,我们再增加一个异或门,然后拉两根线出去就可以生成OF标志位。
16:47
好,接下来第二个标志位叫SF。这个标志位的生成更简单,我们说这个标志位反映了带符号数的加减运算的正负性,也就是说补码的加减运算结果到底为正还是为负。那判断的方法很简单,对吧?我们只需要取N比特补码的最高位就可以了。所以你看SF这个标志位直接就是从最高位的这个本位和接了一根线出来。因为最高的这位对应的就是补码的符号,一表示负,零表示正好。这是SF这个标志位的生成。
17:30
接下来ZF标志位,我们说ZF是用于判断加减运算的结果是否为0。无论是带符号数补码的这个加减运算,还是无符号数的加减运算,运算的结果为0,意味着所有的这些比特位肯定都是0,也就是说当S1到SN全为0的时候,我们需要让ZF这个零标志位等于1。这个逻辑的实现很简单,只需要用一个或非门就可以。S1到SN先或再取一个非,只有这N个位都为0的时候,ZF才等于1。其中但凡出现一个1,那么ZF肯定就等于0,这是或非的一个效果。在这个电路图当中可以看到,我们把S1S2一直到SN所有的这些比特位都用一个或非门进行了处理,最终输出了ZF这个标志位。
18:36
好,最后一个标志位,CF这个标志位反映了无符号数的加减运算是否溢出。逻辑表达式很简单,我们只需要把加法器的这个输出的进位信息和输入加法器的这个进位信息进行一个异或,就可以得到CF这个标志位。如果对应到左边这个电路图的话,C0就是c in,而CN最高位产生的这个进位对应的就是c out。所以我们从C零这儿接了一根线输入到异或门,从CN这个地方接了一根线,输入到异或门的另一端。那用这样的电路就可以生成CF这个标志位。当CF等于1的时候,表示无符号数的加减运算发生了溢出,等于0的时候表示没有溢出。好,这就是四个标志位的生成。关于OF和CF这两个标志位的生成逻辑,我们会在之后讲到补码的加减运算和无符号数的加减运算的时候再来补充。
19:49
在这儿我们能感受到所有的这些标志位都是基于原有的这个加法器的电路进行一定的改造,就可以得到这样的一个带标志位的加法器。好的,在这个小节当中我们学习了怎么设计一个加法器。我们首先设计了一个可以支持一比特加法的一位全加器,紧接着我们把N个一位全加器串联起来,得到了一个串行进位的并行加法器,它可以支持N比特并行相加,但缺点是各个进位信息是串行产生的,所以导致运算速度比较慢。紧接着我们基于串行进位的并行加法器进行了一点点的改造,得到了一个可以支持并行进位的并行加法器,由于进位信息是并行产生的,所以运算的速度得到了提升。
20:49
最后我们又基于串行进位的并行加法器进行了一些功能上的拓展,得到了一个带标志位的加法器。这种加法器除了输出N比特的加法运算结果之外,还会输出OF、SF、ZF和CF这样的四个标志位。其中OF和CF分别用于判断有符号数和无符号数的加减运算是否发生了溢出。SF这个标志位用于判断有符号数的加减运算结果为正还是为负,而ZF这个标志位用于判断加减运算的结果是否为零。注意我这儿加的定语,对于ZF这个标志位来说,我没有加任何定语。也就是说ZF标志位既可以判断有符号数的加减运算是否为零,也可以判断无符号数的加减运算是否为零。相比之下,OF和SF这两个标志位只能判断有符号数的加减运算是否发生了溢出,以及加减运算的正负性。
22:04
而CF这个标志位只能用于判断无符号数的加减运算,它的结果是否发生了溢出,这是大家需要注意的细节。好,最后需要跟大家强调这四个标志位,他们的这个电路图是怎么回事,你可以不用关心,但是这个逻辑表达式你需要知道,同时也需要知道每一个标志位它们到底有什么作用,这些都是考试常考的内容。当然现在你觉得理解的不够透彻也没有关系,在之后的学习当中,这些标志位还经常会出现。好了,以上就这一小节的全部内容。