组建一台计算机2_硬件2 多位加法器

前言:

放假有一周的时间,到家也有四五天的时间了,这几天把《code》好好的看了一遍。尽管之前也有草草翻过,但是把时候我就曾告诉自己,无论如何都是要把书中的这些东西都实现一遍的。于是说干就干,这几天基本上就在搞这些东西了。这些学习成果要感谢余富帅给我传的软件以及一些推荐。

=========================================================================

转载请遵循GNU开源宣言。Copyleft ! <2013>, <http://www.cnblogs.com/sciencefans from buaa 华罗庚班>

阅读此文,你需要拥有以下基础:

1.小学代数相关知识;2.初中电路;3.高中门电路相关知识;4.本系列之前1节的内容;5.二进制和十进制的转换(这一点不会也没有关系)。

已经做好了一块单位加法器,但是单位加法器顶多能告诉你0+0,1+0,1+1,1+1+1等于几。我想知道15+99(=114)等于几怎么办?

很简单,只需要把单位加法器串起来形成多位加法器就好了。一般以2的次幂位为机器计算位,这里以8位为代表,那么八位加法器应该可以计算2^7=128以内的加法:

image

    image

    image

这样一来,八个单位加法器仅仅根据前一位的进位输出连接后一位进位输入这一准则连成一串,就变成了一个八位加法器。下面给出一种集成视图:

image

其中最高位的进位输出到另一个寄存器(或者抛弃),最低位进位输入为0.

现在如果我想计算15+99等于多少,我只需要输入15和99的二进制1111和110 0011:

image

其中小红框为第一个加数15的二进制0000 1111(最低位在最上方),小蓝框为第二个数99的二进制0110 0011(最低位在最上方),右侧的大红框就已经得出结果了:0111 0010 转化为十进制就是114,和口算的相符。

如果你还想计算更大的数字比如在c语言中支持的64位longlong型整形相加,那么你就应该设计一个64位加法器。但是这里提出两个问题:

1.如果我想让两个特别特别大以至于100位都存不下的数字相加怎么办?

2.我的加法运算中有负数怎么办?

首先第一个问题,可以在c语言中转化为字符串问题进而转化为32位int型相加,也可以用java中的big integer类进行运算。无论怎样,结果都是要转化为64位及以内数字相加的。

但是第二个问题我们无论如何也避免不了了,这将是以后我们设计减法器要考虑的问题(负数运算可以认为(或者转化为)减法)。

这个问题我们将在http://www.cnblogs.com/sciencefans/p/3185368.html完美解决。

至此,一个unsign类型的多位加法器就设计好了。

posted @ 2013-07-12 00:15 sciencefans 阅读(...) 评论(...) 编辑 收藏