计算机的组成原理中,存储是必不可少的部分,可以用来存储计算的结果、图片、文字等等,本文将介绍存储是如何实现的。
锁存器
首先我们来看一个门电路:当两个输入引脚都为0时,输出引脚也为0;如果A引脚输入1,输出为1,B引脚也会变为1,此时将A引脚变为0,输出依旧会保持1,所以这个电路可以记录1。
还有一个相似的电路:用与门代替上面电路中的或门,当两个引脚输入为1时,输出为1,将A引脚的输入改为0,则输出为0,B引脚也会变为0,将A引脚改为1,输出依旧保持为0,所以这个电路可以记录0。
将这两个电路组合,增加一个非门,即可形成锁存器:两个输入引脚分别为置位(set,上面的引脚)和复位(reset,下面的引脚),如果置位为1,复位为0,则输出引脚为1;将复位变为1,则输出引脚为0;将两个输入引脚都变为0,则输出引脚则会保持上一个状态;==此时,输出引脚并没有跟随输入引脚的变化而变化,是保存在了一个状态,通过这种方法,即可以实现数据的存储。==将数据放入存储的过程称为“写数据”,将数据从存储中取出的过程称为“读数据”。
在上述存储一位的电路的基础上,增加一些门电路,即可形成“门控寄存器”:包含两个引脚,数据输入引脚和使能引脚,当使能引脚为1时,输出引脚和数据输入引脚的电平一致;当使能引脚为0时,输出引脚不会变化。使能信号高电平时,输出和输入保持一致;使能信号低电平时,输出保持原有状态不发生改变。
寄存器
通过锁存器,可以存储一位的数据,但现实情况是一位数据能做的事情比较有限,所以通常将一定数量的锁存器组合起来,形成寄存器,所能存储的位数代表寄存器的宽度,比如32位宽度寄存器可以存储32位的数据。
下图为一个8位的寄存器,使用一根使能线同时控制8个锁存器(将上图中的锁存器简化表示),当使能线为1时,完成对寄存器数据的写入,将使能线设为0,完成寄存器数据存储。
按照上述方法设计位数较多的寄存器有一个弊端:所需要的接口较多,比如设计64位的寄存器,需要64根输入线,64根输出线和一根使能线。为了解决这个问题,通常使用矩阵排布的方式设置寄存器。比如下图256个锁存器,可以按照16×16的方式排列,可以通过16条横向线和16条纵向线选择锁存器。
每个锁存器单元连接电路如下图所示:使用横向线和纵向线选择具体的锁存器,然后将使能线置1,写入或读取数据。通过这种方法,外接线的数量数量大大减少,256个锁存器只需要35根线:16根横向线,16根纵向线,1根使能线,1根读线,1根写线。使用这种方法需要对于每个锁存器依次读取。
RAM
为了明确读取的是哪一个锁存器,将16行和16列用地址表示:
16个数字可以用4位二进制表示,因此16行和16列可以用8位二进制表示(前四位表示行,后四位表示列),所以使用的控制线可以进一步简化:用8根线表示地址,1根读使能,1根写使能,1根数据线(读使能时数据线用于读数据,写使能时数据线用于写数据)。
上文描述了一个256位的存储是如何工作的,然而256位的存储实际使用时还是太小了。故将8个256位存储排列在一起,可以形成更大的存储。那么需要多少线去控制呢?是否为11×8根线?答案并不是这样的,将8个存储器按如下方式排列,使用8位的地址同时选择8个存储中相同位置的锁存器,通过使能线和8根数据线同时完成这8位存储内容的读/写,共需18根线。
将上述结构换一种表达方式,如下图所示:这就是我们在一些教材或者课程中常见的地址表示方式了。不难看出,8位地址的存储器最多可以存储256(2的8次方)个8位数,同理,32位地址的存储器可以存储4294967296(2的32次方)个32位数。
这种结构的存储器可以随时通过地址线读/写任意地址的数据,不用按照地址顺序依次读取,因此被称为“随机读取存储器”(RAM,Random-Access Memory)。这种存储通常应用于运行时的短时间存储,对应计算机中的内存条部分,相比于外部存储(磁盘等),速度更快。下图所示的计算机中真实的内存条由8块组成
每块放大后由32部分组成,再放大由4部分组成,每部分由128位×64位组成。可以计算出这是总容量1MB的内存,这是早期的内存条,现在常见的内存条就是4GB、16GB这种容量的(DRAM)。