写在前面的话:从接触电脑以来,就一直对电脑充满好奇。当电脑连接上电源,按下开机键,我们就可以做所有我们想 做的事情,打游戏、写文章、看电影、搭建web服务器、自己写程序等等。随着接触电脑的时间越长,反而对电脑更加的陌生,不断的问自己,计算机到底是怎么 组成的?为什么就能够实现这些功能?如果让我穿越回多少年前,该如何搭建一台电脑?恰好这几天读完这本书《code:the hidden Language of computer hardware and software》,确实一本好书,许多的疑惑得以解开,这篇博客就写写那些深深触动我的点,我认为,理解了这些点,也就理解了整本书的内容,进而理解了 计算机是怎么回事。
=====正文开始========
1.继电器
看下面两幅图:
(1)左图中:一个铁芯,缠上一些线圈,当没有通电时,开关A是断开的,Out端没有电压,我们认为输出为0.
(2)右图中:当线圈通电后,铁芯被磁化,相当于变成了一块磁铁,进而可以吸引上面的开关A,Out端有电压,我们认为输出为1.
上面这么一个小小的简单的东西,就是继电器,它的意义非凡,因为我们可以人为的去控制:输出0和1了。
虽然在计算机中,继电器逐渐被真空管、晶体管取代,但是他们要实现的作用是一致的:输出0和1。
2.二进制
我们生活中采用十进制,可是计算机内的计算采用二进制,我认为这是非常重要的改变。请看下面的逻辑:
(1)二进制只有0和1,进而也导致二进制的加减乘除的结果只有0和1,二进制的与或非的结果也只有0和1
(2)进而可以将二进制的加减乘除与二进制的与或非进行等价
(3)而继电器可以输出0和1,因此可以通过继电器的各种”变着花样的组合“实现各种与或非
(4)因此可以通过继电器的各种”变着花样的组合“实现二进制的加减乘除运算。
理解了上面的逻辑,接下来要做的仅仅是实现所需功能而已。如何实现功能,也只是时间而已,下面贴一些图,展示一下如何通过继电器实现复杂的逻辑 结构,作为一个实现思路的引子,而实现各种自己想要的逻辑,经过几个夜晚的苦思冥想,是可以想出来的,如果不想自己去想,那么可以看看Code一书,算作 一个捷径。
继电器实现逻辑与
继电器实现逻辑或
继电器实现半加器
继电器实现全加器
不要被上面的图吓到,他们仅仅是继电器的变着花样的组合而已,如果我们沉下心来,也可以实现这样的组合,甚至可以实现更多我们所需要的,比如8位加法器、减法器、乘法器、除法器等等。
于是我们已经能够实现了计算机中CPU的一个重要功能:逻辑运算。
然而上面的操作,例如输入,都需要我们人为的去操作,我们可以去想象一下:一个人坐在那里,拨着开关,进行着操作,是多么的枯燥。如果实现自动运行,也就是说无需人为的操作,实现0、1的输出,是多么好的一件事清,我们确实也可以做到,接着往下看。
3.另外一种连接方式的继电器:反馈
看下面两幅图:
左图中,继电器没有通电的时候,继电器上面的开关B是闭合的;右图中,一旦给继电器通电(也就是开关A闭合),奇妙的事情就发生了:
(1)继电器通电,会吸引上面的开关B,进而使电路断开。
(2)电路一旦断开,开关B又恢复原位,使电路接通。(注意开关A一直是闭合的)
(3)上面两个过程自动重复进行下去了。
上面实现了这样的一种可能:继电器的输出可以在0和1之间自动完成,而能够自动完成的根本原因,在于下面两点:
(1)继电器在断电的情况下,开关B是闭合的(常闭型继电器),而前面的讲到的继电器在断电的情况下,开关B都是断开的(常开型继电器),这是一点不同。
(2)继电器的输入和输出没有分开,而是组成了一个回路,确切的说:是有反馈了。
经过上面两点小小的改变,我们可以利用这种思想,实现一系列其他所需的功能:
(1)我们可以实现RS触发器 (2)我们可以实现D触发器:实现对1位数据的保存。
其中D触发器可以称为1位锁存器;通过对D触发器的各种变着花样的组合,我们可以实现边沿电源触发的触发器,进而实现多位锁存器;
通过将边沿触发的D触发器的输出反馈至输入,我们又可以实现分频器,进而实现计数器,同时计数器可以作为各个部分的时钟触发信号。
如果忽略上面的细节,我们知道我们已经可以实现锁存器、计数器、时钟信号。
于是锁存器构成了CPU中的寄存器和电脑中的内存RAM以及显卡的显存RAM;
计数器和时钟信号构成了计算机中的时钟驱动信号。
4.总线
上面我们可以说已经实现了CPU和RAM(内存、显 存),一旦将CPU与RAM连接,在能够自动运行的时钟信号的驱动下,CPU和RAM就能够协同工作实现所需的功能。CPU与RAM连接后,既可以实现 RAM的输出给CPU进行运算,又可以实现CPU的输出给RAM进行存储。
这些的输入输出都是通过实实在在的导线连接的。为了不至于使导线密密麻麻的难以辨识,我们可以对各个电路部件进行”各种变着花样的组合“,并把线路梳理清楚,总结为三种线路:数据总线、控制总线、地址总线。
(1)数据总线:上面传输的是数据,如果能够传输8位,那么就说数据位宽为8位。当然这里8位也是与前面提到的锁存器的位数是对应的;也可以说是与CPU中的寄存器的位数是对应的,其实都一回事。
(2)地址总线:地址总线也一根根的实际的导线,通过这些导线,就可以能够方便的选取RAM中的特定的锁存器;地址总线的数目决定了能够寻址的最大RAM。
(3)控制总线:传送控制信号,实现特定的控制功能,比如确定是读RAM中的数据,还是往RAM中写入数据。
还是要说上一句:这些线都是实实在在的导线。
5.机器语言
总线上面传输着0和1信号,通过0和1信号的各种变换,表示着传送不同的信息;RAM具有存储的功能,因此我们可以把一下0和1的信息存储进RAM,进而就可以让CPU去执行该命令了,这些命令就可以称为机器语言。
机器语言的0和1我们可以通过开关等多种方式写入RAM中,毕竟RAM是可以存储信息的;如果每次都写01太繁琐和不方便,于是将这些01的代 码用特定的符号表示,出现了汇编语言,汇编语言变成01代码的机器语言,需要通过汇编程序来实现,而汇编程序将汇编源程序汇编成机器代码,其实就是去查一 下机器代码和汇编符号的对照表格而已。
随着时间的发展,高级语言也相应出现了。
CPU本质上来说是由继电器构成的,确切一点是晶体管构成,不同的公司的不同工程师造出来的cpu,相应的构成也会有一些差别,导致机器指令代码也就不同,于是出现了不同的指令集,如X86指令集,RISC指令集等等。
6.外部存储介质
前面提到的RAM,本质上是由继电器构成的,确切的说是由半导体构成,这都无所谓,他们都有一个共同的特 点:当断电的瞬间,一切都没有了,为什么呢?因为电这个东西比较奇怪,说没就没了,如果想要长久的存储数据,得需要其他的方式:例如通过磁性物质来存储, 于是出现了磁带、磁盘;通过光信息来存储i信息,如光盘;以及其他的东西:如ROM、Flash等。
计算机的构成越来越复杂,以至于掩盖我们内心最初的好奇与冲动。