7.实现一台计算机

来源:互联网 发布:全国小姐数据 编辑:程序博客网 时间:2024/04/19 01:00

前面实现了多个数加法/减法器,计数器,存储器。这里我们就要利用这些成果,实现一个新的更好用的加法器。人们都是懒惰的,因此如果要让你把100个数放到前面实现的加法器中相加,这是非常不好的,因为一旦中间一步出错,则要清零后重新从头输入。因此我们可以利用RAM的先存储后访问特性,把需要相加的值预先写入到存储器中,再一个一个取出并作为加法器的输入。

这里我们假设使用的是64K*8RAM,16位计数器,8位加法器和锁存器。将100个数写入存储器就不多说了,通过计数器能够从0000h开始一个一个将数据取出,并作为加法器的输入。但是有如下缺点:

(1)     怎样实现更多位数的加法呢?扩展设备的位宽是不合理的。

(2)     怎么停止呢?会无限一直计算下去,并可能循环继续重复累加。

(3)     如何实现100个数中特定数目的加法?

第三个问题比较好解决,因为只需要将累加器的输出写入RAM并不是在灯泡中显示出来。

第二个问题也容易解决,就是引入一个代码RAM,存放的是数字代码,我们可以预先设置一些数字代码,比如Load(10h),Store(11h)、Add(20h)、Halt(FFh),这样当有Halt时就停止。

8位锁存器的输入可以有两种选择,第一种是从RAM中读取,则为Load;第二种是从加法器中读取,为Add。

我们可以把同时实现加法和减法的器件嵌入在里面,这样就可以实现加法和减法。

第一个问题我们是否能解决?当然可以。我们可以利用从低位字节开始运算,再运算高位字节,因为高位字节需要包含低位字节的进位问题,这就引入了一个操作叫做进位加法。

这样我们就有7个指令:

1.     Load

2.     Store

3.     Add

4.     Add with carry

5.     Subtract

6.     Subtract with Borrow

7.     Halt

但是依次计算这些数并不是很好,缺点如下:

(1)     比如一个数为1234h,则12和34都是分离的,地址是不连续的。

(2)     不允许使用前面的结果。因为利用计数器,所以只能加,不能减。

对于这两个问题,我们采用固定长度的指令,即一条指令有3个字节(除Halt),第一个字节为数字代码,第二第三个字节为16位的地址,比如Load 1000h。

我们引入了三个锁存器作为代码RAM的输出,分别存储这三个字节,将后面两个字节作为数据RAM的输入,这样既可以利用以前的数据,也可以把16位数据连续存放。

我们这里用了两个RAM,实际上我们根本不需要用两个RAM,值需要分清是取数据还是取指令,这需要2-1选择器。由于我们只能连续的存放执行的指令,这对于我们带来了很大的不便,因此引入了Jump指令,但是不停跳转不会停止,所以引入了条件跳转指令。比如非0跳转,将一个数每次与Halt(FFh)相加,这样就相当于减1,减到0就不跳转。

现在我们完成了一个计算机,计算器与计算机的区别在于能否控制重复和循环。

数字计算机和模拟计算机

计算机由4部分组成:处理器(加减法器)、存储器(RAM)、输入(开关)和输出设备(灯泡)。

由此看出一台计算机就构造完毕了。

前面我们表示的比如FFh属于机器码,而Halt就属于助记符,即汇编。