组建一台计算机4_硬件4 单位存储器
前言:
放假有一周的时间,到家也有四五天的时间了,这几天把《code》好好的看了一遍。尽管之前也有草草翻过,但是把时候我就曾告诉自己,无论如何都是要把书中的这些东西都实现一遍的。于是说干就干,这几天基本上就在搞这些东西了。这些学习成果要感谢余富帅给我传的软件以及一些推荐。
=========================================================================
转载请遵循GNU开源宣言。Copyleft ! <2013>, <http://www.cnblogs.com/sciencefans from buaa 华罗庚班>
阅读此文,你需要拥有以下基础:
1.小学代数相关知识;2.初中电路;3.高中门电路相关知识;4.二进制和十进制的转换(这一点不会也没有关系)。
前面三节已经解决了任意位数的加减法运算器的构造方案,提出了一些问题——人类有时候不想把什么数据都自己记着,总是想找个东西存住他们。如何设计一个基本电路来实现呢?
首先分析一下需求:1.在发出命令后能记住命令;2.命令发出后即使停止发出命令也能持续记住命令。
第一点是在是太好做到了,只需要一个输入端即可。如下图,输出端和输入端保持一致。当输入数据为1,输出就是1,输入0,输出0.
但是第二点似乎有点困难。想把数据记住就意味着输入1之后,再输入0,输出仍然是1.或者说输入0之后,再输入1,输出仍然是0——输出位一直保持他第一次变化的状态。仔细想一想,为了让输出位出现1后一直保持1,这也不难做到——只需要把输出和输入取或运算即可。如图:
刚开始,输入输出都是0:
紧接着,输入1,输出也变成1——记住了这个状态:
当不再输入1的时候,由于自己的输出1支持了或运算的输入,所以输出仍保持1的状态:
这样一来,不论我再怎么变化输入端S,输出端Q始终保持1,这就把1给记住了。
但是问题远没有解决——如果我想存储‘0’,而不是‘1’怎么办?如果我想擦除这个记忆,再重新写入其他数据怎么办?
这也很好办!只需要增加一个输入端来控制‘复位’即可:
其中R就是新加的输入位——复位位。不难想象,当R位值为0时,这个电路和上面的电路没有任何区别(不妨试试)。当S输入一次1后,Q就会一直保持1的状态,不管之后S怎么变化:
但是当R输入端输入1的时候不难想象会发生什么情况——首先最上方的或运算输出1,经过非门输出转变成0,所以Q会被清零。即使S端再输入1,只要R端一直输入1,Q就会一直是0.
这样,就可以总结一下了,如下表:
为什么没有列出R,S都是1的情况呢?试想,边写入数据边复位,这不是闲的eggache嘛?尽管这样做不会导致任何错误,但是没有实际意义,所以忽略不计。
仔细观察上表,可以得出一个结论:
1)当R,S都是0的时候Q存储住了最近一次操作的值,宏观上看就是当即不写入数据也不复位的时候,输出端口一直保持之前存入的状态Q(可能是1也可能是0);
2)当R,S中有一个是1时,另一个必然是相反状态的——这时候要么会写入1,要么会写入0,而写入的是什么和S端的值保持一致!也就是说想要存储什么,就让S是什么,让R取一个相反的值就好了!
当只考虑写入数据的时候,这两个输入端可以归结成一个输入端——一个对另一个取反即可:
但是我们要做的RAM是有要很多个这样的存储单元的,每一个存储单元总会有‘不写入数据’的时候,在这个时候,必须改进一下电路使得电路满足:1.当该写入的时候可以随意写入;
2.当不写入的时候能保存上一次写入的状态,并且输入端不论怎么输入保存的存储值也不会变。
那么应该怎么办呢?加入一个控制输入端口吧~当控制端口是1的时候才能进行写入,当是0的时候不论S端输入什么都不影响Q的值,这个改进的电路看起来很好理解——:
红色线框内的电路就是我们之前设计好的电路的后半部分,他的输入输出真值表就是之前那个表格。
1)当保持位是0的时候,代表不往这个存储元中写入东西,不管S怎么输入,都不会影响到红色的电路——两个大大的‘与门’死活都不变——就输出0,当两个输入都是0的时候,从之前的真值表不难看出,Q会保持自己之前的值——记忆住了!
2)当保持位是1的时候,代表该往这个存储元里写入东西了,S的输入将会和图1的电路一样(其实是等价的),写什么就存什么。
好了,现在我们就可以来试一试这个存储器到底听不听话了~
首先点亮(输入1)保持位,表示我要开始写入数据啦~
这时我的S端是0,也就是说往这个存储器里写入0,果然Q端就是0.
现在我想写入1,我点亮S(输入1):
Q立即就变成1,写入1成功!
现在我想把这个‘1’的状态保持住,不再往里写入任何信息了,那么我要做的仅仅是让保持位输入0.:
这时候不论我怎么输入S,存储器的Q端都牢牢的记住了我需要他记住的‘1’。比如我现在输入S端为0,Q无所动——他已经记住之前的‘1’啦~
现在我们在回顾一下整个电路:保持位就相当于是一个箱子(Q)的盖子,当他打开(输入1)的时候,可以把S放进去,S是什么箱子里(Q)就会有什么,当把盖子关上的时候(保持位输入0),箱子禁闭,再怎么放S都放不进去,里面已经存储了之前放进去的值了。这个过程是可重复的——我们设计的这个存储器可以多次利用。
如果你学过C,或者了解过内存构架,就应该了解‘地址’这一概念,当我把许许多多个这样的存储元连在一起的时候,每个存储元都有一个相应的地址,举个例子,在C++里面我们定义一个bool值:bool a = true,那么计算机就会找到一个空闲状态的存储元,把true,也就是1写入这个存储元,那么写入的过程就可以简单的认为是:
1.寻找空闲地址;
2.找到空闲地址(比方说是0x0001);
3.把地址是0x0001的存储元的保持位打开——输入1,其他地址的存储元的保持为关闭——输入0;
4.这时在数据总线S上写入1,这时,每个存储元的S端都会输入1,但是只有地址是0x0001的存储元的保持位是1,所以只有他一个存储元会写入1;
5.关闭0x0001的保持位。
这样,1就被存到内存里了。
我们称这个存储元叫单位锁存器。
当然,这仅仅是一种最初始的存储方式,随着科技的发展不同的存储方式层出不穷,但是理解这种最简单的存储方式总是没坏处的。
但是人类总是不能满足的,到这里很容易得出这样的问题:
1.保持位必须保持一段时间是1才能写入数据,这在运算速度指数扩增的今天会不会容易导致低效和出错?
2.怎么样才能保证输入的内存的地址转换成具有那个地址的独特的锁存器保持为输入1,而其他锁存器的保持位输入0呢?
3.如何把这种锁存器连接起来变成一个几K,甚至几G的内存芯片呢?
这些问题,我们马上就能解决。(未完待续)
至此,一个单位锁存器就设计完成了。