首页 > 代码库 > 构造一个加法机
构造一个加法机
二进制加法
任何一个二进制数都是由一个以上的比特组成,是一个比特串。为了突出组成它的每个比特,一个二进制数可以表示成(如果它包含了6比特的话):
在这里,a0...a5都是单个的比特,是这个二进制数的每一位。所以,如果a5a4a3a2a1a0=110101,那么它们的对应关系就如图所示。
如果两个二进制数相加时,先把它们右对齐,叠在一起:
因为最先相加的是最右边那一列,即a0和b0,所以这里没有从其他列来进位,属于单纯的两个比特相加。不考虑其他列的进位时,两个比特相加有4种可能,如下图:
倒数第二列不是单纯的a1和b1相加,还可能会收到最右边那列的进位,这样一列实际上就是三个比特相加。如果存在其他列的进位时,两个比特相加有下面4种可能。
全加器
二进制做加法时,不管哪一列相加,情况都和刚才讨论的一样,每一列都有可能需要加上前一列的进位,相加的结果可能是0,也有可能是1,并且它自己也可能会把一个进位1给到下一位。
既然加法都是按列进行的,而且每一列的计算过程都一样,那么完全可以设计一个电路(内部实现忽略)来完成每一列的相加过程。下面是全加器示意图:
在图中,A和B分别是来自被加数和加数的一个比特,它们正好在同一列上;C1是来自右边一列的进位;C0是本列产生的进数;S是本列的“和”。为了表明这个电路的用途,我们在图的中间加了一个求和符号。
加法机
有了全加器,解决了二进制加法过程中每一列的计算问题,那么,我们可以搞一大堆全加器,根据被加数和加数的比特数,把它们串联起来组成一个完整的加法电路。
图中,两个二进制数a2a1a0和b2b1b0分别是被加数和加数,组成它们的每一个比特都可以用开关的闭合与断开来得到,而S3S2S1S0则是加法的结果。当然,它只能计算3位二进制的加法,要是你觉得少,想要计算更大的,更多比特的二进制数,就要使用更过的全加器。
当把所有的全加器连接在一起,封装到一起的时候,我们就会看到一个完整的加法机。要想使他真正工作起来,需要用一些开关从电源取电,为它输入两个二进制数。同时,还可以将所有的输出和灯泡连接起来,这样就能直观地看到相加的结果。
下面,把加法机画成了两边高中间凹的桶形,这很形象地表明它要接收两路输入,相加后形成一路输出。使用两排开关分别给出被加数和加数,加法机就会算出结果。
使用总线
下图中的RA和TB是临时寄存器,其中的GA和GB用来同时控制控制总线上面多条线路的通断。上面电路图中的加数、被加数是两个输入,这里被放到一了起。
在工作之前,KGA、KGB、KRA、KTR都是断开的。我们采用的例子是计算:10+5+7+2+6
1.我们首先要做的是用左边那排开关扳出第一个数“10”,接下来,按住KGA不要松,使GA打开,于是数据达到寄存器RA;接着,再按一下KRA,引发一个上升沿,架构数据锁进RA,最后,松开KGA。装载过程已经结束,第一个数“10”已经位于寄存器RA中了。
2.现在,我们要用第二个数与他相加。这需要再次扳动那排开关,得到第二个数字“5”。然后,按住KGA不要松开,使“5”进入加法器下面的输入端(上面操作也会到达这个输入端)。由于RA中保留着数字“10”,加法器是自动即时相加的,它会立即计算出相加的结果“15”。此时,按一下KTR,引发一个上升沿,将运算结果保存到临时寄存器TB中,然后松开KGA。
3.直接按住不要KGB松手,使计算结果从寄存器TR通过GB流向RA;接着,按一下KRA将数据锁存,最后将KGB松开。
在这到加法题中,除了第一个数字“10”需要预先保存到寄存器RA之外,从第二个数字“5”开始,一直到最后的数字“6”,所有数字在相加的操作过程都是一样的,都要经历用开关扳数、相加并保存到寄存器TR,然后从TR移动到RA的过程,这个过程可以简单地称为“相加”。当最后一个数完成之后,最终的结果仍然在寄存器RA中。
控制器
下面对加法器进行优化,引入循环移位寄存器RR,它有两个输出t0和t1,并且可以设置一个初始状态,然后t0和t1的状态会交替变换。
现在分析一下这个新的设计是如何运作的。在开始之前,应该先设置循环移位寄存器RR的初始状态,使它的两个输出t0和t1分别为1和0。
装载1.装载第一个数字到寄存器RA,这需要用左边那排开关来扳出这个数字。接着,闭合K装载,断开K相加,下面是装载数据的电路状态。
IGA=1,现在数据已经送到寄存器RA的嘴边了(可以参考“使用总线”一节的电路),但是它还是吃不了,因为IRA=0。如果想让数据保存到RA中去,必须按下K。
装载2.现在,我们按下开关K。随着K的接通,将同时产生两个脉冲,第一路通过非门到达循环移位寄存器RR。遗憾的是,这是一个由高到低的下降沿,RR不会理睬。这也意味着,“我们得新电路”仍然保持原来的输出纹丝不动。
与此同时,另一路脉冲被直接送到与IRA相连的与门,使得IRA从0变到1。在它的上升沿,寄存器RA将数据锁存。
装载3.因为是按键开关,当我们一撒手,K马上又松开了。按键松开的瞬间,它产生的是“0”经过非门后变成“1”。这个变化对于循环移位寄存器RR来说是个不折不扣的上升沿。于是,循环移位一次,t0=0而t1=1,下面电路状态中的所有输出都是0。
现在数据装载完毕,你有两个选择:第一,要是你觉得刚才装载的数据不对,想重新装载一次,可以直接再按一次K;第二,如果你准备开始做加法,干“相加”的活,就断开K装载,合上K相加。
相加1.我们再用那排开关准备好第二个要相加的数,并断开K装载,合上K相加。
相加2.现在按下K执行第一个动作,和前面一样,先是ITR‘和K来的上升沿脉冲一起,使得ITR从0翻转到1,临时寄存器TR锁存相加的结果。
相加3.当K松开时,RR再次循环移动一次,t0=0、t1=1,IGB状态打开。
相加4.现在相加的结果已经来到了寄存器RA的眼皮底下,只要再按一下K,使得IRA和从K来的上升沿脉冲一起,把IRA从0翻转到1即可。在这个上升沿,寄存器RA锁存相加结果。
松开K时,循环移位寄存器从非门哪里得到一个从0到1的上升沿脉冲,故在此循环移位,使得t0=1、t1=0,于是整个电路又回到了“相加”过程的最开始。
这意味着,要做一连串的加法,除了最开始要将第一个数装载到寄存器RA之外,其他都是单纯的相加。所以,这意味着,从现在开始,你可以按照“用开关扳数——按两次K——用开关扳数——按两次K——......”这样的模式将所有的数都加完,最终的结果就在寄存器RA中。
经常的,我们听别人说每台计算机里都有一个控制器,它可以使整个计算器按照规定的步骤有条不紊地计算。事实上,我们现在讲的这个电路就是一个控制器。