33

(1)计算机是如何读懂0和1的?- RAM

 3 years ago
source link: https://zhuanlan.zhihu.com/p/263043369
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
1、什么是触发器
2、什么是8位寄存器
3、什么是总线
4、什么是内存

计算机是如何读懂0和1的?这个问题曾经困扰了我很久,直到看到一本书《BUT HOW DO IT KNOW – The Basic Principles of Computer for everyone 》,作者用平实的语言,几乎手把手搭建了一个简单的8位CPU,看完之后心情非常愉悦。鉴于原书是英文版,书也非常贵,接下来将我自己的读书笔记摘录下来, 与大家共享。文章绝大部分图片来自于这本书,只不过我用visio重新绘制了,并增加不同的颜色,更便于阅读。

计算机是什么呢?——简而言之,可以看成是一个“ 自动干活的设备 ”。说起来并不复杂,我们一一拆解一下这句话。首先“ 设备 ”很好理解,不用多解释。“ 干活 ”也好理解,就是要能实现一定的功能。“ 自动 ”是啥意义呢?——就是在初始人为干预结束后,设备能 自动运行 ,也就是说,机器能自己 存储并执行 某种预设的“ 指令 ”。按照这个理解,我们基本就可以得到计算机的组成了: 负责干活 的设备和 负责存储 的设备。我们把前者叫做 CPU ,后者叫做 RAM 。当然还需要一些辅助设备将这两个东西连接起来,简要模型如下:

MRru6nJ.jpg!mobile

和CPU相比,RAM相对简单一些,先来说说这个。

1、什么是触发器

前面说了,RAM的作用是存储数据,我们知道,要存储信息,至少要有两个状态,且都必须失稳定的,我们把这样的器件称为 双稳态器 。最简单的双稳态器组成非常简单—— 两个非门串联反馈在一起 ,如下图所示:

Qbq6ni6.jpg!mobile

经过简单分析这个电路,很容易发现:上图中红色部分信号既可以是 高电平,也可以是低电平 !也就是说,原来电路上是高电平的话,就一直维持在高电平,原来低电平的话,就一直维持在低电平——这个电路有两个稳定状态,也就是有最简单的 记忆功能

学过数字电路的人都知道, 触发器 是现代电子技术中一个非常核心的器件,其实 触发器的本质就是通过两个非门串联反馈在一起的双稳态器 。关于这一点, 三郎:计算机数学小书2-D触发器的进化之路 这篇文章中有一个很好的介绍,非常容易理解,这里也借用作者的思路。

但是呢,基于两个非门串联反馈在一起的双稳态器有一个缺点:

状态一旦确定了之后就不在变化了,也就是说,我们没有办法改变这个系统的记忆,因为没有控制接口。

这当然难不倒我们,我们可以自己加上,比如,可以用两个与非门来代替非门,这样就可以增加两个控制端:

rMjIJ3F.jpg!mobile

当然,也可以用或非门来代替非门,感兴趣的可以自己试一下。

R7FZbm3.jpg!mobile

有没有一种似曾相识的感觉?没错,这就是RS触发器,它有四种状态:

a=1,b=1,为保持状态,也就是退化为两个非门的反馈串联;

a=0,b=1或a=1,b=0,就会控制记忆和输出;

a=0,b=0,o和 都是1,应避免出现该种状态,我们称之为非法态。

有两个bug:

能够控制记忆,但是有非法状态;

整个系统不受控,一直在工作,当输入端变化时,输出端也跟着变化。

我们可以在输入端再增加两个或门,这样的话,中间这个输入引脚为1的话,电路处于保持状态,就自动屏蔽外部输入,也就是老子不干活了。只有中间这个引脚为0的时候,才工作。

r6bequI.jpg!mobile

这样就就解决了第二个bug,但是依然有存在非法态的可能,怎么干掉呢?

F7JjU3q.jpg!mobile

这就是 电平型D触发器

前面我们说了,只有当s=0时,输出才等于输入,系统才开始干活,我们更习惯s=1时干活,这样也好办,再加一个非门。同时,我们把表示a改为i,意为input。

z2qYZnU.jpg!mobile

这样显得略臃肿,我们知道:

qaEVN3.jpg!mobile

即:

RNfiyu7.png!mobile

这样左上方的或门就可以变为与非门,所以有:

7FvUvyq.jpg!mobile

同时,我们又知道:

UVnyUrA.jpg!mobile

eqyqqyN.png!mobile

所以,此时:

ueY3Mn3.png!mobile

可以进一步简化成4个与非门的形式。

auYny2F.jpg!mobile

这就是1位寄存器了。简写形式如下:

BF3Qry6.jpg!mobile

其功能是:

当s=1时,o=i;当s=0时,o保持原来的状态。

2、什么是8位寄存器

前面说的是1寄存器,我们可以很容易扩展到8位,数据输入端i是相互独立的,“写”信号s并在一起,对8位信号输入统一控制:

u6j6Bbf.jpg!mobile

也就是说,当s=1时,o=i;当s=0时,o处于保持状态。

8bit=1byte,可以把上面电路抽象成:

3MzIj2B.jpg!mobile

我们知道,每一位都有0和1两个状态,对于8位锁存器,有2^8=256个状态。

前面我们已经搞定如何控制将8位数据“写入”,那如何控制数据的“读出”呢?——很简单,再增加一个“使能器”:

iyeYrym.jpg!mobile

组成很简单,8个与门,当e=1时,o=i;e=0时,o=0;可以抽象成:

6FRn6j7.jpg!mobile

把8位触发器和使能器串联在一起:

b63mymN.jpg!mobile

s相当于“写”的使能端,e相当于“读”的使能端。放在一起就是一个8位寄存器了,抽象如下:

rI7bAf7.jpg!mobile

其中R表示register。顾名思义,存储器的作用就是存储信息,并且能通过使能端控制信息的写入和读出。

3、什么是总线

计算机里面很多时候都需要把上面的8位寄存器的8根输入线或8位输出线连接在一起,为方便起见,我们可以用一个双线代替,这样8位寄存器就可以表示成如下样式:

MrQn2y2.jpg!mobile

当有两组8根线相互连接时,也可以简化成两个双线的样式:

Evei2uu.jpg!mobile

有了线束与线束之间的连接,我们就可以在上面挂很多寄存器了:

IRNbaq3.jpg!mobile

这种传送公共信息的干线称之为 “总线” 。同样,寄存器可以以各种形式挂在总线上。

yABvAzU.jpg!mobile

4、什么是译码器

我们现在是要做一个内存,想要存储很多信息的话,就要很多bit。就像人都有名字一样,每个bit也要增加一个识别号,我们称之为“ 地址 ”,主要靠译码器来实现。

我们从最简单的两位译码器来说,就是两个输入,怎么来实现四个状态。抽象成数学的形式就是:

vYn2UjV.jpg!mobile

数学关系为:

meIzeeV.png!mobile

具体的逻辑实现为:

yyayU3m.jpg!mobile

这称之为 译码器

同理可实现译码器如下:

mEFBVbR.jpg!mobile

数学逻辑为:

UVzMzmF.jpg!mobile

一般可以将译码器简化成:

eYreAv.jpg!mobile

这样我们有三位地址线,有可以得到8个编号,从而分配给不同的寄存器单元。

4、什么是内存

有了8位寄存器,有了译码器,我们现在就可以磨刀霍霍,去搞一个内存啦。不过,我们现在胃口大了,不能再搞1个8位寄存器了,我们想搞256个8位寄存器,也就是28byte。

根据前面的分析,我们知道,需要8位地址线来实现28个状态。前面我们已经看到,译码器已经有点小复杂了,现在搞一个译码器,输出有256根线,想想就害怕,还是算了吧,必须要想别的辙。

一个很简单想法就是拆分,把8位地址线拆成两个4位地址线,这样只需要两个译码器即可,这个复杂程度就可以接受了,如下图所示,主要包括三个部分:两个译码器,一个8位寄存器,寄存器的输出分成两路,分别作为译码器的输入。

byIJjm7.jpg!mobile

两个译码器的组合,就可以得到一个矩阵,矩阵大小为,这样矩阵中的每一个点代表一个8位寄存器,每个点都可以通过纵、横两个坐标来唯一的表示,其中横坐标由寄存器前四位确定,纵坐标由寄存器的后四位确定,示意图如下:

26vUryN.jpg!mobile

这样每个8位寄存器的坐标都可以确定了。当然,光有坐标还不够,我们好需要对每个寄存器进行“写”和“读”的操作,因此,每个寄存器还要加入这两个输入端,具体怎么实现先不管,大致样子如下:

amM3YjB.jpg!mobile

当然,能够控制“读”和“写”的操作外,还需要读写的数据,这个也不难实现,把每个寄存器都连到“总线”上。

FRRZniN.jpg!mobile

好了,我们有了大概的内存的样子,我们需要来考虑细节了:每个寄存器是怎么和地址线、“读”“写”使能线以及总线连接在一起的?

我们把上图中红色圈内的一个寄存器打开,看看里面是如何实现的:

QnQraqj.jpg!mobile

如果只聚焦每个byte的连接方式:

FzyuUzu.jpg!mobile

里面包含三个与门,我们来分别解读一下每个与门代表的意思:

第一个与门:vertical grid line和horizontal grid line就是前面所说的纵坐标和横坐标,通过与门的形式输出,代表的意思就是纵坐标和横坐标都是高电平时,该寄存器才被选中,才能进行下一步的操作;

第二个与门:第一个输入是与门输出,也就是代表该寄存器是否被选中,第二个输入时s“写”信号,两个输入“与”之后连接到该寄存器,表示该寄存器被选中,并可以对该寄存器进行“写”操作;

第三个与门:第一个输入第一个与门输出,第二个输入时e“读”信号,两个输入“与”之后连接到该寄存器,表示该寄存器被选中,并可以对该寄存器进行“读”操作;

同时,该寄存器通过总线与其他设备交换数据。

把每一个寄存器都按照此方式连接,就可以得到一个256byte的内存。抽象如下:

zaeEN3F.jpg!mobile

可以采用总线的形式进行抽象:

BB7Jbiu.jpg!mobile

我们把这种内存称之为Random Access Memory,简称RAM,也就是随机访问存储器。为什么是随机访问呢?——因为地址可以是随机的,内存中的任何寄存器都可以以任何顺序进行访问,不存在先后依存关系。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK