2.2.3_3 补码加减运算电路
00:00
各位同学大家好,在这个视频中我们会探讨怎么用电路去实现补码的加减运算。在之前的学习中我们知道了N比特加法器它的一个实现原理,给加法器输入N比特的被加数A以及N比特的加数B,同时加法器还可以接收来自于更低位的进位信息,经过加法器的电路处理就可以得到N比特的加和结果,当然加法器也有可能向更高位产生一个进位信息。
00:36
忘了的同学可以结合这儿给出的两个例子来进行回忆。我们这儿给了A、B两个数,分别都是4比特,假设A等于1000,B等于0111,那么当更低位的进位c in等于零的时候,加法器的运算结果就应该是四个一,同时往更高位的进位信息等于0,这是第一个例子。第二个例子,A和B的值不变,改变了来自于更低位的进位信息c in等于1,那在这种情况下,A加B再加上来自于更低位的进位1,得到的加和结果就应该是四个0,同时往更高位产生了进位1。这是两个简单的例子,可以帮大家回忆起加法器的原理。
01:32
好,接下来我们对这个加法器进行一些拓展,让它能够支持补码的加法和减法运算。拓展之后得到这样的一个电路,这个电路就可以支持补码的加法和减法运算。
好,来解释一下。首先这个地方有个很显眼的东西,它是多路选择器,它有两个输入一个输出。看一下多路选择器的这个控制信号叫sub,它是subjection的缩写,这是减法的英文单词,也就是说这个控制信号为0还是为1,表示当前要进行的是加法还是减法,如果当前进行的是加法运算,那么sub这个控制信号就等于0,当这个信号等于0的时候,意味着右边这条线路会通过多路选择器作为加法器右端的这个输入框。
02:32
那结合右边这个例子来看,假设被加数和加数都是4比特,被加数等于3,加数等于4,它们的补码分别是0011和0100,现在要计算补码X加上补码Y的值,那由于是加法运算,所以sub这个控制信号等于0Y的值0100通过这条线路直接从多路选择器这边输出,所以加法器的右端它接收到的数据就是0100,而加法器的左边这个输入端接收到的就是X的值0011。那加法器会把这两个补码从低位到高位逐位相加,最终输出加和的结果。那这两个数加和的结果应该是0111。如果把这个补码翻译成十进制,那就应该是十进制的7 3加4等于7,得到了正确的结果。好,这是进行加法的一个例子。
好,接下来看一下这个电路是怎么实现补码的减法运算的,那经过之前的学习,我们知道补码的减法运算,我们最终需要把它转变成等价的加法。具体的做法就是要把减数外全部位按位取反,末位加1,经过这样的处理就可以得到负Y的补码,紧接着我们就可以把减法转变成与之等价的加法。
04:10
好,所以补码的减法运算也可以用加法器来实现,关键在于我们怎么用电路把减数Y全部位按位取反,末位加一。好,来看一下这个电路是怎么做的。如果当前进行的是减法运算,那么sub这个控制信号的值就是1。那对于多路选择器来说,控制信号等于一意味着左边这条线路会被选通,而右边这条线路会被拦截。左边这条线路看一下,它接的是一个非门,同时它的输入端接的是减数Y对于这个例子来说,减数Y的值应该是0100。好,由于非门的作用是0变1,1变0,所以经过非门的处理之后,就可以实现减数外全部位按位取反的一个效果。这些信号通过多路选择器之后,输入到加法器的右端1011,这就是减数Y全部为按位取反的一个值。
05:20
好,接下来把目光放到右边这条线路,我们说加法器可以接收来自于更低位的一个进位信息,那么这条线路观察一下,它是连着sub这个信号,也就是说如果当前进行的是减法运算,那么sub等于1这个信号会通过这条线路输入到加法器这儿。
05:45
好,那再来看加法器的左边,直接接的是X,X的值是0011,输入到加法器的左边这一端,好,接下来这个加法器做的运算就是0011加上1011再加上来自于更低位的进位信息1,最上面这个数是X的补码,中间的这个数是减数Y按位取反的一个值,最后这个进位信息一是被加到了末位,所以这个效果就相当于末位加了一个1。因此当sub等于1的时候,这个电路就实现了减法运算,这个减法运算的结果是四个1,把它翻译成十进制就刚好是-1 ,3减4等于负一,这是一个正确的结果。好的,这就是实现补码加减运算的电路。
06:50
在之前的学习中我们说过无符号数的加减运算,它在底层的运算逻辑和补码的加减运算是一模一样的。无符号数的加法运算和补码的加法运算一样,只需要从低位到高位按位相加就可以。而两个无符号数相减的运算也和补码的减法运算一模一样,我们需要把减数全部位按位取反,末位加一,把减法转变成等价的加法,因此刚才我们设计的这个补码加减运算电路,它也可以用于实现无符号数的加减运算。
07:32
好,在这个地方我也给了一个例子,用4比特表示无符号数8和7。当两个数相加和相减的时候,分别等于什么样的一个值?大家可以结合这个电路图自己推一下,这儿就不再赘述。
07:49
好,在刚才这个电路中,我们基于以前学过的简单的加法器,实现了加法和减法的运算逻辑。我们回顾一下,在之前的学习当中,我们基于简单的加法器进行了一些拓展,得到了一个带标志位的加法器。接下来我们把这个带标志位的加法器使用到补码的加减运算电路当中。也就是说这个加法器除了得到加和的结果,以及产生往更高位的进位信息之外,还会输出OF、SF、ZF和CF这样的四个标志位的信息。
08:28
我们来复习一下,OF是溢出标志,用于判断带符号数加减运算是否溢出,当OF等于一的时候溢出,OF等于0的时候没有溢出。回顾一下之前我们讲到标志位的生成的时候,我们说OF这个标志位的信息,它是用最高位产生的进位和次高位产生的进位进行异或运算来确定OF的值。
08:57
为什么这个值可以反映带符号数的加减运算是否发生了溢出呢?我们知道计算机内部所有的带符号整数都是用补码来表示的,那之前我们学习补码加减运算的时候,我们通过这样的一种判断溢出的方法,我们可以用次高位产生的进位和最高位产生的进位信息进行异或运算。如果这个异或的值等于1,那么就说明有溢出。如果异或的值等于0,说明没有溢出。这是判断补码加减运算是否溢出的一个方法。
09:39
再回到这个带标志位的加法器,OF这个标志位刚好就是用最高位产生的进位和次高位产生的进位进行异或运算来得到OF的值,那不就是我们之前学习的这个逻辑吗?当OF等于1的时候,表示这个带符号数的加减运算发生了溢出,OF等于0的时候表示没有溢出。好,这是OF这个标志位。
10:09
好,接下来第二个标志位是SF符号标志,它反映了带符号数的加减运算到底为正还是为负,SF等于一的时候为负,SF等于0的时候为正。回到之前的这个电路图,我们可以看到SF这个标志位直接就是取了最高位的本位和。我们知道带符号数是用补码来表示的,而补码的最高位肯定就是符号位,当最高位等于1的时候表示这是一个负值,当最高位等于0的时候表示这是一个正值。好,这就是SF这个标志位的一个由来以及原理。
10:51
好,接下来第三个标志位ZF,它表示加减运算的结果是否为零。回顾之前这个电路图可以看到,ZF这个标志位是把加法器输出的这N比特的加和每一位都进行或非运算。只有当N个比特全为零的时候,ZF或非的值才等于1,此时说明运算的结果等于0,相反的当ZF等于零的时候,就说明加法器运算的结果是非零。好,这是ZF标志位。
11:32
最后看CF标志位,之前我们说过CF标志位表示的是无符号数的加减运算当中是否发生了进位或者借位。当两个无符号数进行加法运算的时候,如果最高位产生了进位,那说明此次的加法运算肯定发生了溢出。而两个无符号数进行减法运算的时候,如果最高位向更高位产生了借位,那么说明减法运算发生了溢出。总之当CF等于1的时候,表示无符号数的加减运算发生溢出,CF等于0的时候表示没有发生溢出。
12:11
好,再来回顾一下CF标志位的一个逻辑:可以看到CF标志位是把加法器的最高位的这个进位信息cout,以及来自于更低位的这个定位信息cin进行了异或,那这是什么原理呢?回顾一下之前我们说过,无论是无符号数的加法还是无符号数的减法,在判断溢出的时候我们都需要关注最高位产生的进位信息。对于加法器来说,就是要关注c out这个信号,对于加法运算,当cout等于1的时候发生溢出,对于减法运算,当cout等于0的时候说明发生溢出。
12:57
那回到CF这个标志位的生成逻辑,它是把c out和c in这两个信号进行异或。如果结合之前这个加减运算的电路图来看,cin这个信号它和sub这个控制信号是相同的。如果此时进行的是加法,那么c in刚好就等于0。如果此时进行的是减法,那么c in就等于1。所以进行加法运算的时候,c in这个信号肯定等于0。我们把c in和c out进行异或运算,只有c out等于1的时候,这个异或运算的值才等于于1。对于减法运算也一样,进行减法的时候c in肯定等于1。那c in和c out进行异或运算,只有c out等于0的时候,这个运算的结果才等于1。
13:54
所以CF这个标志位它反映了无符号数的加法和减法是否发生了溢出。CF等于1的时候发生了溢出,CF等于0的时候没有发生溢出。好,这就是CF这个标志位的一个实现原理,大家可以再结合之前的这个电路图来回顾一下。
14:16
好的,在这个视频中我们学习了如何用电路去实现补码的加减运算。补码的加减运算电路既可以支持带符号数补码的加减法,也可以支持无符号数的加减法。对于硬件来说实现的原理是一样的。除了理解这个电路的原理之外,大家还需要重新去理解和体会OF、SF、ZF和CF这几个标志位的一个含义,以及各个标志位它是怎么确定怎么生成的。好的,以上就是这期视频的全部内容。