码迷,mamicode.com
首页 > 其他好文 > 详细

构造一个加法机

时间:2014-04-29 11:37:47      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   strong   

二进制加法

  任何一个二进制数都是由一个以上的比特组成,是一个比特串。为了突出组成它的每个比特,一个二进制数可以表示成(如果它包含了6比特的话):

mamicode.com,码迷

  在这里,a0...a5都是单个的比特,是这个二进制数的每一位。所以,如果a5a4a3a2a1a0=110101,那么它们的对应关系就如图所示。

mamicode.com,码迷

  如果两个二进制数相加时,先把它们右对齐,叠在一起:

mamicode.com,码迷

  因为最先相加的是最右边那一列,即a0和b0,所以这里没有从其他列来进位,属于单纯的两个比特相加。不考虑其他列的进位时,两个比特相加有4种可能,如下图:

mamicode.com,码迷

  倒数第二列不是单纯的a1和b1相加,还可能会收到最右边那列的进位,这样一列实际上就是三个比特相加。如果存在其他列的进位时,两个比特相加有下面4种可能。

mamicode.com,码迷

全加器

  二进制做加法时,不管哪一列相加,情况都和刚才讨论的一样,每一列都有可能需要加上前一列的进位,相加的结果可能是0,也有可能是1,并且它自己也可能会把一个进位1给到下一位。

  既然加法都是按列进行的,而且每一列的计算过程都一样,那么完全可以设计一个电路(内部实现忽略)来完成每一列的相加过程。下面是全加器示意图:

mamicode.com,码迷

  在图中,A和B分别是来自被加数和加数的一个比特,它们正好在同一列上;C1是来自右边一列的进位;C0是本列产生的进数;S是本列的“和”。为了表明这个电路的用途,我们在图的中间加了一个求和符号。

加法机

   有了全加器,解决了二进制加法过程中每一列的计算问题,那么,我们可以搞一大堆全加器,根据被加数和加数的比特数,把它们串联起来组成一个完整的加法电路。

mamicode.com,码迷

  图中,两个二进制数a2a1a0和b2b1b0分别是被加数和加数,组成它们的每一个比特都可以用开关的闭合与断开来得到,而S3S2S1S0则是加法的结果。当然,它只能计算3位二进制的加法,要是你觉得少,想要计算更大的,更多比特的二进制数,就要使用更过的全加器。

  当把所有的全加器连接在一起,封装到一起的时候,我们就会看到一个完整的加法机。要想使他真正工作起来,需要用一些开关从电源取电,为它输入两个二进制数。同时,还可以将所有的输出和灯泡连接起来,这样就能直观地看到相加的结果。

mamicode.com,码迷

  下面,把加法机画成了两边高中间凹的桶形,这很形象地表明它要接收两路输入,相加后形成一路输出。使用两排开关分别给出被加数和加数,加法机就会算出结果。

mamicode.com,码迷

使用总线

   下图中的RA和TB是临时寄存器,其中的GA和GB用来同时控制控制总线上面多条线路的通断。上面电路图中的加数、被加数是两个输入,这里被放到一了起。

mamicode.com,码迷

  在工作之前,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的状态会交替变换。

mamicode.com,码迷

  现在分析一下这个新的设计是如何运作的。在开始之前,应该先设置循环移位寄存器RR的初始状态,使它的两个输出t0和t1分别为1和0。

  装载1.装载第一个数字到寄存器RA,这需要用左边那排开关来扳出这个数字。接着,闭合K装载,断开K相加,下面是装载数据的电路状态。

mamicode.com,码迷

  IGA=1,现在数据已经送到寄存器RA的嘴边了(可以参考“使用总线”一节的电路),但是它还是吃不了,因为IRA=0。如果想让数据保存到RA中去,必须按下K。

  装载2.现在,我们按下开关K。随着K的接通,将同时产生两个脉冲,第一路通过非门到达循环移位寄存器RR。遗憾的是,这是一个由高到低的下降沿,RR不会理睬。这也意味着,“我们得新电路”仍然保持原来的输出纹丝不动。

  与此同时,另一路脉冲被直接送到与IRA相连的与门,使得IRA从0变到1。在它的上升沿,寄存器RA将数据锁存。

mamicode.com,码迷

  装载3.因为是按键开关,当我们一撒手,K马上又松开了。按键松开的瞬间,它产生的是“0”经过非门后变成“1”。这个变化对于循环移位寄存器RR来说是个不折不扣的上升沿。于是,循环移位一次,t0=0而t1=1,下面电路状态中的所有输出都是0。

mamicode.com,码迷

 

  现在数据装载完毕,你有两个选择:第一,要是你觉得刚才装载的数据不对,想重新装载一次,可以直接再按一次K;第二,如果你准备开始做加法,干“相加”的活,就断开K装载,合上K相加

   相加1.我们再用那排开关准备好第二个要相加的数,并断开K装载,合上K相加

mamicode.com,码迷

  

   相加2.现在按下K执行第一个动作,和前面一样,先是ITR‘和K来的上升沿脉冲一起,使得ITR从0翻转到1,临时寄存器TR锁存相加的结果。

mamicode.com,码迷

   相加3.当K松开时,RR再次循环移动一次,t0=0、t1=1,IGB状态打开。

mamicode.com,码迷

 

   相加4.现在相加的结果已经来到了寄存器RA的眼皮底下,只要再按一下K,使得IRA和从K来的上升沿脉冲一起,把IRA从0翻转到1即可。在这个上升沿,寄存器RA锁存相加结果。

  mamicode.com,码迷

  松开K时,循环移位寄存器从非门哪里得到一个从0到1的上升沿脉冲,故在此循环移位,使得t0=1、t1=0,于是整个电路又回到了“相加”过程的最开始。

   这意味着,要做一连串的加法,除了最开始要将第一个数装载到寄存器RA之外,其他都是单纯的相加。所以,这意味着,从现在开始,你可以按照“用开关扳数——按两次K——用开关扳数——按两次K——......”这样的模式将所有的数都加完,最终的结果就在寄存器RA中。

  经常的,我们听别人说每台计算机里都有一个控制器,它可以使整个计算器按照规定的步骤有条不紊地计算。事实上,我们现在讲的这个电路就是一个控制器。

构造一个加法机,码迷,mamicode.com

构造一个加法机

标签:style   blog   http   color   使用   strong   

原文地址:http://www.cnblogs.com/zhongxinWang/p/3698824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!