这一节来介绍加法器的实现,数字电路可以分为组合逻辑电路和时序逻辑电路,它们的区别简单说,时序逻辑电路它具有存储的功能,而组合逻辑电路没有存储的功能,组合逻辑电路它的输出只依赖于输入,而时序逻辑电路它的输出不仅依赖于输入,还跟当前的状态或者说当前的时间有关系,比如实现加减乘除的运算器,ALU就属于组合逻辑电路,而寄存器,存储器就属于时序逻辑电路。
我们首先会看加法器,因为16正好是2的4次方,所以计算机中通常使用16进制来简化二进制的写法,我们看二进制十六进制跟十进制是怎么转换的,比如下面十进制的13怎么转换成二进制,书本里面转换方式比较正规,可能不太好理解,不知道你们老师有没有讲过1种8,4,2,1的方法,
我们把二进制的前面4位对应十进制的8421,第0位就是2的0次方是1,第1位是2的1次方是2,第2位是2的2次方是4,第3位是2的3次方是8,第4位是2的4次方是16,那么后面的位对应32,64,128,所以十进制13就是8+4再加上1,转成二进制就是1101。
16进制它是把二进制的每4位对应十六进制的1位,十六进制范围是从0到15,从0到9 使用阿拉伯数字来表示,从10到15分别对应的是a b c d e f,那么上面的8位二进制数前4位是13对应的就是D,后4位是0对应的16进制就是0,再看138它是等于128加上10,128对应后4位所以是1000,然后10是1010对应前4位,那么转换成16进制,前4位10对应的是是a,后4位8对应的就是16进制的8。
再看下面的加法,十进制的加法我们比较熟悉了它是逢10进1,而二进制是逢2进1,1+0等于1,1+1=2结果是0进1,然后1+1=0再进1结果是1,十六进制它是逢16进1,c是12,A是10那么就是22,22减16是6结果进1,然后a加2再加1就是13,D,5加5是10 对应的是a。
首先我们看1位二进制的加法的实现,下图中a加b结果是sum进位是carry,那么我们通过下面的真值表可以看出来,0+0是等于0的,1+1是等于0的,其他情况相加的结果是1,所以这正好符合异或门的特性,我们把a b输入到一个异或门,它的输出就是a加b的结果sum,然后再看进位,1+1的进位是1,其他情况相加进位都是0,所以这正好符合与门的特性,我们把a b输入到一个与门,那么它的输出就是a+b的进位carry。参考:基本门电路的实现
半加器
下面就是半加器的符号和verilog实现,输入是a b输出out是sum跟carry,大家自己去实现一下,就是把前面实现的异或门跟与门组合起来实现半加器,
半加器
实现完成后我们可以看一下效果,看一下结果是不是正确的。
我们看实际的二进制加法,它某一位的两个数相加,还要考虑上一位的进位,比如下面的1+0还要考虑上一位的进位1,那么就是1+0+1结果是0再进位,像上面没考虑进位的加法器就属于半加器。
而全加器就是考虑进位如下图,a加b然后再加上上一位的进位c,所以它就有3个输入a b c,那么它的实现是由两个半加器构成,那么a+b+c的结果,就是a+b的结果AB,再加上c,输出就是a+b+c的结果Sum,
全加器
然后a+b+c的进位,我们可以结合十进制来看,如下8+7是等于5进位是1,然后8+5是等于3的进位是1,再把两个进位1相加等于2,所以a+b+c的进位,就是a+b的进位x,跟a b相加的输出AB再加上c它的进位y, 两个进位x和y再相加,因为通过这个真值表我们可以推出来,这两个进位x y不可能同时为1,所以这里我们就没有再用一个加法器,而直接使用一个或门就可以了。
下面是全加器的符号和verilog实现,输入是a b c,输出是sum跟carry,这里我们通过一个wire就是线的意思来表示它的中间结果,比如a b相加的中间结果是S1,我们再把S1跟这个c相加输出是sum,然后a b相加的进位是C1,然后我们再把C1输入到一个或门里面,大家根据上面的电路图自己去实现一下。
实现完成以后也看一下结果,看一下它的结果是不是正确的,
然后我们把16个全加器组合起来,构成一个16位的加法器,下面是它的符号和verilog实现,这里的input[15:0]就代表a b是16位的,那么获取a b的每1位就是a[0] [a1] [a2] ...,这里的输出out也是16位的,我们通过一个wire[15:0] c来表示中间结果,这个c也是16位的,那么第一个全加器它的进位输入就是0,表示方式就是1b代表一个1位二进制值是0,它的进位输出是c[0],
然后我们就把第一个全加器它的进位输出c[0]作为第二个全加器它的进位输入,依此类推下去把这16个全加器组合起来,最后一个全加器它的进位输出就输出到c[15],我们就不用管了,大家自己实现一下,下面是效果。