我们知道计算机的基础是数字电路而数字电路的基础是布尔代数。
布尔代数是1847年由英国数学家乔治·布尔发明的,他想用数学符号来表示人类的逻辑思维,
普通的数学运算是使用十进制的加减乘除,而布尔代数是使用二进制的与或非运算。
比如上面表格的例子,输入是A和B,输出是X,与运算就是当a b输入都为1的时候输出才为1,其他情况输出是0,
而或运算是当a b其中一个为1那么输出就为1,非运算是输入跟输出相反,输入0输出1输入1输出0。
那么布尔代数跟数字电路有什么关系呢,我们看下面的两个电路:
我们把开关闭合用1来表示,开关断开用0来表示,灯亮用1来表示,灯灭用0来表示,
那么左边的串联电路就相当于是与操作,只有当两个开关都闭合的时候,灯才会亮。
而右边的并联电路就相当于是或操作,其中一个开关闭合,灯就会亮。
如果只使用这种普通的开关只能实现一些最基本的逻辑,如果我想实现一些其他比较复杂的逻辑
这种电路就实现不了。
比如我想实现当两个开关都闭合的时候灯是灭的,然后两个开关闭合一个或者是两个都断开的时候灯却是亮的,你如果使用这种普通的开关,就实现不了这种逻辑。
那么这时候就需要结合继电器来实现,继电器最开始是用在电报里面,电报需要去布线,随着你线的长度越来越长那么它的电阻就会越来越大,信号在传输的过程中常常会被消耗掉,那么接收方就接收不到信号,
那么这时继电器就派上了用场,继电器它可以接收一个弱的信号,然后经过新的电源去增强以后再发送出去起到中继的作用,
继电器的结构也比较简单,如下图,它有一个新的电源,有一个电磁铁,然后有一个金属弹片
它可以在in这里输入一个弱的信号,然后电磁铁通电以后,就会把这个弹片拉下来,这时候电源跟输出out就导通了,那么这时候就可以输出一个增强的信号。
然后我们把多个继电器组合起来,就可以实现一些比较复杂的逻辑,比如下面这个电路就可以实现我们前面说的,当两个开关闭合的时候灯是灭的,当两个开关都断开或者是断开开一个的时候灯却是亮的
在数字电路里面会把高电压用1来表示,低电压用0来表示,比如上面的电路,开关闭合的时候输入的是高电压就代表输入的是1,当这两个弹片都被拉下来的时候,输出的是低电压就代表输出的是0。
像这些开关,继电器跟布尔代数在19世纪就已经发现了,但是经过了很长的时间都没有人把这些联系起来,直到20世纪30年代才有人想到可以用布尔代数来设计电路。
主要贡献者是英国科学家克劳德· 香农,他在1938年发表了一篇著名的论文叫做<继电器与开关电路的符号分析>,他在论文里面就阐述了怎么用布尔代数来设计和优化电路,从而奠定了数字电路的理论基础。
同时香农还是信息论的发明者,他在1949年发表了一篇论文叫做<通讯的数学原理>,奠定了信息论的基础,在计算机中的bit这个单词也是来自于这篇论文。
继电器的组合被称为逻辑门,它们构造的基本的逻辑电路也称为门电路,常见的门电路有与门,或门,与非门,或非门,我们后面会详细介绍这些门电路的实现方式。
门电路它只是数字电路的最基本的部件,那么怎么使用门电路来设计一个计算机或者计算机应该由哪些部件构成以怎样的方式来运行呢?
1936年英国数学家艾伦图灵,提出了一种抽象的计算机模型,他把人类用纸和笔进行运算的过程,通过一个机器来代替,这个机器就被称为图灵机,下面这个图就是图灵机的概念图
它有一个无限长的纸带,纸带上面有一块一块的方格,一个方格能够存储一个符号,比如可以存储0或者是一,然后它有一个机器头里面有些固定的程序,和一个当前的状态用来表示当前计算到哪一步了,
比如这个图它当前的状态可以是从0到11,那么机器头就在纸带上反复的移动,根据当前的状态跟程序对纸带上面的方块进行读取,擦除,和写入操作,从而完成程序所描述的计算。
图灵机第一次提出了程序的概念,相同的程序,不同的输入它的输出结果是不一样的,而相同的输入,不同的程序它的输出结果也是不一样的。
然后图灵机提出了一种使用机器进行计算的简单的方法,不管你的程序有多么复杂,我只需要机器头简单反复的在纸带上面移动,可能需要移动几千次几万次,但是我最终都能够完成计算。
所以通灵机为计算机的实现提供了一种重要的思想,肯定了计算机实现的可能性,为计算机的实现提供了一种大致的架构。
冯· 诺依曼在1946年提出了冯· 诺依曼计算机体系结构,并且制造了第一台现代意义的通用计算机EDVAC,使用冯· 诺依曼体系结构的计算机,被称为冯· 诺依曼计算机,它有下面的几大特点。
第一点计算机有五大组成部分,包括运算器,控制器,存储器,输入设备和输出设备,其中运算器和控制器是计算机的核心CPU。
第二借鉴布尔代数的思想,使用二进制进行计算而不是十进制,使用二进制可以大幅度的简化乘法跟除法的运算。
第三点冯· 诺依曼 提出了存储程序的概念,之前的存储器里面只有数据是放在存储器里面的,而程序是通过改变开关和布线的方式来编程的,那么这样实现和维护起来就会比较麻烦,冯· 诺依曼认为程序跟数据的本质是一样的,都是可以使用0和1来表示,所以程序跟数据都可以放在存储器里面,然后计算机自动从存储器里面读取指令然后执行。
冯· 诺依曼体系结构对计算机的影响是巨大的,直到现在绝大多数的计算机,仍然采用的是冯· 诺依曼体系结构。
计算机的发展经过了继电器机械计算机,电子管计算机,晶体管计算机,到集成电路计算机和微型计算机。
最开始的计算机是由继电器来构造的,其中的代表是1944年由IBM制造的哈佛Mark1号,它有3,500个继电器,一秒钟可以做三次加法或者是减法,体积非常的庞大,像这种巨大又温暖的机器很容易招虫子,1947年哈佛Mark2号的操作员,从故障的继电器里面拔出来一只虫子bug,从那时起每当电脑出现了问题我们就说它出了bug,这就是计算机专业术语bug的来源。
继电器它属于机械设备,那么随着时间的使用,它会磨损,变慢甚至损坏,而且机械它运动起来很慢,继电器一秒钟只能够开关50次,所以需要更快,更可靠的部件来设计计算机。
后来工程师就使用真空管来设计计算机,真空管它有一个真空的玻璃管,里面有两个电极就是两个金属片,一个是阴极,一个是阳极,在阴极这边有一个加热器,当阴极被加热以后它的表面会溢出电子,这种现象被称为热电子发射,也叫做爱迪生效应是由爱迪生发现的。
然后在阳极这边有一个阳极电压可以让阳极带正电荷,那么它就会把带负电荷的电子给吸引过来,电子流动就会产生电流,那么这时候阳极这边就会输出高电压。
在中间还有一个栅极起到控制的作用,栅极就是一种栅栏状的金属网,它有一个电压可以让栅极带正电荷或者是负电荷,如果带正电荷的话那么电子就可以流动,阳极这边就输出高电压,带负电荷的话电子就会停止流动,阳极这边输出的就是低电压,那么就可以实现跟继电器类似的开关的功能。
真空管也叫做电子管它是一种电子的设备,所以它内部没有机械的运动,那么它就没有机械的磨损,运动起来也就会更快一些,所以它每秒钟可以开关数千次。
第一个大规模使用真空管的计算机叫做巨人一号,它有1,600个真空管,是1943年制作的,然后在1946年在宾夕法尼亚大学又制作完成了ENIAC,它是世界上第一台真正的通用可编程计算机,它采用十进制,然后编程的方式是使用改变布线和开关来实现的,它使用了18,000多只电子管,重130多吨,占地面积有170多平。
所以使用真空管来构造计算机也是非常的庞大,然后真空管也是比较脆弱的,玻璃管很容易碎,而且跟灯泡一样它容易被烧毁,所以真空管后面又逐渐的被晶体管所取代。
晶体管是1947年由贝尔实验室发明的,跟真空管不同晶体管是由固态的半导体来制作的,所以它不容易碎,而且它的大小比继电器跟真空管要小很多,运动起来也更快,第一个晶体管他每秒钟就能开关1万次,而现在的晶体管一秒钟甚至可以开关100多万次。
现代的集成电路一般使用MOS晶体管来制作电路,MOS晶体管有三个极,source源极,drain漏极,gate栅极,源极作为输入,漏极作为输出,栅极起到一个控制开关的作用,就跟水龙头一样,当开关打开的时候,源极跟漏极就是导通的,当开关关闭的时候,源极跟漏极就是断开的。
MOS晶体管又分为NMOS管和PMOS管,NMOS管就是当栅极输入的是高电压的时候源极跟漏极是导通的,而PMOS管是当栅极输入的是低电压的时候源极跟漏极是导通的,所以NMOS跟PMOS起到互补的作用,那么由NMOS跟PMOS管构成的互补型的MOS电路,就是我们常听说的CMOS集成电路。
第一个完全使用晶体管制造的计算机是1955年由IBM发布的IBM 608,它有3,000个晶体管,每秒钟可以执行4,000多次的加减法,而且作为一种商用计算机它的价格也不是特别贵,普通的消费者也可以买得起。
然后计算机又发展到集成电路阶段,之前在设计计算机的时候,都是把晶体管,电阻这些元件作为一个独立的元件,然后通过布线连接起来,而集成电路是把这些元件全部设计在一块芯片上,把它们组成一个整体,变成一个新的独立元件。
也就是说,之前的独立元件它里面只有一个晶体管或者是一个电阻,而新的独立元件一个元件里面,可以有多个晶体管和多个电阻,这样就使电子元件它的体积更小,功耗更低,可靠性也更高,也便于大规模的生产。
那么随着集成电路的规模越来越大,甚至可以把CPU里面所有部件包括寄存器,控制器,ALU,全部集成在同一个芯片里面,就称为微处理器,第一款微处理器是英特尔在1971年发布的Intel 4004,里面有2,000多个晶体管。
那么由微处理器跟同样由大规模的集成电路制成的存储器,IO接口组合起来构成的就是微型计算机。
Intel 4004它只是一个开始,从此以后每隔18个月到24个月,微处理器内部的晶体管的数量就会增加一倍,也就是说处理器的性能大约每过两年就会翻一倍,同时价格会下降为之前的一半,这就是著名的摩尔定律,是由Intel创始人之一戈登· 摩尔提出的。
下面这幅图就描述了微处理器内部的晶体管数量的增长速度,最开始Intel4004只有2,000多个晶体管,然后到2010年奔腾4有10亿个晶体管,到了2020年apple A12有60多亿个晶体管,接近100亿个晶体管,而且它芯片大小只有指甲壳那么大小,真的非常的不可思议。
然后我们再讲一下现代计算机的结构,下面就是一个PC电脑的主板的结构,它有一个CPU,CPU连接一个北桥芯片,在北桥芯片里面有主存跟显卡控制器用来访问主存跟显示器,北桥芯片再连接一个南桥芯片,在南桥芯片里面有各种IO设备的控制器,有磁盘,USB设备。
因为不同的设备它的构造是不一样,有的是机械设备,有的是磁性设备而CPU是电子设备,所以CPU不能直接跟这些设备进行通信,每个设备都需要有一个对应的控制器,CPU通过控制器跟这些设备进行通信,采用这种南北桥的架构,CPU在访问主存的时候,首先要经过北桥,然后在访问磁盘的时候要先经过北桥再经过南桥,这样性能就会低一些。
然后后面计算机结构又做了改进,如下图,他把对性能要求比较高的主存控制器跟显卡控制器,还有CPU都集成在同一个芯片里面,这样访问主存跟显示器就会更快一些,然后其他的控制器就集成在另一块芯片里面。
然后在嵌入系统里面又做了进一步的集成,他把CPU,主存,其他的所有的控制器,全部集成在一块芯片里面,而且这个芯片它只有指甲壳那么大小,这种芯片就称为片上系统芯片Soc,广泛应用于手机跟平板电脑。
最后我们简单介绍一下计算机运算的过程,下面就是一个典型的冯· 诺依曼计算机的结构,包括CPU,存储器,输入设备和输出设备,总线,CPU内部包含ALU,控制器和通用的寄存器,PC程序计数器用来存放下一个指令的地址,IR指令寄存器用来临时存放指令,在存储器里面一部分用来存放程序,一部分用来存放数据,通过地址来寻址。
我们用M0, M1和M40, M41, M42来代表存储器的地址,CPU是在时钟的推动下来执行指令的,一个时钟周期可以执行一条指令,然后一条指令的执行可以大致分为四步取指,译码,执行和回写。
比如我们看一下怎么执行1+1=2这个程序,它编译后会编译成4条汇编指令,我们假设这四条汇编指令是存放在M0到M3里面的,然后两个操作数1是存放在M40跟M41里的,最开始的时候PC是指向M0的,那么在第1个时钟周期CPU首先执行取指的操作,从M0里面取出第一条指令,然后执行第二步译码,解释指令的意思,然后第三步执行指令,把操作数1从M40里面移动到R0寄存器里面,然后第四步是回写,这条指令不需要回写。
第二个时钟周期就执行第二条指令,把另一个操作数1从M41移动到R1里面,然后第三个时钟周期再执行下一条指令,取指,译码,执行,把R1跟R0相加结果存放到R2里面,然后执行下一条指令取指,译码,执行,这条指令就需要回写,把R2的结果回写到M42里面,这样就把1+1=2的结果计算出来存放在M42里面。
后面我们就会详细学习这里的每个部件,然后我们会使用晶体管来构造一个可以执行指令的CPU,从而加深对组成原理的理解。