计算机基础第三章:寄存器&内存(Registers&RAM)

寄存器&内存(Registers&RAM)

前言

前面学习了逻辑门和ALU,想要制作一个“CPU”我们还需要学习内存,因为CPU所运算
数据的读写都离不开内存。

一.内存单位

学习内存首先我们要了解存储单位
1TB(太字节)=1024GB(千兆字节)
1GB=1024MB(兆字节)
1MB=1024KB(千字节)
1KB=1024byte(字节)
1byte=8bit(位)

二.深入了解内存

1.锁存器

下图为and-or锁存器基本原理
锁存器原理如图

1.设置输入为1,复位输入为0

2.设置输入为1,复位输入为1

3.设置输入为0,复位输入为0

2.门锁

我们通过上图通过设置set和复位reset两个输入存入了一位为1的数据,但是上图需要配合使用设置set和复位reset两个输入才能存储数据。我们进一步改进上面的电路结构如下:

经过改进,我们将原来的set和复位reset两个输入合并成为了一个数据输入,然后新增了一个允许输入写入线,当允许写入为1的时候可以通过改变输入输出存入一位数据,反之为0时无法存入数据。简单理解上面锁存器的结构之后,我们将上图结构进行抽象成为一个整体的组件,如下图:

3.寄存器

上图封装的组件为我们后面就统一称它为“锁存器”,一个“锁存器”只能存储一位0或者1的数据,我们可以将多个锁存器合并起来成为一个可以储存多位数据的寄存器
下图为8位寄存器,可以简单的理解为上图8个锁存器的合并,下图为8位寄存器存入数据的过程

4.矩阵寄存器

早期电脑用的是8位寄存器,更专业的单位应该叫8宽位寄存器,我们8位寄存器就需要用到了8根数据线输入数据,8根数据线输出数据,1根允许写入线,1根允许读取线一共18根线,但是随着寄存器的宽位数的不断增多,那么64位,128位,256位呢?我们需要用到更多的线去连接锁存器。
再举个栗子:如果我的寄存器可以存储256位,那么我们需要256根输入数据线,256根输出数据线,1根允许写入线,1根允许读取线一共五百多根线。
所以上图这种并排多数据线的寄存器排列设计,明显不利于空间的利用和数据的管理,那有什么方式可以减少锁存器之间的连线呢?我们可以采取矩阵的方式来排列更多的寄存器。
如图为16X16矩阵的256宽位寄存器:

我们放大矩阵中的某一个锁存器,如图:

我们要改进上面这个锁存器,在它的左下角加上一个“And门”,如下图橙色标记的地方:

我们可以用“And门”加上一根“行线”和一根“列线”来锁定指定的锁存器,然后用一根“允许写入线”(上图的Write Enable接口连接的线)连接矩阵中所有寄存器来控制是否允许写入数据,要准确控制每一个锁存器就好像地图上的经纬度一样,我们要定位一个锁存器并对该锁存器写入数据就先需满足如下条件:

1.“行线”和“列线”同时为1

2.“允许写入线”为1

该锁存器才可以写入数据,然后我们用一根“数据线”(上图的data in/out连接的线)连接所有寄存器,然后通过data in/out接口来传输数据;

上面总结了写入数据,同理我们可以用一根“允许读取线”(Read Enable),然后通过“数据线”读取数据,如下图:

我们继续回到前面的16X16矩阵256位寄存器,
我们这种矩阵的排列设计只需要16根行线,16根列线,1根数据线,1根是否允许写入线,1根是否允许读取线,一共35根线就可以搞定。

5.多路复用器(数据选择器)

前面的图片只是说明了数据的定位原理和数据在找到锁存器后如何读/写到锁存器,但是要满足可以给指定锁存器读/写数据,我们还需要一个步骤,那就是还需要在这个寄存器加入一个叫做为多路复用器的东西(也叫数据选择器),这个多路复用器作用是记录锁存器的地址,然后根据这个地址指向指定的锁存器,从而进行该锁存器的数据读/写
如下图:

我们分别用一个多路复用器记录行,一个多为复用器记录列。
举个栗子:如果们要快速定位并写入数据到“第十二行,第八列”的锁存器,那么数字12行对应的二进制地址为1100,数字8列对应的二进制地址为1000,那么我们分别在行和列的多位复用器上面记录这两个地址,那我们就可以通过多路复用器快速找到“第十二行,第八列”锁存器然后读/写数据,这样就成功的完成了一次对数据的读/写。
对这个16x16的256位寄存器的理解到此为止,为了我们更好的理解后面的内容,我们继续把这个256位寄存器抽象成为一个整体组件,如图所示:
这个寄存有如下部分组成:

1.八位地址组成的多路复用器(四位记录行,四位记录列)

2.允许写入线连接所有锁存器

3.允许读取线连接所有锁存器

4.数据线连接所有锁存器,用于读/写数据

但是256bit所存取的数据也非常有限,所以我们把这样256bit的组件复制多个然后合并打包成一个整体
如图:

上图我们合并打包了上面的8个的组件,我们继续把这个合并的图更加细节化,给他们加上电路连线,一张256byte的内存卡就诞生了
如图:

我们有256个地址(byte),每个地址可以读写一个8位值(也就是1byte或者说8bit);为了能更好的理解内存与程序之间的交互,我们不再把上面部分看成存储模块和电路,而是抽象的看成一个个整体可寻找的地址内存,后面在讲到CPU的时候会用到这个抽象出来的内存,这里先提一下。如下图:

如果还需要进一步扩大内存,我们就需要和和上面一样,不断的把小的内存模块复制打包成更大规模,但是随着内存的扩大,记录内存地址的多路复用器也要随之扩大,(8位可以记录地址的最大值是二进制的11111111,对应十进制255),要给更大的内存卡记录地址就需要32位或者64位的地址来记录。

6.从硬件的角度去理解内存

上面我们从抽象电路简单分析了内存的工作机制,为了我们更好的去理解内存的结构和原理,下面我们再直接通过图片,从硬件的角度去分析内部的结构:
首先我们要知道内存的一个重要特性是:可以随时访问任何地址
因此我们的内存条也叫:随机内存存取器(RAM)

下面开始从硬件的角度去逐步探索下面图片中的这一张内存条:
这是一张内存,上面焊了8个内存模块

我们放大其中一个模块,会看到每一个模块又由32个小模块组成,下图为8个内存模块其中一个的放大部分:

我们继续放大这三十二个小模块的其中一个小小模块,会发现这个小小模块又由4个小块组成,如图:

我们继续放大这四个小模块的其中一个,会看到一排排密密麻麻小点组成的矩阵,那一个个小点也就是我们前面说的“锁存器”,下图这个矩阵是128X64位,也就是8192位

所以每一片芯片的位数是:
8192X4X32=1048576
每个芯片有一百万位

这张内存一共有8个芯片,所以一共有8百万位

那么根据前面最开始的内存计算单位我们可以得到,这张RAM内存的可以存储1MB的数据,可能你会说在当今的日常生活中,1MB的内存也太小了吧,这种内存条可能连一首流行音乐都存入不了。那是因为上面这张内存条是上世纪八十年代生产的,那时的制作工艺和现在肯定会有差异,当今世界的内存通过不断的技术改变让单位面积芯片所存的位数量变得更多了,同样大小的内存的存储量是之前的一百倍甚至上千倍,所以现在的内存基本都是GB甚至TB量级的了,但是至少从目前的技术角度来看,内存的存储基本原理还是和前面所说的大致一样,没有发生实质性的变革(量变而没有质变)。

posted @ 2020-04-09 18:04  骇客HK  阅读(2357)  评论(0编辑  收藏  举报