大家好,又见面了,我是你们的朋友全栈君。
为什么计算机能读懂 1 和 0 ?
161 个回答
这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算?
我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答,大家也只是解释了一部分问题,没有完整的把计算机整个的抽象层次说清楚。在大学里我看到了 Charles Petzold的《编码 隐匿在计算机软硬件背后的语言》,这部永不退色的计算机经典著作,为了讲明白了这件事儿,今天我决定用自己简略的话,回顾一下作者写作的思路,用我的理解为大家讲述计算机的工作原理。希望我能够完成。
今天的计算机已经变得相当复杂,是有史以来人类创造的最复杂最精密的仪器,没有之一,是二十世纪技术领域的“登峰造极之作”,计算机与生俱来的层次化体系结构,掩盖了技术背后最本质的东西,现在已经很少有人去关心计算机最本质的工作原理,我希望能剖析计算机一层层‘“抽象”面纱,展现最本质的“计算”过程。基本的知识基础是高中物理,高中数学。
第一节 计算器
下面回到高中课堂,我依稀记得在电磁学那一部分,讲到了电磁继电器,当时老师说,继电器是很重要的发明,我打开物理课本,“什么破东西嘛”,太简单了,那时候觉得像继电器这样的发明没什么用。高中数学中也讲到,布尔代数,简单老说就是,与、或、非,而且教科书上说,布尔代数意义重大云云。下面问题来了,我只用继电器能不是实现简单的计算器?注意是“计算器”,而不是计算机,答案是肯定的,来,那就看看,如何用继电器打造出一个”计算器“,进而打造出一台”计算机“
两个继电器串联,点亮一盏灯,这算不算实现了“与”的操作呢?两“真”为”真“
两个继电器并联,点亮一盏灯,是不是实现了”或“的操作?一真为真
一个继电器本身就可以实现”非“的操作
这样一来,物理上的继电器,和布尔代数,完美的融合起来,我把与或非门继电器实现称作”物理层“,每张图右边的符号表示,称作”布尔逻辑层“,从”物理层“到”布尔逻辑层“是我们的第一层抽象,很简单吧?(当然现代计算器从物理实现到逻辑实现,已经使用继电器,而是在硅芯片上雕刻一个个的晶体管,但晶体管的数量绝对不会减少,这一点@丁旭 已经说得很明白)
接下来可能有人问,你整这些小儿科的东西,有什么用呢?别急,看我慢慢展开!
我们知道,布尔代数是一种数学,既然是在一种数学,那么存在数学运算啊,数学运算能用继电器实现吗,of course
一个或门,一个与非门,一个与门,按照图示连在一起形成了一个最常见的运算,异或运算,”相同为假,不同为真“,那物理实现上怎么做呢?请在大脑中想想怎么连线,一共七个继电器就可以实现,有了异或运算,我们就可以实现更复杂的运算,下面就和我们实现一台”计算器“直接相关了
一个异或门和一个与门,形成一个”半加器“,图示下边的符号表示一个半加器,这里是新一层的抽象,从布尔逻辑运算到”计算器件“的抽象
有一个半加器,距离我们实现手工打造一个”计算机“还很远,然而两个半加器,一个或门,可以实现一个”全加器“,为什么叫全加器呢?因为我们使用它可以实现一位加法的计算!(这里是二进制,问题的题目,为什么计算机能读懂”0“和”1“,看到这里是不是心头一喜呢?)
有了一位”全加器“,我们实现8位加法的计算还远吗?当然不远,8个全加器,按图示相连,就可以实现8位加法计算(和我们在纸上进行加法运算很像,进位的操作很显然。当然,这里都是进行二进制加法),右下方是8位加法器的表示方式。
要是这会儿在19世纪,在电力革命的年代,我一定要亲手打造一个计算器!
画的比较简陋,见过卡车上的按钮吗?上下拨动的那种,这是我穿越回19世纪站在专利局门口,阐述我”伟大”的发明,“我发明的计算器,有两排输入按钮,每个按钮上下拨动表示输入的是0或者1,最下排是9个灯泡,灯泡的亮与灭,指示这一位是0,还是1,我的发明是划时代的,可以把人类从繁杂的计算过程中解救出来…”
“什么?就因为我的计算器不能实现减法运算儿拒绝我的专利申请,减法运算?减法运算,怎样实现计算机的减法运算呢?”
计算机发展过程中,最重要的思想是“抽象”,一层层的抽象封装了实现的细节,使的计算机开发人员更关注与逻辑的实现,相信有了我上面的表述,读者应该能看懂下边的抽象思想:
这个电路实现了把输入的数据取反(0->1,1->0)
这是求补器的“抽象”
减法的逻辑实现我直接给出,相信读者也应该能看明白
我还清楚的记得,在计算机组成这门课上,老师讲述,原码和补码概念,“在计算机内部,正数的补码是它本身,负数的补码,记得取反加1“,为什么取反加1呢?看看上边的实现,计算机内部如何实现减法?有个取反操作,还有个进位操作,这不正是”取反加1“吗?
下面从逻辑实现层,回到物理层,思考下,需要多少继电器才能实现这样的 ”小发明“,算了,吓一跳吧?然而我们的计算机先驱康拉德·楚泽花费了十年心学,3000多个继电器才早出一个计算机原型,所以,,,本着向先哲致敬的精神,让我们在大脑中”打造出“一台计算机
”我的专利不仅仅能实现加法操作,也能实现减法操作,计算具有普遍性,具有划时代的意义,可以把人类从复杂的计算中解救而出来…“
至此,我们实现了一个简单的计算器实现,不难吧?然而这才只是万里长征的第一步。
接下来我来说说,计算机是如何存储信息的,这真是个费力活儿,在不太遥远的过去,二十年前,计算机的存储量还非常有限,我记得初中那会儿还没有MP3,用磁带听歌,直到最近,存储技术才有了长足的进步,当然这是后话。
第二节,计数器
人类的感官,听觉,触觉,味觉,视觉,感官器官接受外界的刺激,在大脑中留下神经信号,进而形成对“外部世界”的认识,那抽象的事物怎么去认识呢?
电灯通电点亮灯泡,高中的物理知识解释,足够了。电可以让物体运动,这个道理人人都懂。坐在回家的高铁上,让我想想一下高速列车是如何运动的:驾驶员按下通电按钮,带动电车引擎,电车引擎通过传动装置把牵引力传给电车车轮,列车得以启动。高速列车的动力系统也相当复杂,我不了解每一个实现的细节,但是我可以想想出电车引擎的工作原理,为什么?因为这些都是实实在在的实物,看得见摸得着。那我想想出计算机的工作原理吗?答案是不能,为什么?因为计算机一层层的“抽象”,一个小小的物理器件上集成了上亿的基本元器件,使计算机真正的工作原理是我们越来越遥远。
下面还让我们回到19世纪末,二十世纪初,那个激荡人心的电力革命的年代,让我们去还原真实的技术实现过程。回到高中物理课堂
我们已经讲解了如何去制造一个一台简易的“计算器”,不知不觉下课了,这时我听到一阵刺耳的下课铃声。电铃和计算机有关系吗?我直接上图吧
注意看旁边的那个金属小锤子
电铃的工作原理如上图所示,大家想象下,电铃的小锤子震荡起来敲打金属盖发出声音的情形,duang,duang,daung,形象吧?(这种电路叫做震荡器)
振荡器是不是可以实现计数功能呢?交替的输出0和1,哈哈,感叹造物的神奇吧!
下面我们再来看一些神奇的电路,当初的先驱们是怎么想到这些复杂而精致的设计
闭上上方的电路,灯亮了
断开上方的电路,灯依然在亮
闭合下方电路,灯灭了
断开下方的电路,灯依然不亮
电路的奇特之处在于:同样是在开关都断开的状态下,灯泡有时候亮,有时候不亮,当开关都断开时,电路有两个稳定状态,这类电路叫做“ 触发器”。(英国物理学家1918在工作中发现的)
触发器电路可以保持信息,确切的说,可以“记忆”某些信息,他可以“记忆”那个开关先闭合。触发器是一个大家族,大家要是有兴趣可以去看相关资料。请记住一点!触发器是用来“记忆”信息的,我再给出两类常用的触发器
这个叫做“D型触发器”,具体实现如上图,我们的表示一直都停留在很“底层”,一直都很关注实现的细节,随着细节实现越来越多,我们需要上升到高一层的层次,更加关注功能的实现,而不是陷于细节实现的泥潭!(想一想,为什么说,计算机具有与生俱来的层次结构)
数据端简写为D,时钟端简写为Clk,功能表如下:
脑袋里想象下,触发器是一个很听话的孩子,当clk端通电时,相当于告诉孩子,“孩子啊,你要记住我传给的信息”,clk断电时,孩子在自由自在的玩耍,完全不接受任何传过来的指令,很形象,不是吗?
在D型触发器的基础上实现了更复杂的功能,“ 边缘触发的D型触发器”
“抽象”图
again,抽象的思想,使我们脱离的细节实现(上图),更加关注功能
向上的箭头,表示电信号从0到1变化的那一瞬间有效,再次在脑袋里想象下,触发器是一个很听话的孩子,当clk从0->1变化时,相当于告诉孩子,“孩子啊,赶紧接住我给你的球,球在这里指信息”,其他状态下,孩子在自由自在的玩耍,完全不接受任何传过来的指令。
有人问,说了这么多,到底想干什么?好的,告诉你,用这些可以实现一个计数器,记得小孩子学数数吗?我们要做的的就是要用机器来从0开始数数,真的吗?恩,离这一步已经很近了,不信看下边
简单的,把振荡器和触发器相连
电平信号的变化
稍微扩展一下,实现更复杂的功能,应该能看明白吧
电平信号的变化(标上0和1)
嗨嗨,清醒下,我们得到了什么?把上图顺时针旋转90度,你发现了吗
这不就是在计数吗?用二进制的方式计数!
把8个触发器连接在一起,然后放入一个盒子里,构成了一个8位计数器,能从0数数到2^8-1,(0-255),这个计数器称为“8位行波计数器”
现在,我们已经懂得如何继电器来做加法、减法、计数了,这一件很有成就感的事儿,使用的技术也是100多年前就存在的技术。
第三节 存储器
我想用继电器打造一个存储量为64K x 8的存储阵列,我能实现吗?这会儿可是在二十世纪初!如果我穿越回那个年代,一定会再次为我的“发明”申请专利,如果真是这样,那计算机的发展史上会留下我的名字(呵呵,意淫一下),下面就看看我是如何实现我的“发明”吧
上节,我已经提到,触发器可以“记忆”1位的信息
就是上图这个样子,我们把它抽象成:
我们把上图称作“1位锁存器”,想一想,两个输入线和一个输出线都是什么意思,我上节已经解释过,来、来、来,想一想那个淘气的小朋友。
有了“1”,那么距离“100000”还会远吗?无非就是如何组织n个“1”,“抽象”的量级提升的过程
这是8位锁存器
简写成这种形式
再来看两个神奇的发明,或许你也会为发明者神奇的构思所折服
我想制作出这么一个元器件,他要实现这些功能。想想一下,某一天,你成了一个名人,每天前来拜访的人络绎不绝,今天呢,来了八个人,但是你时间有限,只能见一个人,那就让5号来吧(把拜访者编号,0-7),5号拜访者带来了自己的礼物(0或者1的信息)。看图,左边的三根线表示拜访者的地址(当然是二进制编码),000,001,010,011,100,101,110,111,5号就是101,这时候呢,我只需要把S0和S2通电,那么5号拜访者就进来了,献上自己的礼物(1位的信息)。
怎么实现这个功能呢?有兴趣的自己去研究下面实现,请记住,我们现在讨论的内容抽象的层次已经不是最最底层的实现了,而是更加关注于逻辑器件实现的功能
这叫“8-1选择器”
反过来,我有一封信需要送出去,这封信的内容是0或者1,现在我也有8个快递小哥可以选择,编号分别是000,001,010,011,100,101,110,111,我让谁去给我送信呢?那就还是5号吧,于是我把地址分别设置为101,5号小哥就去给我送信了,给出具体实现,有兴趣的自己去看吧
这个电路名儿叫做“3-8译码器”
有了8-1选择器和3-8译码器,就可以制作出一个8位存储器了
again,把复杂的电路实现,抽象成简单的符号表示
读/写存储器,通常叫做随机访问存储器或者叫RAM,RAM可存储8个单独的1位数据
如何得到16 X 1的RAM呢?相信大家都能想到,用2个 8 X 1的RAM,我仿佛回到了《计算机组成》的课堂,让我再来做一次作业吧
简写如下:
这种方式或许正确,但是使用了三根地址线,两根数据线,能不能使用4根地址线1根数据线呢?
加一个2-1选择器不就行了吗?(设计一个2-1选择器,这会儿应该不算什么难事儿)
再次用符号简写:
回到我们的出发点,怎么得到64K X 8的存储阵列呢?
无非就是努力提高8位锁存器的集成程度嘛,我可以想象,读者看到这里,脑子里全是密密麻麻的的连线,或许你还一时想象不到连线的方式,但是看到这里,64K X 8的存储阵列一定能用某种方式实现,对吧?虽然没有实现其电路图,但我也可以说,我理解了存储器工作原理,(你懂了吗?)。
1024 X 8RAM的符号表示,2的16次方,即64K,地址线有16根,数据线有8根
为了申请我的专利,我需要做出一个机器的外部壳子,和第一节中的“计算器”一样,把这个机器的壳子把我所有实现的过程封装起来,形成一个“黑盒”,只保留几个外部的接口(也就是那几根数据线,一定要记得他们的功能),我要做成的外部盒子是这个样子
上一排的对应16根数据线,下一排有8根数据线,这个不用解释,相信把上文看完的都能明白什么意思,takeover这个按钮表示是否使得当前控制面板处于“激活状态”,也就是说,这个开关的作用是确定由控制面板还是又外部所连接的其他电路(从来没说过,没有连接外部其他电路,或者想象下,我这个机器壳子外面有一排的针孔,外部电路可以接进去,想想电脑机箱后边的针孔,就是这个意思,Soga)来控制。如果有其他电路相连。这时候takeover为 0(图示状态),此时存储器由其他电路接管,控制面板上的其他开关不起作用,当takeover为1 时,控制面板将重新获得对存储器的控制能力。
最后还是给出电路实现
想一下,机器壳子后面的针孔连那里,控制面板的开关又连接哪里?
简化的图示,是不是又用到“抽象”的思想呢?
一个辛辛苦苦装满65,536字节(8位为一个字节,字节编码请去参考ASCII编码)珍贵数据的64K X 8的RAM阵列,如果断电,会发生什么事情?首先电磁铁会因为失去电流失去磁性,随着“梆”的一声,金属片讲弹回原位,RAM中的所有数据将如风中残烛一般消失在黑暗之中,所以,RAM也成为“易失性”存储器。
那我一手打造的64K X 8的存储阵列,需要多少继电器呢?答案是是500W左右,是不是惊讶到恐怖呢?谁会没事儿造出这么个恐怖的怪兽?(100年后的今天,用二极管,三极管,集成这么多元器件的芯片,连指甲盖的大小都不到,感叹人类技术的进步吧)。
我穿越回二十世纪初,再次站在专利局的门口,为我这项“伟大的发明”申请专利,瑞士专利局的爱因斯坦会因此吓尿吗?世界上最聪明的大脑,能理解“黑箱”背后发生了什么吗?
第四节 自动操作
说了这么多电子线路的知识,我相信的我的讲述方式,大家都是能看懂的,前面所写的,其实只是为大家讲述一件事儿,“把电子元器件内部实现展开”,现有的一个个电子元器件,现在就是一个个小工具(把内部实现封装起来,保留外部接口,外部接口,就是那一根根地址线,数据线,和其他开关)、原材料。那我们现在看一看现在都有那些原材料呢?
计算器:一个会算数的小朋友,每次你把要进行计算的两个数给他,拍一下小朋友的头,小朋友帮我算一下吧,他会把计算的结果给你,没有一点误差,计算速度很快,并且乐此不疲。
计数器:一个一直在数数的小朋友
存储器:辛辛苦苦装满了64K 字节的箱子
译码器:《唐伯虎点秋香》中有个代号,9527,一个数字,你说它什么意思呢?如果,我“规定”9527指的是唐伯虎,让译码器来做这件事,译码器你把9527给我带过来(地址线用2进制表示9527,9527的二进制是多少呢?),这时候译码器“很听话”的把唐伯虎叫过来。(在这里,机器“理解了”人类的语言吗?)
有了这些原材料,我们就可以着手打造一台computer了,我们的工作才刚刚开始,请读者保持耐心,我们最终要实现的是一台通用计算机,这台“先进的”机器可以使加减法的过程自动化,is that unbelievable?这台机器可以解决所有能有加、减法处理的问题,而事实上现实中的许多问题确实可以用加法与减法来解决。
让我来回顾一下自己的教育经历。从咿呀学语之后,幼儿园开始,我们就要开始一生的学习了,小学的数学课现在还叫不叫“算数”?刚开始,我们扳着自己的手指数数“1,2,3,4,5,上山打老虎…”,学会数数之后呢?老师先教我们加法与减法,那么乘法和除法呢?我依稀记得,是用加法和减法来实现的,对吗?
加法与减法,可以从底而上,构建更加复杂的算数系统,以至于,微积分也是建立的基本的算数系统之上,我还清楚的记得泰勒公式带给我的震撼,记得第一次见到牛顿迭代法时的情景。
最美的数学公式之一,不解释为什么了,参考大学微积分
假如,假如我们已经实现一台可编程的最原始的执行加减法运算的“计算机”,如何计算出e的值呢?
想明白这一切,就需要我们了解“自动操作”的过程,了解程序的本质什么?编写程序的过程就像堆多米诺骨牌,辛辛苦苦,小心翼翼堆了半天,只为了那一下推到骨牌的快感!下面这一部分内容较难,请读者一定保持耐心,我会试着按我自己的理解讲清楚,如果我有理解不对之处,欢迎大家指出来,讨论改正
新纪元-能接受“指令”的计算器
有人问我,真的可以用上述提供的那些原材料(计算器、计数器、存储器、译码器)造出一个计算机吗?就像维克多·弗兰肯斯坦组装怪物一样,当一切都已经就绪,看着我们一手打造出的庞大的怪物,小心翼翼的通上电,“醒来吧,孩子”,就像给他赋予生命一般,这些破铜烂铁奇迹般的苏醒过来,按照我给他的指令,完成我想要的工作,真的,人世间没有比这样的工作更让人神往了,你能理解《模拟游戏》中Turing对克里斯托弗的一往情深吗?至少他打动了我的心。
扯多了,我可以很明确的告诉你,只用那些原材料确实可以打造出一台计算机,并且历史上确实有人实现了!是谁?冯诺依曼?图灵?很遗憾地告诉你,no。主人公的名字,我前边已经提到了,他叫康拉德·楚泽,1935年还是一个工科学生的他,在位于柏林的家中打造出一个可编程的计算机,一共花了3000多个继电器。
接下来让我们穿越回到1935左右,让我们跟随“主人公”的思路,尝试打造出一台“计算机”。
还记得上小学时,你学完数数,学完加减法之后,大人们常常考考你的题目是什么?“你给我算一下从1一直加到100吧”,问题是,我能用机器代替我来算数吗?哦哦,简单,我的原材料里不是有“加法器”了吗?,稍作修改就行,好,看看我的设计
拿一个8位的加法器和一个8位的锁存器,按上述方式相连,每次我们可以通过加法器的开关输入我们要算的数(当然要输入的数是0-255之间,计算的结果也是0-255之间,在这里可以先计算1-10的和),我们小心翼翼的拨动开关,最后下方的一排指示灯显示计算的结果。简单吧(这个器件称作累加器)可是我一不小心输错了一个数怎么办?只有重新来算,完全再来一遍,好麻烦啊,有没有可以改进的方式呢?我突然想到,不是有存储器嘛,可不可以把我要计算的数据先存入存储器,再通过读取存储器的内容,把数据传送到加法器,执行运算,最后显示结果。
good idea!具体该怎么做呢,我给出一种实现方案
一个振荡器(想想duang,duang,duang的电铃),16位计数器(我们的存储器容量不是64K X 8么,需要16根地址线),一个64K X 8的RAM(RAM连接控制面板,控制面板可以输入数据,还记得控制面板的takeover按钮是做什么用的么?),一个8位加法器和一个8位锁存器。
让我们闭上眼睛,来想一想,这是怎么工作的。首先,请清零开关,然后闭合控制面板上的takeover按钮,这时候控制面板接管了存储器,如果要算的有100个数,我们一次调整存储器的地址线和数据线,把数据存入0000h-0063h的地址空间(这一部分你明白了吗,该怎么操作控制面板呢?上述地址空间用16进制表示)。数据输入完了,我们断开控制按钮(takeover键),这时候控制面板失去对存储器的控制,断开清零开关,这时候,计数器开始工作,0000h,电信号传入存储器的地址线,存储器呢,是一个忠实的仓库保管员,来,我看看你要取什么东西,他接过传来的地址,哦原来要0000h盒子内的东西啊,好,你拿走吧,(0000h“盒子”内的东西就是刚才输入的第一个数),第一个数据传入到加法器,加法器小朋友一看,好了,你和自身相加,这不还是你自己吗?他把计算结果给了锁存器,锁气器把计算的结果放入一个临时的盒子内。经过一点时间(很短)计数器变成0001h,还是和刚才一样,计数器小朋友把自己的数给存储器管理大叔,大叔根据传过来的数,把取出的数据传给加法器小朋友,加法器小朋友执行加法运算,把得到的结果给锁存器。他们是如此的兢兢业业,乐此不疲,“机械式”的完成自己的任务,没有一点儿怨言。
哎,计算的结果是什么?我怎么看到指示灯在闪烁,计算的结果哪里去了?哦哦哦,计数器小朋友实在是太敬业了,根本没有办法让他停止工作,当他数到FFFFh之后又从0000h开始数数了。
还有这样的计算也太机械了,功能也实在是太有限了,要是我想把100个数,分成50组,计算每一组的和,这又该怎么做到呢?聪明的读者你也动动脑袋想一想,怎么做到呢?
楚泽看到这里也许和咱们一样皱紧眉头,怎么做呢,怎么做呢?该怎样解决这个问题呢?这时候或许突然迸发出“革命性”的想法,把运算的结果存回到RAM阵列中不行吗?这样一来,就可以在适当的时候用RAM阵列 的控制面板来检查运算结果(按下takeover),为了实现这个目的,在控制面板上加一排显示灯。eureka!
改变之后的连线图
这里略去了一部分,包括振荡器和清零开关。这样做是很好,但是问题来了,怎样控制RAM写入信号呢(何时存入RAM,把结果存在什么位置?)
假如我有一个这样的计算任务要完成:首先对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和,图示如下
图中用一小段连续的纸条(标记上连续的格子)表示一小段存储器,格子内表示存的内容。怎样使自动加法器为我们完成这项任务呢?我们不能期待向RAM阵列中输入一组数,然后自动加法器自动完成任务,自动加法器怎样“理解”我们交给它的任务,它怎么“知道”我们要他们干什么?
为了完成这个任务,我们需要用一些数字代码来标示加法器需要完成的每一项工作:加载(Load)、相加(Add)、保存(Save)、终止(Halt)
有了上述的指令,我们就可以命令计算器来工作了(暂时不去了解如何实现),对于上述的任务,可以表示如下:
(1)把0000h地址处的内容加载到累加器
(2)把0001h地址处的内容加到累加器
(3)把0002h地址处的内容加到累加器
(4)把累加器中的内容存储到0003h地址处
(5)把0004h地址处的内容加载到累加器
(6)把0005h地址处的内容加到累加器
(7)把累加器中的内容存储到0006h地址处
(8)把0007h地址处的内容加载到累加器
(9)把0008h地址处的内容加到累加器
(10)把0009h地址处的内容加到累加器
(11)把累加器中的内容存储到000Ah地址处
(12)命令自动加法器停止工作
有了这些指令代码,那么这些指令代码存放在哪里呢?得了,不去想了,简单粗暴的解决方式就是在加一个RAM,一个RAM存放数据,另一个RAM存放数据对应位置的操作符(也就是上文指定的那些代码),再次对我们的机器进行改造,改造后的结果如下
观察要仔细啊,数据的RAM即可以通过Control Panel控制面板进行输入,也可以接受外部的数据,而存储代码RAM只能通过控制面板写入!
那么往存储代码的RAM里写入什么内容吧?机器又不认识load、store、add、halt这些单词。既然机器不认识,我就让他们认识!解决方式,就是编码,其实两位信息编码足够
操作码,代码
Load(加载),10h
Store(保存),11h
Add(加法),20h
Halt(停止),FFh
这样一来,存储代码的那个RAM里边要存的内容就一目了然了
看到这里,读者有疑问吗?还是我最早提出的那个问题,机器是如何“理解”人类的语言的,我虽然把要操作的指令用0和1进行编码,但你把编码之后的内容拿给我们一手打造的这台机器,他还是“不明白”什么意思,去进行何种操作啊!我们转来转去又转回最初的起点,你让冷冰冰的机器去“理解”人类的指令,无异于天方夜谭,机器就是机器,永远也不可能具有思维,当初,我在这里也是困扰好久,哦,原来如此!
我已经把答案告诉你了,机器就是机器,永远也不可能具有思维
我不管你有没有思维,你必须完成我给你的任务,你把上述的任务算个结果出来,这一点儿或许能办到,嘻嘻
为了体现Load和Add命令,我的机器内部又进行了部分改变,你看出差别来了吗?
其实上述有一小部分没有连线。again,闭上眼睛,跟我来想想机器执行的过程,可爱的小朋友们和敬业的大叔们又来了。计数小朋友把数据给两个RAM的仓库管理员,一个取出数据,一个取出指令。数据传给累加器和2-1选择器(这是个什么鬼)?数据到了2-1选择器小朋友的面前,发现了一道门,门上写着,“此山是我栽,此树是我开,要想从此过,留下买路财”,小朋友,让我过去吧,叔叔给你糖吃,2-1选择器小朋友说,“我只有一条路,你们两个人,我让谁通过呢?”(图中,2-1选择器接收了两组数据),就在这时候,2-1选择器小朋友,收到了一条指令,这条指令来自哪里呢?哦哦,刚才管代码的RAM大叔,取出指令(10h或者,11h或者20h或者FFh),他把指令交给“指令解析器”(图中没有画)指令解析器负责把信送给2-1选择器、RAM、计数器的指令接收端(也就是2-1选择器的S,RAM的W等,在这里称为控制信号,控制信号决定机器中某些部件是否工作或者决定某些期间如何工作。例如,如果代码RAM阵列输出是load指令,2-1选择器S端收到0,如果代码RAM阵列输出是Add,2-1选择器S端收到1,操作码是指令Store时,数据RAM阵列的W收到1。实现“指令解析器”很困难吗?想一想第二节中是如何送信的,3-8译码器,译码器实现只是一种方式,当然也可以用逻辑门来实现、你明白了吗?),2-1选择器小朋友收到了0,也就是要执行Load操作,8位锁存器把临时信息保存起来。然后计数器小朋友又开始数到了0001h,这些勤劳的小朋友和勤劳的大叔又继续工作了…
用这种方式,我终于实现了我的想法,这真是一件值得高兴的事儿,我要好好休息下,等等,休息之前,顺便扩展一下我们的机器,让它也能运算减法。好简单,增加一条指令不就行了?Subtract(减)
相应的,机器内部实现再改造下,增加一个取反器
布置一道作业题,取反器的那根控制信号线接在哪里?
数据“流水”
我们从继电器打造出门电路,进而实现加法器,计数器,存储器,都是为了向我们的那个终极目标一步步前进。这就像点亮科技树的过程,一步步提高,直到实现我们的终极目标–一台可编程的通用计算机,那现在来看看,我们的科技树点亮到哪一步了,现在我们亲手打造的“能读懂人类指令的计算器”,离我们的目标还有多远?
来看看我们这台机器能不能完成我们想要完成的任务。假设现在要把56h和2A相加,然后再从中减去38h,结果是多少呢?不是有指令了吗?来,设置指令,让机器去完成
由于指令和数据是分开存储的,我们分别通过控制面板在RAM中输入数据,启动机器,机器就“神奇”的计算出结果,可以用个控制面板来查看计算的结果。
如果我的计算任务扩大一些,算一算1W个数的和吧?啊?10000个数,这时候我可以想象,站在台机器前面的“主人公”满脸苦逼的表情,我们小心翼翼的输入这指令,Load …,Add …,Add …,Add …,……Store …。然后我们再输入数据,这真是个体力活儿啊!当我们终于把这一切都完成之后,启动机器,Come on,baby!计算吧
让我们再次闭上眼睛,想象机器工作的情形,计数器多么像一颗跳动的“心脏”,过一段时间发出一次“心跳”,存储器收到心跳的脉冲,从此中取出数据,数据被传送到累加器“加工厂”等待处理,要通过一道道的“门”(2-1选择器),最后会传到存储器。每每想到这里,我不禁想起在欢乐谷水上漂流的过程,穿过一道道门,经过一间间屋子,每经过一道关卡,都可能被水淋到(数据被加工),最后转了一圈回到起点,机器内部执行的过程,就是数据坐在船上“流水”的过程,不是吗?
让我们来看看机器算出来的结果,这可真是一个激动的时刻,辛辛苦苦拨了半天开关,现在要见证奇迹了。“咦”?怎么结果不对,这数值也太小了!
哦,原来如此,我的累加器只能算8位的数据,让我去安静的哭一会儿去。
你可能想到,把两个8位的加法器连在一起构成一个16位的设备,这是一种解决方案,但是,还有代价更小的解决办法。
比如要计算76ABh+232Ch,最终结果是99D7h
我们可以把高低位分开来算
低位加法
高位加法
最后把计算的结果写回存储器
D7h被写入地址0002h处,99h被写入地址0005h处
这是很理想的状况,因为,在上述的例子中把高低位分开计算,低位计算恰巧不存在进位的情况。如果要把76ABh和236Ch这两个16位的数相加该怎么做?ABh+6Ch=117h;1h+76h+23h=9Ah。计算的结果为9A17h,怎么解决这个问题呢?可能有读者已经想到了,加一个进位锁存器(存储进位)不就行了?那我再问一句,“那我们的指令码是不是需要扩展一下呢?怎么使得译码器来触发读取进位的信号呢?”读到这里,读者也应该和我一样,我们现在不关心具体实现细节,一定会有某种逻辑门的组合来实现,对吧?下边我给出扩展的指令码(也叫作操作码)
上述指令中,增加了一个“进位加”(Add with Carry)和“借位减”(Subtract with Borrow)有了他们,就可以极大的扩展加法器的功能,而不仅仅局限于8位数据的运算了,可以对16位,24位,32位,40位数进行加、减法操作了!比如对两个32位数7A892BCDh和65A872FFh进行加法运算。仅仅需要1条Add指令和3条Add with Carry指令
我们通过增加操作码指令扩展的我们的“计算器”,在通往终极目标的路上又迈出了坚实的一步,“数据流水”的方式也确实也可按照我们的意愿实现一些计算任务,但是,对于计算1W个数相加之类的任务,总不能期待一条条的输入指令吧?
让我们看看问题出在哪里。第一,对于上图来说,保存计算结果的存储单元地址不连续。第二。当前设计的自动加法器不允许在随后的计算中重复使用的前面的中间结果,一旦我们把计算的结果写回存储器,我们就无法再次读取它的值了。
产生上述情况的原因就在于,我们构造的自动加法器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址,直至停机。
要解决这个问题,需要对我们设计的加法器做一个根本性且程度极大的改变。我想几十年前第一代的计算机的设计者康拉德·楚泽,Turing等人一定会为这个问题寝食难安,因为解决了这个问题,才可以实现真正意义上的“自动操作”,这个问题也是计算器与计算机最根本的区别。
没想到会有这么多人点赞,谢谢你们的鼓励,我们的万里长征已经看到胜利的曙光了,马上就要迎来激动人心的时刻了,请保持最后的耐心。
数据“转圈圈”
再次看一下我们设计的机器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址(计数器小朋友在一次计数,告诉存储器管理员大叔从哪个抽屉里取数据),直至停机。但是,如果我的数据是连续存储的,并且在任意地址保存数据(也就是说,存储器存放数据的抽屉式随意的,我们只知道抽屉的编号),该怎样去取数据进行计算,并且存储计算结果啊?这时候我突然听到一声,“你傻啊,你把要取数和存数的抽屉编号告诉我不就行了?”,管理员大叔一语惊醒梦中人,是啊,有了存储器的地址不就行了?可以把数据的地址与数据的内容分开存!这可真是石破天惊
那就再次改变我们的设计吧,
这次,我们把指令(代码和数据的地址称为一条指令,先得到数据的地址,在根据地址取数据)放在一个RAM中,把数据存在另一个RAM中,并加了3个8位锁存器(临时存放8位数据),示意图只画出了改变的部分,其余部分与原来保持一致(累加器和代码解析器还有相应的控制信号)。指令占1个字节,16位的数据地址占2个字节,一条指令共占用3个字节,每次从RAM中取出1个字节,所以每次取出一条完整指令需要3次计数,数据地址再次传给存储器(这里多加了一个RAM),RAM取出数据传给加法器,而代码的解析与数据传输到加法器进行计算操作也需要1次计数,这必然需要更加复杂的控制信号。
从存储器中取出一条完整指令的过程叫做取指令,机器响应指令码的一系列操作的过程叫做执行指令,虽然机器可以自动取出指令,并执行指令,你能说它是一种“有生命”的东西吗?
看到这里有人可能要问,我们现在不是假设在1935左右吗?RAM是很奢侈的(500W个继电器),能不能想法舍弃掉一个RAM?把指令(代码和数据地址)与数据存在一起就可以了,这简单,还记得2-1选择器小朋友吗?(存储器部分提到了)
很简单,得到数据地址之后,把地址回传给存储器(此时计数器小朋友的计数无效),再次根据地址取出数据。
来看一个小例子吧,计算45h+A9h-8Eh=?,假设45h,A9h,8Eh分别存在地址0010h,0011h,0012h处,计算的结果存于0013h处。我们应该给机器这样的指令:
把0010h地址处的字节装入累加器,
把0011h地址处的字节装入累加器,
从累加器中减去0012h地址处的地址,
把累加器中的内容保存到0013h地址处,
停机,
数据的存储可以是任意的,我们只需要知道其相应的地址,那么指令呢?指令还是机械的顺序的往下执行,会不会出现这种情况,顺序执行指令,可是数据和指令地址冲突(要存指令的地址处已经有了重要的数据,需要跳过),指令能否跳过某一段区域,继续执行呢?
这涉及到指令寻址方式的改变(耐心听下去,我们万里长征,最终的一步来了,跨过他,前方就是一马平川),怎样跳过某一段儿区域,继续执行指令呢?那就jump啊,对,扩充一条跳转指令(Jump)
相应的机器内部实现也要改变
在上一步基础之上,增加了一条到计数器的数据通路,相当于告诉计数器小朋友,“小朋友,你下次从我告诉你的那个数开始计数,叔叔给你糖吃,乖~”
让我们回到电子线路中,计数器的实现,振荡器和D触发器串联方式(16个D触发器),我们稍作修改一下边缘型触发的D型触发器
可以不用了解上图的实现,请注意我们现在重点不在于具体实现,而在于实现某一功能,我们需要为16位计数器的每一位都设置一个这样的触发器。一旦加载了某个特定的值,计数器就开始从该值开始计数(是不是用糖果把计数器小朋友收买了,呵呵)
Jump(跳转)指令确实很有用,但是一个有条件的跳转更有用(“我是个有原则的人,除非满足我的条件才jump”),比如要计算A7h与1Ch(十进制的28)相乘的结果,和28个A7h相加的结果相同,计算过程涉及到大量的重复操作
假设乘数和被乘数以及计算结果保存在一下地址:
1000h:00h,A7h,(16位乘数保存在此处)
1002h:00h,1Ch,(16位被乘数保存在此处)
1004h:00h,00h,(16位乘积保存在这两个连续的地址空间)
当这六条指令执行完毕之后,存储器1004h和1005h地址保存的16位数与A7h乘以1的结果相同。还要把这6条指令反复执行27次才能达到乘法的目的,如果在地址0012h处置放一条Jump指令会怎样?
这个过程不会停止下来,它会一直反复执行下去!
我们需要这样一种Jump指令,它只让这个过程重复执行所需要的的次数,这种指令就是条件跳转指令,怎么实现它呢?我给出一种实现方式,简单看看就好
这种锁存器叫零锁存器,当8位加法器输出为零时他锁存的值才是1。有了进位锁存器和零锁存器以后,可以为指令表新增4条指令
非零跳转指令只有在零锁存器输出为0时才会跳转到指定的地址,如果上一步的加法、减法、进位加法或者借位减法运算结果为0时,将不会发生跳转。只需要在常规的跳转命令的控制信号之上再加一个控制信号
那么继续刚才提出的问题,0012h地址之后的的指令为
Store指令不会影响零标志位的值,只有Add、Subtract、Add with Carry、Subtract with borrow这些指令才能影响零标志位的值,当执行到地28次循环时,1004h和1005h地址保存的16位数等于A7和1Ch的乘积。1003h地址保存的值为1,他和FFh相加的结果为0.零标志位被置位!Jump If Not Zero指令不会再跳转回到0000h地址处,程序执行完成。
现在可以说,我们这台不断完善的机器真的可以称得上是一台真正意义上的computer了!条件跳转指令将计算器和计算机真正区分开来。
那么,你现在明白了吗,为什么计算机能读懂0和1?计算机和程序到底是什么?
数据被附在电流上不断地转圈圈(循环的过程),当满足某一条件之后,得到最终结果。
汇编语言
把上述机器码表示成助记符的形式
那么这个乘法的程序可以写成这种形式
编码时最好不使用实际地址,用label来指代存储器中的地址空间,所以上述程序可以改写为
终于在春节到来之前写完了,算是圆了自己的一份小小的心愿。
写的不好,欢迎大家批评改正。
承蒙大家抬爱,这篇一年多前的回答上日报了,为了避免误导还是注明一下,文章的目的是尽可能以最简单的语言让非微电子专业的读者能对芯片的工作原理有感性的认识,有高中物理和化学知识就能顺利读完,因此许多过程描述进行了简化、并不专业,也没有采用太多术语以避免诘屈聱牙之嫌,希望是如果能有一点科普作用那就极好了。
原文:
关于计算机为什么能读懂0和1,
同学的答案中已经回答地相当仔细了,相信有钻研精神的朋友读完他的答案,就能在布尔代数原理和基本电路原理上对计算机的0和1有一个感性的认识。唯一有点美中不足的是他没有在物理层面上解释电路器件的运作方式,那么答主就来解释一下计算机的硬件核心:IC电路在物理层面是如何工作以及是如何制备出来的。
首先还是通过两个不同层面的基本介绍来总结一下
同学的答案。
一、逻辑实现
IC数字电路中,用高电压(比如3.3V)代表1,低电压(比如0V)代表0。利用布尔代数的与、或、非基本逻辑,就可以构造出不同的电路,实现复杂的运算。
与逻辑:1与0=0、1与1=1、0与0=0
或逻辑:1或0=1、1或1=1、0或0=0
非逻辑:非1=0、非0=1
比如要实现一个1位的加法器(C=A+B):
1+0=1
1+1=0
0+0=0
因为是1位加法器,我们就不考虑进位了。那么逻辑的实现就是:
C=(A 与 非B)或(非A 与 B)
这样在逻辑上一个简单的加法器就实现了。复杂的IC数字计算电路,就是由几亿个这样的简单逻辑构成的。
在这一个层面的总结中,我们了解到,IC芯片的数学原理是布尔代数,这是芯片工作的逻辑基础。
二、电路实现
以上介绍的只是纯逻辑的实现,那么怎么在电路上把它实现出来呢?举个最简单的例子,非逻辑,我们用一个称为非门的电路来实现。
以上是一个非门的电路表示。如果Input为高电压(代表1),Output就是低电压(代表0),反之亦然。图中,Vdd表示高电压,Vss表示低电压(接地,即为0)。
PMOS可以看做一个用G端电压控制的开关器件:如果加在G端是高电压,那么PMOS可以看做是断线,如果加在G端的是低电压,那么PMOS可以看做是一根导线。NMOS正好相反,如果G端是低电压,则是断线,如果G端是高电压,则是导线。
那么看这个非门的电路,当Input为高电压时,PMOS断线,NMOS导通,Output相当于接地(Vss),那么Output就是低电压了;当Input为低电压时,PMOS导通,NMOS断线,Output相当于接Vdd,那么就是高电压。
这样我们就在电路层面实现了最基本的门逻辑-非门。与逻辑和或逻辑可以使用相似但稍复杂的电路来实现。IC数字电路归根结底都是靠这三种电路来实现的。
在这一个层面的总结中,我们了解到,其实计算机的工作原理并没有想象中那么“智能”,其实跟用水闸开关控制水流的冲力去推动风车转动的基本思想是一致的。计算机并不“懂得”0和1,它只是靠我们精妙的组织具有特定特性的物理器件,让器件发挥自身的物理性质,从而能在电压上反应出一个计算电路的输入和输出。
有了以上总结,我们就可以研究现代IC芯片的基本器件单元:MOS管了。
三、MOS管
从以上介绍中可以看出,数字电路中最重要的器件就是MOS管了,分为PMOS和NMOS。不同于电阻、电感、电容等基础电子器件,MOS管的导通与否是通过G端的电压来控制的,那么就不能使用最基本的电阻器等原件来实现了,需要重新设计一种器件。
以NMOS为例:
以上是一个NMOS的剖面图。黄色区域为掺杂了正离子的硅,绿色区域为掺杂了负离子的硅。上面的三块灰色区域为源(Source)、栅(Gate)、漏(Drain)的电极,分别对应了非门电路中NMOS连接Vss、Input(G)、Output的三个电极。从以上非门的介绍中可以了解到,我们使用NMOS,是希望通过控制Gate的电压,来控制从Source到Drain能否导通。
如图所示,现在红色虚线勾勒出的区域,从左到右形成了一个N-P-N的结构,表示掺杂了负离子的硅-掺杂了正离子的硅-掺杂了负离子的硅。因为正负离子的同性相斥、异性相吸的特征,在P、N的交界处,会形成一段“耗尽层”,其中是没有电子的(都被同性相斥、异性相吸到其他区域去了),那么如果Gate上不加电压的话(电压为0),从Source是Drain是不能导通的,对应了以上电路分析时的断线情况。如果Gate上加上合适的电压,那么情况就不一样了,因为电压为正,那么会吸引下方红色虚线勾勒区域内的负离子到Gate的下方来(电容器原理),从而在Gate下方形成了一段有负离子(N-type)的区域,也就是说原来的掺杂了正离子的硅在Gate下方的一小段区域发生了翻转变成了掺杂了负离子的硅,这样就将Source和Drain连接了起来。因为Source和Drain本身也是连接着负离子区域,这段区域就相当于一条导线,那么从Source到Drain就导通了。这就是NMOS能通过Gate控制导通能力的原理。PMOS原理类似,只不过掺杂的离子极性和NMOS刚好是相反的。
由以上介绍我们知道,控制芯片电路中的“水闸”其实是一个运用电子的基本物理特性工作的人造器件。在现代电路中,这样的器件尺寸是非常小的,基本在100nm级别(也就是说人的头发丝的截面可以放得下几百个这样的MOS器件)。那么这么小的器件,人类是怎么制造出来的呢?
四、物理实现
了解了MOS管的功能和它的结构后,就可以继续了解CMOS工艺了。CMOS工艺的目的就是在硅晶圆上通过多道工序,建造Source、Gate、Drain结构,实现NMOS和PMOS管,从而构造出与或非门,构建出更复杂的逻辑。硅晶圆其实就是从沙子中提取出来的硅单质,我们把它制作成薄片,在表面同时制备成千上万个MOS器件,形成IC芯片。
首先介绍一下一些基本工艺的目的和原理:
1、 生长SiO2:将硅晶圆放入通了氧气的烘烤炉中,使Si氧化,在表面生成一层SiO2。一般是为了绝缘。
2、 光刻(湿法):因为半导体器件的尺寸非常小,不可能通过机械手段加工,所以只能通过刻蚀的方法。原理是先在要刻蚀的表面均匀涂抹一层光刻胶并烘干,然后通过掩膜板(上面绘制了需要刻蚀出的图像,需要刻蚀的部分为透明的,不需要刻蚀的部分用黑色阻挡),将紫外线照射到光刻胶上。光刻胶分为正胶和反胶,如果是正胶的话,照射到紫外线的部分就溶解掉了。这样,需要刻蚀的部分上覆盖的光刻胶就被紫外线透过掩膜照射溶解了,而不需要刻蚀的部分因为紫外线不能透过掩膜的黑色部分,所以仍在器件表面。这时将器件放到能溶解其表面物质的溶液中,被光刻胶覆盖的部分因为接触不到溶液,所以不会被去除,而没有光刻胶的部分就溶解掉了,于是就在器件表面形成了需要刻蚀出的图形。
3、 离子刻蚀:前序步骤和湿法光刻是一样的,都是用光刻胶形成图形。但是不同于用溶液溶解,离子刻蚀是使用高能离子打向器件表面,没有被光刻胶保护的部分就被打掉了,被光刻胶保护的部分留了下来。
然后我们就可以了解一下MOS的具体制备流程了(以下图片来自FSI)。
1、 STI浅沟槽隔离:STI的目的是为了在IC电路中,将各器件隔离开来,否则会有漏电等情况发生。STI使用SiO2作为隔离介质,因为SiO2有良好的绝缘性。
首先将切下来的硅晶圆做清洁。
在Si表面生长一层很薄的SiO2,然后在上面覆盖一层Si3N4。这里Si3N4起到一个占位的作用。
涂抹光刻胶并烘烤,用紫外线透过掩膜进行光刻。
没有被掩膜黑色区域保护的光刻胶部分就被去掉了,留下了被保护的部分。
干法刻蚀,就是离子刻蚀,没有光刻胶保护的部分被高能离子打掉了,从而形成了凹槽。
去除残留的光刻胶并清洁硅晶圆。
在晶圆上沉积一层较厚的SiO2,因为是沉积得到的,表面很不光滑。
通过CMP(化学机械研磨),将不光滑的表面磨平。
这时用能溶解Si3N4的溶液将Si3N4去除。之前提到,Si3N4是占位的作用,它去除后,SiO2的高度就略高于晶圆表面了,这也是为了起到更好的保护隔离作用。
2、 生长阱。阱就是之前介绍MOS管时的黄色区域,作用之前也提到过了,是为了形成N-P(阱)-N或者P-N(阱)-P这样的结构。
首先还是光刻,用掩膜留下跟需要刻蚀图形相同的部分光刻胶。
进行离子注入。假设我们是要制作NMOS,那么就注入正离子(形成P阱)。注意没有被光刻胶保护的部分会注入,而被光刻胶保护的部分就不会注入到了。
去除光刻胶并清洁表面。
退火,主要目的是为了让离子在硅晶圆中更好地扩散,形成合适尺寸的阱。
3、 制作栅(Gate)。Gate就是控制Source和Drain是否导通的部分,一般材质是多晶硅,现在有时也用其他材质了。
先对晶圆做一下清洁。
在晶圆上覆盖一层多晶硅。注意,要覆盖只能是晶圆表面全部覆盖,因为尺寸太小在这一步不能可能控制它的覆盖部分,只能在后续工艺中用光刻去除不需要覆盖的部分。
还是涂抹光刻胶,用紫外线透过掩膜照射,留下一部分。
湿法刻蚀,把没有被光刻胶保护的多晶硅去除。
去除光刻胶并清洁。这样就留下了我们需要的多晶硅部分了。不过这一部分形成的多晶硅层还不是Gate用的多晶硅,这个叫做牺牲层,主要是为了形成真正的Gate垫背用的。原因是由于Gate的尺寸很小,目前刻蚀工艺无法形成特别精确的矩形图形,所以使用了两步工序,这一步形成的多晶硅还会在以后被刻蚀掉,具体原理不再赘述。
再次覆盖一层多晶硅。
覆盖一层电极物质,一般是金属(比如Al)。
涂抹光刻胶并刻蚀光刻胶。
栅离子注入。没有被光刻胶保护的多晶硅部分就被注入了离子了,这是为了增强Gate的导电性。
去除光刻胶并清洁。
继续涂抹光刻胶并刻蚀光刻胶。注意这一步形成的图形就是栅真正的结构了。
干法刻蚀。没有被光刻胶保护的金属(黄色部分)和多晶硅(表面红色部分)就被高能离子轰击掉了,留下了我们需要的栅结构。
去除光刻胶并清洁。
在栅上覆盖一层氧化层(紫色部分),这是为了在下一步离子注入时保护栅。到这一步,栅(Gate)就制作完成了。
4、 在阱上制作Source和Drain的低掺杂部分。由MOS结构图可知,Source和Drain之间有一个N-P-N(或P-N-P结构)。之前在制作阱的时候,我们把中间的这个部分(也就是阱)制作完成了,现在就是制作两边的部分。
首先还是光刻,留下部分光刻胶。
离子注入,被光刻胶和栅保护的部分是注入不到离子的,而中间两块区域就被注入了和阱的极性相反的离子了,于是就形成了N-P-N或P-N-P的结构。
去除光刻胶和保护层并清洁。
5、 形成栅两旁的保护层。这是为了防止栅和源、漏之间由于量子隧穿效应形成漏电流。用SiO2保护就可以了。
沉积一层SiO2和Si3N4。
直接用高能离子轰击表面,控制轰击的时间,从而就把大部分SiO2保护层去掉了,留下了栅两边的比较厚的部分。
清洁表面。从以上步骤我们也可以看出,之所以MOS工艺中要用一步步复杂的光刻、刻蚀、沉积,主要原因就是因为器件太小了,没办法直接进行机械加工操作,只能通过化学或离子轰击的方法来制作,但是这些方法又只能针对一个表面,所以需要用光刻胶和掩膜板来一次次地制作保护区域,形成我们要制备的图形。
6、制作Source和Drain的高掺杂部分。之所以在制作Source和Drain时要分为高掺杂和低掺杂两块区域,是为了使用所谓LDD(轻掺杂漏极)技术,来抑制短沟道效应带来的Source和Drain之间的漏电流,并且提高MOS器件的横向耐压。
首先还是上光刻胶并刻蚀出图像。
低掺杂的离子注入,形成了两边的亮蓝色区域。
去除光刻胶并清除。
退火,使掺杂离子稍扩散。这样高掺杂和低掺杂区域共同构成了源和漏。
7、 金属硅化物的制备。主要是用来连接Gate和电极的,导电性介于金属和多晶硅之间。
首先是清洁表面。
在表面覆盖一层金属硅化物。
退火。
通过刻蚀等方法将不需要的金属硅化物部分去除,留下连接栅的那部分。
再次退火。到这一步金属硅化物(栅到电极的连接部分)就制作完成了。栅的形状是L形,之后会在L的尾部连接金属电极。
8、制作接触电极。栅、源、漏的硅部分已经制作完成了,现在要把它们用金属导线引出来,这样才能连接到电路中去。
首先覆盖一层SiO2和Si3N4。这是MOS管和上层导线的隔离层。
涂抹光刻胶,在光刻胶上形成几个穿孔。前面两个是用来连接源和漏的,后面那个是用来连接栅的。
干法刻蚀。用高能离子轰击晶圆表面,上一步形成的3个穿孔下方由于没有保护,SiO2隔离层就被击穿了,栅、源、漏就被暴露了出来。
去除光刻胶并清除表面。
在表面沉积一层金属,这样金属就填充了穿孔,从而连接了栅、源、漏,将它们引了出来。
CMP工艺,打磨掉表面多余的金属。
清洁表面。
9、制作金属层。这一层就完全根据电路设计中的引线来制作了,使用的金属材质和图形都是因设计而异的。
首先沉积一层介电层(就是绝缘层,用来隔离)。
光刻出跟需要制备的金属层图形相同的光刻胶层。
干法刻蚀,用高能离子轰击,刻蚀掉不需要的介电层。
去除光刻胶并清洁。
覆盖一层金属,这层金属填充到了介电层被刻蚀出的凹槽中,连接到了下方的金属电极。
CMP工序,去除掉表面多余的金属。
清洁表面。
然后就是根据电路结构继续制作金属互联层,一层层地连接到外部电路中去。一般一个简单的芯片需要10-20层互联结构。最后就是将芯片打上与外部电路连接的电极,一块完整制作好的晶圆就产生了。一般一块晶圆上会有几十块芯片,把芯片切下来就可以测试、封装、使用了。
如此,一块芯片就制作完成了。计算机通过以高低电压形式表示的1、0状态作为输入,在芯片上的千千万万个MOS管的作用下,得到同样是以电压形式表示的输出,然后通过以电压驱动的输出设备(比如显示器)显示给用户。整个过程其实是利用了电子的物理特性和极其精妙的器件组合,获得了一个“自动化”的处理方式。
http://cocode.cc
玉来了
既然是问最最原始的那个工作原理。。。
从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯…我想问的就是,最最基本原始的那个工作原理
+++理论的分割线+++
最最基本原始的那个工作原理甚至都和电无关,是数学原理,布尔代数(搜索),任何可以改变状态传递信息的技术都可以拿来实现布尔逻辑,而实现了布尔逻辑,就离计算机不远了。
像是三体里面的人列计算机,就是用三体人实现计算机,这一段我直接跳了,没什么可看的,因为我懂嘛。。。
我还设想过水流+开关实现逻辑门,是可行的。
「现在可以公开的情报」
- 计算机的理论基础是布尔代数
- 计算机的实现基础可以是任何拥有『改变状态』和『传递信息』的技术
+++基础实现的分割线+++
继续正题。。。
起初, 科学家 创造计算机, 科学家 说,要先有逻辑门,然后就用真空二极管实现了逻辑门
真空管的原理去搜吧
电子计算机的原理就是利用通电、断电(或曰高电平低电平)这两个状态来表示布尔代数中的逻辑真和逻辑假从而实现布尔运算,由于这个原因,设逻辑真为1和逻辑假为0,这样就可以用计算机表示二进制的数字了。
现在的计算机用的是晶体二极管,虽然底层原理不同,但是性质是一样的,这就是编程中常说的封装和抽象的好处,你不需要关心它的原理,用它实现你的功能就行了。
所以说起来,现代电子计算机的实现,是物理原理,计算理论,是数学原理。
二极管的性质是这样的,只有一个方向可以通电,反向不通电
『想知道具体原理的可以搜索PN结』
还有三极管(还有一种性质相似的场效应管FET),性质是这样的,b通电ec通,b断电ec断
『具体原理搜索NPN结』
【【【【配图】】】】
二极管和三极管
然后可以组成逻辑电路,下面分别是与或非(AND、OR、NOT)三种逻辑门的电路实现
【【【【配图】】】】
从左到右分别是与或非三种门,x j表示输入,m表示输出
有了这三种逻辑门电路,你就可以实现任意逻辑门了,比如与非门、或非门、异或门、同或门(异或非门)。(搜索逻辑门)
(实际应用中,是以与非门(NAND(Not AND) gate)为基础原件来构建电路,因为其他所有门电路都可以用与非门构建,关于这一点,你可以思考一下)
「现在可以公开的情报」
- 地球当代的计算机的实现基础是电子技术
- 二极管和FET的技术原理是PN结和NPN结,是原子、电子层面的原理(很底层吧。。。)
- 用二极管和FET可以实现布尔代数中的逻辑操作,称为『逻辑门』
+++逻辑的分割线+++
二进制数字的加法如下:
1+1=10
1+0=1
0+0=0
0+1=1
用上文中的逻辑门就可以实现这个加法。
不考虑进位的情况下(术语叫半加器),用一个异或门就可以实现两个数字相加,很简单,就不画图示意了,自行思考吧。。。
考虑进位的情况下(术语叫全加器),稍微有点复杂,输入通过XOR(异或门)得到结果,同时过一个电路得到进位结果
进位规则如下:
1+1进位1
1+0进位0
0+0进位0
0+1进位0
可见进位规则可以用AND(与门)得到结果,所以电路图如下:
【【【【配图】】】】
把这样的电路串起来,就可以实现多位加法,自己想想看吧。
不过这里有一个问题,要连多个例图中的加法器,需要给电路添加一个输入口m,它是上一位的进位,有兴趣可以思考一二。
实际应用中,电路并不是凭空想的,是通过布尔逻辑运算得到一个最简逻辑表达式,然后按照这个表达式来组装电路,『请搜索数字电路』。
淘宝可以买到LED灯、二极管和三极管,虽然现在涨价了,但价格依旧感人,不到顺丰快递费就可以买一大把,有兴趣的同学可以自行购买这些元器件组装电路来玩玩。
输出端接上led灯,就可以观察到电路运行结果。
额外的,如果你把几个灯泡并联并且弄成一条线段的样子当做一个整体灯管,然后通过输入来点亮相应灯泡,就可以用来显示数字了。。
像下面这种,一共7个灯管
1点亮右边两根、2点亮相应的,以此类推
这样可以用布尔代数做出来5个输入7个输出相对应的逻辑,然后用上文的逻辑门组成电路图实现
(为啥输入是5个?)
「现在可以公开的情报」
- 可以用逻辑门实现加法,也可以实现减法
- 实现加法的原理在于通过输入进行逻辑运算得到输出,这一学科可以通过搜索『数字电子技术』获得详情
- 通过灯泡等设备,可以实现电路的输出
- 计算机的本质原理就是接受『输入』,通过『计算』,得到『输出』
- 通过上文所有文字,已经部分解决了楼主计算机为什么能读懂1和0以及内部工作原理的问题,虽然还剩下时序逻辑,不过这已经够了。楼主赶紧点赞吧
+++分割线+++
太长了。。。
后续还有反馈电路、触发器、时序逻辑存储器等等等等,最终目标是弄出一个CPU来(如果我有时间的话)可以写一个模拟器让感兴趣的同学用逻辑门拼凑CPU(如果我还有时间的话)
『待续(应该大概真的会续)』
**不过最后还是想提醒还在学校的cs同学们,这些知识对找工作毫无帮助,请不要在此屠龙之技上浪费时间。
打个比方,各地政府都对一些紧急事务做了“应急预案”,一旦事件发端,政府工作人员就可以快速按预案的流程处理事务。这个“应急预案”就类比于程序,工作人员并不需要学会思考和判断,只需要按照预案一一操作即可,决策的工作交由制作预案的人,也就类比于程序员,来完成了。
如果要详细回答,用户的指令,是如何转化成计算机可读入的机器码(0和1),计算机又是如何将得到的正确答案反馈给用户的,即CPU到底是如何工作的,这可能需要一个稍微长一点的回答:
事先做个声明,为了保证行文的流畅性和易读性,有很多相似的概念被刻意做了模糊化处理,包括但不限于场效应管与三极管,不同掺杂方式的场效应管,不同的逻辑门, 不同的触发器,不同的计算机体系结构,不同的存储器类型,所以计算机实际的运行方式与我的回答可能会大相径庭,但背后的基本概念和思维方式应该是一致的。
1场效应管
现代数字电路的基础是场效应管(模拟电子的基础是三极管),场效应管的基本机构是长这样的
蓝色部分平时处于绝缘的状态,此时源级(Source)和漏级(Drain)是不通的,电流不能从中间流过。当栅极(Gate)有电压时,一部分蓝色区域变成导体,源级和漏级就被打通了。这种材料可以表现出导体和绝缘体的两种特性,所以我们称之为半导体。由此我们获得了一个类似于开关的东西,可以通过是否给栅极电压,来控制电路导通与否,符号化地,我们将之表示为:
2逻辑门
当我们已经拥有了场效应管,我们就可以以此为基础搭建基本的逻辑门,即 非门,与门,或门。我们来看一个简单的或门的实现(非门的实现已经有很多答案提到了):
或门要求,当输入的a和b任一等于1,输出就为1。如果a和b均为0.,则输出为0.
————————————————原理简介,可跳过————————————————————
假设现在a为1,b为0,此时a控制的场效应管的栅极有了电压,这个管子被打通了,这个场效应管的漏极直接与地(即低电平)相接,它的漏极又形成了输出F的场效应管的栅极输入,因为场效应管F的栅极没有电压,处于截止状态,输出F上拉到电源电压Vcc(高电压),输出1。
我们接下来考察当ab输入均为0的情况。此时ab两个管子都处于截止状态,F管的栅极会上拉到Vcc,F管会被导通,于是输出F与地直接相连,F为低电平0.
————————————————————————————————————————————
相似地,我们可以构建其他基本逻辑门,并以非门,与门,或门为基础,构建或非,异或,同或,与非门等复杂一点的逻辑门。
3.1触发器
有了基本的逻辑门,我们如果把1对应真,0对应假,我们已经可以进行基本的逻辑决策了。但在实际情况中,我们做出一个决策,并不仅仅依赖于当前的输入,还依赖于之前的状态,因此我们需要构建带有记忆功能的逻辑组件,即触发器,看一个最简单的RS触发器:
它的真值表为
——————————————原理简介,可跳过——————————————————————
当RS均为0,触发器的两个输入为1(输入是RS取反),当Q为1时,下面的与非门的两个输入都是1,因此输出为0,上面的与非门输入为1和0,输出是1,因此Q保持1。当Q为0时,下面的与非门两个输入为1和0,以为内输出为1,上面的与非门输入为两个1,因为输出为0,因此Q保持0。
所以当RS为0时,Q输出与前一状态相同。
类似地,我们可以推到其他3种状态,得到上面的真值表。
————————————————————————————————————————————
我们可以看出,触发器的前一输出会影响到触发器后一输出。所以在某种意义上,我们称它具有记忆功能。触发器将会是构成状态机(控制单元)的重要基础组件。但为了对CPU的工作原理有更加全面的认识,我们暂时把目光从逻辑控制单元上移开,转向另外一个重要单元,计算单元。
3.2半加器和全加器
我们还是以逻辑门为基础。我们考察异或门的真值表:
我们发现,这恰恰就是二进制加法当前位的结果。
0+0等于0,0+1等于1,1+1等于0(因为产生了进位),因此我们很容易地想到,可以用异或门构造一个加法器(半加器):
S为当前位的结果,C为进位,当且仅当AB都为1时,产生一个进位1。
当然我们做加法时,是不能不考虑进位的,之前的半加器是不够完备的,一个完整的加法器(全加器)是这样的:
低一位的进位,和当前位的两个加数,共同决定输出。
好了,我们有了最基本的运算单位,加法运算单位。减法运算单位与之类似。从某种意义上讲,乘法运算可以看做是次数为被乘数的加法运算,除法可以看做是次数是被除数的减法运算,因为也可以用类似的方法实现(现代数字电路中,为了加快运算速度,已经不采用这种方法了,而是类似于我们用笔算乘法的逻辑,只不过是从10进制变成了2进制)。
这些数学运算单位,可以构成CPU的另一重要组件,计算单元。但仅仅有控制单元和计算单元并不足以组成CPU,我们还需要存储单元。
3.3静态随机存取存储器
不同的存储器的基本原理差别很大,有五花八门的存储器基于不同的单位成本,读取速度,是否需要上电保持来供计算机不同的应用进行选择,一一介绍冗长而又无趣,为了简单起见,仅介绍一种基于场效应管的存储器,静态随机存储器:
原理介绍我直接摘取了维基百科的内容,一如既往地,可以快速跳过以保持阅读的流畅性。
——————————————原理简介,可跳过——————————————————————
准备:
如果字线没有被选为高电平, 那么作为控制用的M5与M6两个晶体管处于断路,把基本单元与位线隔离。由M1 – M4组成的两个反相器继续保持其状态,只要保持与高、低电平的连接。
读取:
假定储存的内容为1, 即在Q处的电平为高. 读取周期开始时,两条位线预充值为逻辑1, 随后字线WL充高电平,使得两个访问控制晶体管M5与M6通路。第二步是保存在Q的值与位线BL的预充值相同,所以BL保持逻辑1,而Q与BL的预充值不同,使得BL经由M1与M5放电而变成逻辑0(即Q的高电平使得晶体管M1通路). 在位线BL一侧,晶体管M4与M6通路,把位线连接到VDD所代表的逻辑1 (M4作为P沟道场效应管,由于栅极加了Q的低电平而M4通路). 如果储存的内容为0, 相反的电路状态将会使BL为1而BL为0. 只需要BL与BL有一个很小的电位差,读取的放大电路将会辨识出哪条位线是1哪条是0. 敏感度越高,读取速度越快。
写入:
写入周期开始时,把要写入的状态加载到位线。如果要写入0,则设置BL为1且BL为0。随后字线WL加载为高电平,位线的状态被载入SRAM的基本单元。这是通过位线输入驱动能力设计的比基本单元相对较弱的晶体管更为强壮,使得位线状态可以覆盖基本单元交叉耦合的反相器的以前的状态。
————————————————————————————————————————————
4 冯·诺依曼结构
我们在
3.1中讨论过的触发器可以进一步构成状态机,例如我们可以用两个按钮和一个RS触发器控制一个电机。当按钮为01时,控制电机正转,按钮为10时,控制电机反转,按钮为00时,控制电机保持现有方向不动。此时这个控制组件就是状态机。通过它,我们可以实现面对特定的用户输入,机器可以自动做出对应的输出。状态机将构成CPU中的
控制单元。
从
3.2中我们获得了一个
计算单元。
从
3.3中我们获得了一个
存储单元。
加上我们最熟悉的
输入设备(鼠标,键盘)和
输出设备(屏幕,音响),我们现在已经足够搭建一个典型的冯诺依曼结构的计算机了:
连接各个单元的是
总线,数据和命令都以01二进制码的形式,通过总线奔跑在各个单元之间。每当用户输入一个命令时(点击一下鼠标或者敲击一下键盘),控制单元会接受这个命令,根据程序员已经写好的决策方式(程序),决定从存储器调用历史数据,并将数据放入运算器中运算,最后的结果会在输出设备上得到展现。
但是我们之前对于状态机的讨论中我们知道,控制器只能接受0和1的控制命令,意味着程序员写程序时,需要挨个给每个状态机的输入变量和初始变量赋予0或1,因此写程序会变成不断敲击0和1的一件事。这无疑是十分反人类的,我们需要更加接近自然语言的程序语言。
5汇编语言
我们讨论一种最简单的机器语言,如果我们用10110 来代表数据移动的操作(X86),某一个寄存器AL的编码是000,那么向AL写入61(二进制为01100001)这个数这个操作,程序员需要这样写:
10110000 01100001
于是我们尝试,把10110 翻译成MOVE,把000翻译成AL,这样代码就变成:
MOVE AL,01100001
这种用自然语言翻译之后的语言,就是汇编语言。汇编语言是用自然语言对机器码的一一翻译。以便于阅读和编写。
6高级语言
汇编语言当然比机器语言的可读性和可编写性都好上不少,但无疑还是十分让人蛋疼的,计算机科学家们又发明了诸如C语言等高级语言,它们的语法更加符合人的逻辑思维模式,而不是计算机的。编译器负责将这些高级语言,翻译成汇编语言,再翻译成机器语言。
基于C语言或者JAVA这种编程语言,还有一些更加友好的可读性强的脚本语言,例如WEB前端的Javascript,当然这些成熟的高级语言的区别将是一个繁复并超出我的能力范围的讨论,不展开了。天才的程序员们用这些语言,为我们编织了一个光怪陆奇又精彩纷呈的互联网世界。
最后的话:
在整个电子工业中,封装和复用的思想都贯穿其中,通过封装底层模块,让上一层的工程师不需要将精力花在冗长复杂的底层物理实现上,可以专注于自己算法和逻辑的推进。由于现代电子工业的快速发展,计算机计算能力的冗余越来越多,我们越来越不需要去关心底层封装的具体结构。当然了,对于一部分异常关注计算性能的方向,例如并行计算(计算量巨大)和嵌入式设计(有时微处理器计算能力有限),适当地关注底层逻辑实现,对编写更加高效的代码十分有帮助。
一般来说,问这个问题的和来参考的人肯定是完全没有学习相关课程的。所以我尽可能简单的从最基础的开始。请听我慢慢道来。
1.计算机怎么认识0和1的?
首先你应该听过二极管是什么,这是逻辑电路中最常见的电子器件。
额。。。又扯上“逻辑电路”了:逻辑电路是以二进制为原理、实现数字信号逻辑运算和操作的电路。
要想短短几百字说清楚还真难。不过,这里就看到“二进制”了,二进制就是问题中提到的0和1!而在实际电路中,0和1由低电平(低电压)和高电平(高电压)实现。非高即低,很容易实现。
回到逻辑电路,怎么用逻辑电路实现我们想要的一些功能呢?(这些简单功能就是计算机的基础,各项简单功能组合起来就能实现复杂的功能!)
首先,二极管具有单向导电性(原理就不说了,一下子很难懂的)。
好,这个你先记住,把二极管看做一个箭头,电流只沿箭头方向走。
然后,给你举个例子。如果有个决定,你和你朋友只有两个人都同意时才去执行。回到初中物理知识。
给你控制开关一,给你朋友控制开关二,都同意时才会把两个开关都放下,使电路导通,灯泡点亮。这就是一个简单的“与逻辑”。
当然复杂的电路中并不是人去控制开关的,所以得用二极管来实现。下面这个电路实现的是同一个功能。(画图神马的最折腾人了。。。)
当A,B都为高电平时(所谓的1),电源VCC的电流是不能通过D1,D2两个二极管的(电流只能从高电压处流到低电压处)。所以电流只能流向L点,如果在L点接个电灯泡(实际上是发光二级管),就会被点亮了。
还得继续解释,如果A,B中只要有一个为低电平(所谓的0),电流就可以通过了,就不会流向L点了,灯泡就不会亮了(为什么,想象一下电流为水流,导线为水管,而D1,D2处的管子是很粗的(几乎没电阻)!水流过不会有阻碍。而L处的水管是很细的(因为接了电灯泡,有电阻),水流很难流过,即使通过也是很小的水流(电流),不足以点亮灯泡。更确切的应该用电压去解释,能力有限,只能这么玩了。)
所以这个简单的电路就能实现一个简单的功能,而且电路能够识别1和0了!
2.计算机能用1和0做什么?
除了与门,逻辑电路中还有常见的或门,非门,或非门,与或非门等。(其中有些还要用到三极管,原理就跟上面大同小异了,只要了解的童鞋就不用管了)。
与门在电路图中的符号:
当A=1,B=1时,L=1;(1代表高电平,0代表低电平)
当A=1,B=0时,L=0;
当A=0,B=1时,L=0;
当A=0,B=0时,L=0;
或门在电路图中的符号:
当A=1,B=1时,L=1;
当A=1,B=0时,L=1;
当A=0,B=1时,L=1;
当A=0,B=0时,L=0;
非门在电路图中的符号:
当A=1时,L=0;
当A=0时,L=1;
然后我们就可以用这些门电路相互组合去实现复杂的逻辑功能了。
好,有了上面这些知识,下面来个实用的:
计算机怎么做加法的?
就是上面那个电路就可以实现两位二进制数的加法了。容易扩展为更多位的加法运算,然后依次类推,可以用门电路实现减法,乘法和除法等。
这样,不说是计算机,计算器的模型总出来了吧。
最简单的理解:这是一个庞大的机关兽。(参见“秦时明月”,千万不要当真!)
———原文在日报长评———
这个问题本身有个瑕疵:0和1指的是什么?
1. 我大胆的猜测题主指的是汇编代码。
高级代码(C++)经过编译后会转化为汇编代码传递给硬件,汇编是由一串特定长度的0和1组成。一般而言的64位计算机,就是指可以处理64位长度的汇编代码。而这一串0和1本身,包含了微指令以及一些变量,根据所处的位置不同,0和1们组成了不同含义的命令。
然后就是题主所问的计算机如何读懂0和1。以简单的芯片来说(如MIPS),片上系统由controller和datapath组成(不知怎么翻译)。前者可以理解成公司的管理层,后者就是具体干活的。controller接受了上文所术的微指令,就知道这个汇编代码是什么作用(比如“011001”代表读取数据)。然后controller告诉datapath哪些模块要工作,数据从哪条唯一的路走。你可以想象一下赛车,从起点到终点只能走一条路。最终,输入的数据走过规定的路径,被处理成期望的输出值。类似的过程不断上演,大量的数据经过处理后,我们就在显示器上看到反馈的结果。
2. 如果题主认为0和1指的是高低电压,那问题本身就不严谨了。
数字电路中认为有三种值:0、1和高电阻(在设计中还可认为有“不确定”状态)。而真实的电路中没有确切的高低电压值,不同系统规定了不同的电压范围代表不同的值。你甚至可以把电压分成十级,就得到了十进制。只能说现实是相对的,自然界没有明确的0|1之别,人类设计出来的规则让计算机识别了0|1。
3. 扯远一些。硅技术之后的有力候选者–量子计算机。量子本身有多个叠加态,不只两个,所以可以做到0、1、2、3……到时问题就变成了“计算机如何识别0、1、2、3?”
知识背景:VLSI Master
欢迎指正,谢谢读到结尾。
25/10/14
No,它根本不懂。就像算盘不懂你拨珠子时心中默念的口诀类似。但是这样并不妨碍最后得出你想要的结果。
至于为什么在它完全不懂的情况下,还能搞出点有用的东西,这是另一个问题。
http://weibo.com/hubo1016
知乎有个毛病就是有许多答主喜欢长篇大论不说人话,现在我试图用最简单的话来说明这个原理:
1. 只有数字电路才基于0和1,或者说布尔逻辑进行工作。模拟电路的输入是某个范围内任意的电压,输出也是某个范围内任意的电压,输入输出是个连续函数的关系,最简单的比如说放大器的电路;如果做过相关实验的话也会熟悉用运算放大器搭建模拟计算电路的方法。模拟电路可以进行许多各种各样的计算,加减乘除甚至乘方开方,输入输出都是用连续的电压表示。
2. 模拟电路计算有个致命的缺点:输出会受到输入噪声的影响,因而变得不稳定,不适用于严格的科学计算。元件的精度、老化程度也会影响计算的精度。产生这个缺点的原因是电子元件工作在线性区域,所以输出对输入的变化很敏感。
3. 正如上面所说的,电子元件工作在线性区时,输出会对输入的变化过于敏感,不适合精确计算。那么反过来,电子元件工作在非线性区时,输出对输入的变化是不敏感的。一个典型的非线性电子元件电路有两个这样的非线性区,以共射接法的BJT晶体管为例:
输入<0.7V时,晶体管截止,输出为最高电压(假设是5V);
输入>0.75V时,晶体管进入饱和区,输出为最低电压(约为0V);
输入介于两者之间时,晶体管处于线性工作状态,函数大概是5 – (Ui – 0.7) * 100,100是放大倍数,实际上一般会比100更大。在这段区域中输出对于输入是极端敏感的,不适合数字电路工作。
而前两种状态下,输入在相当大的范围(0 – 0.7V, 0.75 – 5V)中变化时,输出都是几乎不变的,也就是说输出几乎不受噪声影响,非常适合数字电路工作。
4. 因为我们的元件普遍只有两个非线性区,所以我们不可避免地用其中一个表示0,另一个表示1,而没有其他的状态去表示2或者3或者更多了。这并不是人类特别的喜欢二进制,而是受到了元件特性的限制。因为所有的变量都只有0和1两个状态,所以所有的逻辑都可以用布尔代数表示,这就构成了数字电路的基础。二进制计算只是布尔代数逻辑的一个特例。
那么你最后就应该明白了:
计算机只能接受0和1两种输入是因为数字电路只能接受0和1两种输入,数字电路只能接受0和1两种输入是因为非线性电子元件只有两个非线性区。
我的这个回答针对的是小白,不叨扰专业人士。这里没有很专业的东西,不够严谨,但有助于小白稍微理解一下计算机如何通过处理二进制信息来运转。
1. 0和1组成的是二进制的数字,计算机内部处理的是0和1其实就是说计算机内部处理的是二进制数字
2. 计算机是电设备,整个工作中处理的电信号有两个: 高电平和低电平(可以类比得理解为电容器的充电状态和放点状态),这两个信号就对应了1和0,因此,计算机内部处理的都是二进制的0和1。
3. 计算机内有可以对二进制数进行运算与传送的器件。比如二进制数的加法、一串二进制信息在内存与磁盘间的传送等,都有相应的设备,保证了计算机可以执行对二进制的各种操作。
4. 任何可存储及可处理的信息都可以用一串等价的二进制数表示。比如: 十进制的数字可以转化为二进制的数字,一句话中的每一个字或字符都可以按照某种规则用固定的二进制数来表示(可以将这样的二进制数理解为相应字或字符的代号),一段视频也可以用一串二进制数来表示(视频分为很多帧,每一帧中每个像素的值都可以对应于一个二进制数),同理,其他的各种信息(如音频等)都可以用相应的一串二进制数表示。
5. 计算机连接的一些外部设备称为外设(例如: 鼠标、键盘、显示器、打印机等)。计算机可以向外设传输二进制串,控制外设的工作,比如可以向打印机传送要打印的内容,或向打印机传送一段约定好的二进制串表示让打印机开始打印;外设也可以向计算机传输二进制串,比如敲击键盘会产生相应的高低电平,即对应的0、1串(高电平1低电平0),传入电脑后,计算机便可以判断出按下了哪个键。这样便实现了计算机对外设的控制及双方的信息传送。
综合以上几点,计算机能够通过处理高低电平的方式处理0、1二进制串,而所有的信息都可以等价地用相应的二进制串来表示,计算机内有对二进制串进行各种运算与处理的设备,计算机也可以通过传送相应的二进制串来进行外部设备的控制从而实现输入与输出,这样,在二进制的基础上,计算机工作了起来 ^_^
因为,最开始造的计算机,它就是做十进制运算的!
ENIAC是十进制大家应该不陌生的吧。因为十进制是人最自然的思考和计算方式,计算机自然就那么设计了。就是那个用真空管的年代,用十个真空管代表一位上的0~9,于是就十进制了,看,多么浪费低效,但太符合人类正常思维方式了。自然而然就设计成那样了。
不过后来两位天才,图灵和冯诺依曼改变了这种设计,提出了用二进制做基本运算。其实你学了不同进制的运算后,就会发现他们真的只是进位的不同,+-*/四则运算根本没有区别,古代用的重量计量是16进制,时间至今还是12进制,这都没有什么关系。
改用电子管之后为什么就用二进制了?这是因为二进制容易判断。电子管使用电平来标识某一位的值,如上说的高电平代表1低电平代表0,这是用点子元器件很容易判定和区别的,因为它们之间的差别够大,不会产生误判。如果现在电子元器件的灵敏度足够高,可以完全准确的判断识别0.1V的电压变动,那么把0~5V分成10份,电压每变化0.5V就代表十进制0~9中的一个值,那么现代计算机也可以做成十进制的了。可惜,现在不能做到,或者即使可以以很高的准确度做到,只要它还会产生误判,那么对于计算机这种0错误容忍的系统来说它就不可用。
所以,其实是技术不允许做成十进制的。
但更重要的是,我还得强调,不同进制做数学运算根本没有区别!“加一”对于所有的进制来说都是“加一”,因为“一”对于所有的进制来说都是“一”,是相等的,一致的,是统一定义的,它们之间的区别只是数到几的时候产生进位罢了。
这个问题,我必须回答一下,作为一个cs专业的学生。。。我到大二其实都不是很清楚,直到我遇到了一本神作。。。 我一口气读完,有句话我终于领悟了:朝闻道,夕死无憾!
闲话不多讲,有一本神作!绝对的神作!Charles Petzold的《Code》,这本书可以说,下至5岁孩童,上至90岁老妪,无论你是计算机小白,还是大神,都会从这本书中有所收获。真是后悔没早点看到这本书,让我一个无比讨厌自己专业的人,都开始热爱这个伟大的创造,你说你还在等啥!!赶紧去图书馆借去!!!!立刻!!!马上!!!!
ps:如果你真正想了解计算机的原理的话。。。我觉得没人能比这本书讲的更通俗了
ps2:如果你想继续了解的话,王爽老师的《汇编语言》,还有一本《深入理解计算机系统》,我相信你会喜欢。
http://book.douban.com/subject/1024570/
我不知道他们为什么要回答那么长“科普”
简单的说,读懂的不是“1”和“0”,而是通过低电平和高电平
这是门电路里的二极管或晶体管的导通特性决定的。
不同器件低电平电压值不同,但是只要是判定低电平我们就抽象认为为逻辑“0”,
高电平同理。
一个简单的问题,
已经快把数字电子技术的基础知识讲完了
真的很无私啊!
一直想做个萌化版的计算机科普知识的书~
这样会不会可以吸引更多的萌妹子进入IT学科的世界啊?
——————————————————————
很简单,程序君告诉电子元件 我有00000101的代码传输给你
然后 若干元件君就说 我们一起来表示这个机器码吧
于是元件君就用自己是否通电这个萌萌的状态来表示机器码
所以来说,计算机不是能读懂1和0,而是能感受到身体里可爱的元件君 是否处在萌萌的状态。
上面的代码就转化成
不萌 不萌 不萌 不萌 不萌 萌萌哒 不萌 萌萌哒 不萌
计算机是用数字电路组成的,而数字电路中有0和1两种状态,所以计算机只能读懂0和1。
而数字电路有高电平和低电平两个状态,被识别为0和1而已。
最基本的,1是电路闭合,0是电路断开,根据逻辑不同几个输入端输出端又能组成最基本的三种门电路:与门,非门,或门,门与门叠加还能构成与非门、或非门、 与或非门……那这样只要足够多的这些基本单元,就可以运算非常复杂的东西了。
计算机基础或数字电路的一些基础课都会讲这些,我另外推荐看下《三体1》吧,
在《18. 三体、牛顿、冯.诺曼伊、秦始皇、三日连珠》有一段“人肉计算机”的剧情,很形象的解释了计算机怎么工作,引用如下:
“我不知道你们的名字,”冯·诺伊曼拍拍前两个士兵的肩,”你们两个负责信号输入,就叫’入1’、’入2’吧.”他又指指最后一名士兵,”你,负责信号输出.就叫’出’吧,”他伸手拨动三名士兵,”这样,站成一个三角形,出是顶端,入1和入2是底边。”
“哼,你让他们成楔形攻击队形不就行了?”秦始皇轻蔑地看着冯·诺伊曼。
牛顿不知从什么地方掏出六面小旗.三白三黑,冯·诺伊曼接过来分给三名士兵,每人一白一黑,说:”白色代表0,黑色代表1。好,现在听我说,出,你转身看着入1和入2,如果他们都举黑旗,你就举黑旗,其他的情况你都举白旗,这种情况有三种:入l白,入2黑;入l黑,入2白;入1、入2都是白。”
“我觉得你应该换种颜色,白旗代表投降。”秦始皇说。
兴奋中的冯·诺伊曼没有理睬皇帝,对三名士兵大声命令:”现在开始运行!入1入2,你们每人随意举旗,好,举!好,再举!举!”入1和入2同时举了三次旗,第一次是黑黑,第二次是白黑,第三次是黑白。出都进行了正确反应,分别举起了一次黑和两次白。
“很好,运行正确,陛下,您的士兵很聪明!”
“这事儿傻瓜都会,你能告诉联,他们在干什么吗?”秦始皇一脸困惑地问。
“这三个人组成了一个计算系统的部件,是门部件的一种,叫’与门’。”冯·诺伊曼说完停了一会儿,好让皇帝理解。
秦始皇面无表情地说:”联是够郁闷的,好,继续。”
冯·诺伊曼转向排成三角阵的三名士兵:”我们构建下一个部件。你,出,只要看到入1和入2中有一个人举黑旗,你就举黑旗,这种情况有三种组合–黑黑、白黑、黑白,剩下的一种情况–白白,你就举白旗。明白了吗?好孩子,你真聪明,门部件的正确运行你是关键,好好干,皇帝会奖赏你的!下面开始运行:举!好,再举!再举!好极了,运行正常,陛下,这个门部件叫或门。”
然后,冯·诺伊曼又用三名士兵构建了与非门、或非门、异或门、同或门和三态门,最后只用两名士兵构建了最简单的非门,出总是举与入颜色相反的旗。
冯·诺伊曼对皇帝鞠躬说:”现在,陛下,所有的门部件都已演示完毕,这很简单不是吗?任何三名士兵经过一小时的训练就可以掌握。”
“他们不需要学更多的东西了吗?”秦始皇问。
“不需要,我们组建一千万个这样的门部件,再将这些部件组合成一个系统,这个系统就能进行我们所需要的运算,解出那些预测太阳运行的微分方程。这个系统,我们把它叫做……嗯,叫做……”
“计算机。”汪淼说。
“啊–好!”冯·诺伊曼对汪淼竖起一根指头,”计算机,这个名字好,整个系统实际上就是一部庞大的机器,是有史以来最复杂的机器!”
……(后面的可以自己去看了)
这个问题真的要打的这么复杂吗?
计算机读懂的不是0和1,它读懂的是通电和断电。正常情况下通电是1,断电是0。
举个例子,世界上最简单的计算机,你知道是什么吗?
是一个灯泡。
你给它通电,就相当于告诉它1,它便亮了,你给它断电,就相当于告诉它0,它便灭了。
你以为它懂0,1 ?不不,它懂得是通电还是断电。
而复杂的计算机道理是一样的,只是通电断电的情况复杂的多。
题主都问出这样的问题了,你们真的好意思说一大堆计算机原理来解答这个问题么
随手写写
#10-22更新
因为得到了赞同,想一想决定逐步把答案写得更详细一些。
因为没有参考资料,全凭记忆打字,难免有所疏漏和不准确。
#
计算机所认识的0或1是信号的高低电压。高低电压即逻辑值(0或1)来自于芯片中逻辑电路的控制,主要由CMOS器件组成。CMOS的逻辑设计详见:VLSI大规模集成电路基础等课程(偏重基于CMOS的逻辑设计)。CMOS器件的工作原理详见:半导体器件物理相关课程(偏重CMOS的器件特性和原理)。半导体器件物理的基础来自半导体物理,主要是能带理论。能带理论的基础是量子力学。(所以没有量子力学就没有现代计算机)
#10-22更新
CMOS的构造和逻辑实现原理 (懒得找图,可以搜关键字看图)
假定有一种逻辑的开关,开关的输入信号为1则开关开启,为0则开关关闭,开关连接输出信号和地(0)。则输入为1,则输出为0;输入为0,输出为高阻(z,无逻辑值)。->叫做NMOS
另一种开关相反,输入为0则开关开启,为1开关关闭,开关连接输出信号和电源(1)。则输入为0,输出为1;输入为1,输出高阻。->叫做PMOS
如果把NMOS和PMOS对称的连接到一起,结果是:输入为1,,输出为0;输入为0,输出为1,总有确定的输出值,避免了高阻的情况,即CMOS(C是对称的意思)。在逻辑上实现了反向的功能,即非门(not gate)。
如果两个NMOS串联,PMOS并联,则两个输入都为1,输出为0;一个输入为0,输出为1,形成了NAND gate,再加一个NOT gate,就是AND gate。类似的可以搭建OR gate,进而搭建所有的逻辑功能。对于任意给定的输入组合和输出组合,总可以找到一个逻辑表达实现该功能(即数字逻辑电路设计中的卡诺图)。在增加了电平和边沿触发的存储单元(D触发器等),就可以把逻辑分割成不同的部分用同步的时钟来控制->形成logic + register的时序电路。CPU等IC都是这样的电路。
CMOS是现代集成电路的主要基本结构,因为输入和输出之间没有电流,功耗较小,易于大规模集成。现代的工艺(40nm/28nm/20nm/14m)也主要是在CMOS的结构上通过工艺等多方面的改进不断缩小尺寸和降低功耗。至于如何在硅片上形成这样的MOS结构涉及到半导体工艺的知识,这又是一个非常广泛的范畴。
NMOS和PMOS的MOS指的是金属场效应管,即靠输入信号的电压(栅极),把半导体材料中的载流子(半导体中可以导电的粒子,根据N型和P型分别是电子和空穴)吸引到特定的区域,形成一个可以导电的沟道,从而实现MOS管源极和漏极之间的导通。这就是开关为什么能打开和关闭的原因。当然这是最简单的介绍,其中有很多复杂的数学模型来分析(半导体器件物理的范畴)
半导体物理和量子力学的学得太早(03-04年),10年没看,有点不记得……
下次有时间可以更新一些体系结构方面的内容
#
计算机的硬件体系结构基本上是这样:
操作系统/编译器 -> 计算机体系结构(指令系统体系结构)-> CPU/SOC设计、板级设计 -> CMOS设计/EDA工具+数字逻辑 -> 半导体器件物理 -> 半导体物理 & 量子力学
回答得太高大上了。
先理解输入和输出怎么用0和1表示。
简单的模型:一个开关控制一个电灯的亮灭。”开关“相当于输入的0和1,灯的亮灭相当于输出的0和1. 这就是一个简单的计算机了。输入了0和1,输出了0和1.
如果使用电子技术(例如强电里面大家能看见的继电器技术),那么A模块的输出,就可以做B模块的输入。也就是说,输入给A的是”通“和”断“(开关),A输出的也可以是“通断“。
这就是单模块的工作原理。记住0和1既可以是输入,也可以是输出。0和1是你定义的。你可以把声音、键盘、鼠标等等各种输入转换成0和1.比如你按下某个键,那么相当于键盘输出了一系列的开和关的动作。计算结果的0和1表示,可以想象你的屏幕的某个点被点亮和变暗,亮是1,暗是0.
计算机的输入全部会转换成按时间轴相关的一系列开关,开和关2个状态就对应于输入的”0“和”1“。输出就对应于”灯“的开关。
计算机里面所有的”计算“、”存储“、”通信“,相当于各种元器件间的”开“”关“控制。
但必须注意,这些开关动作是按时间排序的,开关的频率达到每秒10亿次,100亿次。开关和开关之间有并行串行关系,开关和开关之间可以配合,开关的动作可以被延时,可以被记录等等。。。。。。。
这就是所谓的计算机只懂0和1. 因为所有的输入和输出,都以2个状态表示。计算机的处理就是把一系列的0和1的串,变成另外的一个或多个。
这个应该得从自然界说起……
作为物质世界的自然界虽然复杂奥秘瞬息万变,但总是可以一分为二的。自然界既是超密态物质和等离子态物质的对立统一,又是正粒子(正物质)和反粒子(反物质)的对立统一,既是物质的连续形态(场)和间断形态(实物)的对立统一,又是宇观天体和微观粒子的对立统一,既是生命形态和非生命形态的对立统一,又是多种物质形态相对平衡和永恒演化的对立统一……
正所谓道生一,一为太极;一生二,二为两仪;二生四,四为四象;四生八,八为八卦;八卦生六十四,六十四具而后天地之数备焉。
钢琴从来不懂音乐.
计算机从来不懂0 和 1.
苹果从来不知道万有引力
人类从来就没有搞明白意识.
计算机只是按照基本物理定律运行的机器,最最基本原始的那个工作原理不知道,基本原始的那个工作原理应该是
麦克斯韦方程组和量子力学。
全世界人类计数,不约而同的选择十进制,是因为人有十根手指。
全世界人类计时,不约而同的选择十二进制,是因为,一个圆周比较容易做出十二等分。
电脑运算选择使用二进制,是因为电脑没有十根手指,也没有圆型的刻度盘,但是有一种原件叫二极管。
一般来讲,物体分为导体和非导体,前者可以通电,后者不通。介于两者之间的是半导体,就是一定条件下不通,一定条件下通。可以想象成压力锅的减压阀,一开始上面的小铁块是将阀关闭的,当锅内压力达到一定程度的时候,蒸汽会把小铁块顶起来,使阀导通,将多余的气压泄出去。半导体就是有这样一种机制,在一定条件下可以导通,而不满足条件的时候就是不导通的。
这样,人类就有了利用半导体,控制这个条件是否达到来决定电路是否导通,从而实现1和0的变化。
有电就是1,没电就是0
任何东西都能读懂0和1,比如猴子:
给猴子通电,看到猴子表情痛苦胡乱挣扎,则为1,否则就是0。
想学到知识看书吧,比如petzold的〈编码〉就讲的很清楚
丁旭都已经给出了很详细的答案,我再继续补充一下其他部分。
为什么0,1就能做所有的事情,是因为数组电路可以实现布尔代数,布尔代数可以实现我们常见的所有计算过程。
你的每次操作,都最终化为事先存储在计算机cpu里面的一组指令。
计算机并不懂你在做什么,它只知道按照你的输入的指令执行而已,然后输出一个结果。
之所以显得很智能,是因为cpu指令集的组合到一起,可以实现很复杂的逻辑。
这么这个坏主意(误)是谁想出来的?
他是我们伟大的信息理论之父
香侬(
Claude Elwood Shannon)
就是上面这位帅小伙。他是美国密西根人。
香农在学习非常好~他20岁的时候,就从密西根大学本科毕业,进入mit读研究生。(天才就是这样的任性,20岁读硕士)
然后他参与了老师万尼瓦尔 布什的一个项目。(这位仁兄给小罗斯福总统提出了一个“科技兴国”的战略,并被采纳。然后美国从他的战略出发一跃成为世界第一科技大国)。
当时布什正在搞一个机器,说白了就是一个(只)
能算微积分的计算器……这个计算器大概是这样子的:
它是一大坨充满原始二极管的电路板和机械的组合…也没有显示器什么的……
而且这个计算器不像今天的电脑这样,它不是二进制的,它不但懂0,1,它还懂2.3.4.5.6…..
于是香农就对着这个大机器天天搞阿搞,学啊学。研究怎么样才能让它算出来诸如:
这样的东西……
但是这东西太复杂了,香农怎么弄都弄不出来,于是他每天夜里为项目抱头痛哭。
最后终于有一天~
香农突然感受到了七龙珠的召唤,发觉:
用布尔代数的方法去设计这个计算器更方便一点儿……电路板能更简洁易懂……
于是他赶快跑到,写出了震惊世界的论文:
“ A Symbolic Analysis of Relay and Switching Circuits”
这篇文章中,香农第一次提出:布尔代数可以用逻辑电路等价实现。
当时香农只有21岁,也就是我们很多同学大二大三的样子(想想都是泪,人家21岁在改变世界,我们都在忙于找妹子和汉子)
说白了,香农告诉我们,用只懂得0,1的逻辑电路造电脑才是王道~
于是从那以后,电脑就都是以布尔代数为基础,组织编写指令集。
才造成了今天我们常说的:电脑只懂0,1。
1、开关、通断是自然界最普遍的现象,应用于计算机设计是最方便的。拿数字来说,在我们看来的1在计算机看来是00000001,在我们看来的2,在计算机看来是00000010.我们看来的A、B、C、D在计算机也有不同的编码,具体查看ASCII编码。
2、计算机读懂0和1,靠的是不同的电压水平,对于我们来说是0和1,对于它来说其实就是低电平和高电平,不同的低电平高电平串代表了不同的指令含义。
3、计算机的逻辑就是基于2进制建立的。一个字节8位,是2的3次方,一个字母编码1个字节,一个汉字编码2个字节,一段指令编码1个KB,1024个字节。所以计算机的性能不光要看CPU的频率,还要看他的内存和缓存数。
简单说明一下,大神勿喷。
发明计算机的最初目的就是为了计算, 而计算机的内部是集成电路, 电路只能完成逻辑运算, 而二进制正好作为这个把实际运算转换为逻辑运算的桥梁, 所以计算机只能读懂10
它更像是是一个设计出的伟大”巧合”——利用它之前设置好的微型电路和电路状态,辅佐以你利用外设输入的电信号,通过”走”微电路来得到你想要得到的电信号输出。
不太确切的说,像一个精妙复杂的,可以重复使用的多米诺骨牌。
这是我在知乎的处女贴,如有不足,请大家多多指教(你敢!)。
在我写这个答案之前,这个问题底下已经有了
的关于实现的回答,和
的关于原理的回答。后者讲的是更加根本的问题,就是要回答提问者“嗯…我想问的就是,最最基本原始的那个工作原理”这个疑惑。写的很好!讲出了计算机的理论基础是布尔代数。但是,对,我要讲但是,为什么理论基础是布尔代数,而不是什么别的呢。这就像上大学的时候,老师上来就讲,翻开第几页,嗯好,基本原理是布尔代数,你们记住了,然后就学电路实现,你们也要记住了。
如果这世界上还没有人提出布尔代数,你应该怎么去设计计算机?
好的,本篇要交给大家的就是如何创造计算机的基本原理。看完以后你会明白为什么仅凭“与或非”三个逻辑就可以造出整个计算机世界。
我觉得不是先有布尔代数,我要创造计算机,正好就可以用布尔代数来实现,而是我要创造计算机,它的原理应该是这样的,这个原理的名字可以叫做布尔代数。我觉得科学研究不应该是撞大运(虽然有一部分就是),而是先提出合理的设想,然后去实现它。
我要说的是,本篇的理论都是我土想的(但是并不土,都是有逻辑在里面的),没有借鉴任何材料。我是学电子的,我利用所学的知识所带给我的思想去从根本上推演计算机的原理应该是什么样的,这是原发性的思维。
好的以上是废话,下面进入正题。我来教大家如何创造计算机,以下内容基本上有高中(甚至初中⊙﹏⊙)的知识水准就能理解,不带任何电路知识以及复杂的数学知识。
以下内容分为2个部分:
1. 为什么用0和1(也就是二进制)作为计算机最基本的数字?
2. 为什么要用布尔代数作为计算机最基本的处理功能?
(以上两步可以解释计算机的逻辑原理,想要理解物理世界中计算机还需要去别的答案中看一下如何用电路等实现布尔代数)
开启装X模式!
1. 为什么用0和1作为计算机最基本的数字?
我们用0和1来作为最基本的数字,就是要用来表达信息的。说到根本问题上了,计算机就是要用来帮我们处理信息的,比如翻译啊、搜索啊、AlphaGo思考怎么对付李世石等等。那么第一个关键问题就是如何表达信息,更准确一点,什么是信息的最基本表达方法(任何问题都要想其最基本的模型与方法,复杂问题都是可以用基本模型与方法以庖丁解牛的方式来解决的)。
这里,我们要说一下什么是信息。普及一下信息论的基本知识。信息就是不确定性,有不确定性才有信息。比如,明天是星期几,我写这篇的时候明天是星期一,这没有不确定性,我讲出“明天是星期一”,这句话是没有任何信息的。再比如,明天是什么天气,可能晴天、可能多云、可能下雨,有不确定性,我告诉你“明天要下雨”,这句话才有信息。一个不确定的事情最终可以表现为几个状态,比如晴、多云、下雨三个状态,我们就可以用数字来代表这些状态。好的,你现在知道了,我们用数字来在信息当中代表一个事物可能的状态,比如对面发过来一个字母,我们用26个数字代表它可能的状态,要在显示器上某个点上显示颜色,我们用256个数字代表它可能的状态。
现在来想信息的“最基本”表达方法。1个数字?刚才说了,1个数字只能表示1个状态,1个状态根本就没有不确定性,这根本就没有信息。所以,最少得2个数字,所以我们需要二进制,我们需要0和1。
总结一下,信息就是不确定性,一个事物有不确定性怎么也得有2个状态,所以我们用二进制作为计算机信息的基本表示方法。在此基础上,任何复杂的信息都可以用二进制表示。
2. 为什么要用布尔代数作为计算机最基本的处理功能?
这里,我们要想一个很关键、很根本的问题,我们需要计算机是用来干嘛的?处理信息!!!
前面解决了怎么表示信息,接下来就是要解决怎么处理信息的问题(对,在这我们将要寻找计算机最基本的逻辑功能)。这里将要出现最关键的想法,就是,既然信息是用数字表示的,如果计算机能够掌握所有的数字之间的转换方法(或者叫运算方法,或者叫一种信息变成另一种信息的方法),那么它就变成自动的了,它就能够为我们自动地处理信息。(比如,这个世界上的信息只有语言、工作只有翻译,如果有一个玩意儿能具备中译英、英译中、中译日等等所有的语言之间的翻译方法,那么这个玩意儿就成为了一个计算机)
好了,我们这里就是要找到二进制世界里数字之间最基本的那几个转换方法。对,最基本,复杂的方法可以由基本的方法来构成,比如我们十进制世界里“×”这个方法可以由很多“+”构成。这里,我们要扯一点数学思维,我们现在要做的就是要找到一个数字系统当中最基本的、并且是完备的运算方法合集,如果一台机器能够实现这些个运算方法的功能,那他就是这个数字系统当中的计算机。(最基本解释过了,这里解释一下“完备的”,比如,有了加法,但是它不会做开根号,那么它就不能帮我们写作业,它就不是计算机,但是,如果我们假设十进制里面就只有三种基本运算,加法、开根号和积分,能实现这三种基本运算的就成了计算机)
最基本的、完备的运算方法合集?听上去非常高深,需要非常高等的数学思想。试想一下,是啊,我要怎么知道加法、开根号和积分是不是十进制里最基本、完备的运算方法,不是的话我要怎么找,怎么证明呢?(想到这里想砸电脑有没有!)
骚年,不要着急,我将带着你用最土的方法去寻找!因为我们的数字系统很简单,情况很少,所以我们要用的就是,穷举法!这里的穷举法就是,去找到二进制数字系统里面所有数字之间变换的方法。
比如,遇到1变成0,遇到0变成1,你们知道这叫“取反”。
比如,遇到1和1变成1、1和0变成0、0和1变成1、0和0变成0,你们知道这叫“与”。
比如,遇到101101010变成00110101,010111100变成11101……这什么鬼!这样下去方法要找到何年何月!
别急,别急。记住,带着最基本的思维去寻找,所以我们应该去找到最基本的情况中的运算方法。
首先,我们能把参与运算数字的数量减少掉。我们把变之前的数字叫输入,把变之后的数字叫输出。
“多输入一输出”的问题都可以在“二输入一输出”的模型基础上解决,比如,三个二进制数字变成一个0或1,我们可以先把前两个输入做一次“二输入一输出”的处理,然后将这个中间输入和原来的第三个输入再用“二输入一输出”的方法处理一遍,于是三输入一输出的问题就被分解为2次“二输入一输出”的问题。(不可能分解为“一输入一输出”的问题,这里不展开解释)。
“多输入多输出”呢?从@萧井陌的答案对全加器的解释我们可以知道(能允许我盗一下图吗),“多输入多输出”的问题可以分解成多个“多输入一输出”的问题。比如,全加器中,我们可以先推倒出由所有输入得到“和”的逻辑,再推倒出由所有输入得到“进位”的逻辑,2个输出就包含有2个“多输入一输出”的问题。
最后,别忘了还有“一输入一输出”,这个分解不了。
至此,“一输入一输出”、“多输入一输出”、“多输入一输出”都分析完了,整个二进制系统当中数字转换的最基本模型是“一输入一输出”和“二输入一输出”,我们现在就来提取其中的基本运算方法。
怎么找?穷举法来了,看好了,就是把所有可能的输入输出组合都罗列出来,找出其中的通用方法!
a) 一输入一输出
在穷举的时候,我们把输入固定,变换输出的组合就可以了。
有一个输入时,输入的情况可以有两种状态,每种输入状态下可以有两种不同的输出状态,于是就有2的2次方即4种情况,如下表。这个表表示的是,以第一列为例,输入1时得到0,输入0时得到0。
其中,第1列和第4列无论输入什么输出都是固定的了,所以这是恒等式,没有什么计算可言,剔除。
然后,第2列我们就叫这种运算为“取反”,第4列叫“取等”。
好了,一输入一输出分析完了,有两个运算方法。“取反”用一个符号not表示,所以第2列就是not A = B。“取等”,其实这啥运算也没有,物理世界也很好实现,一根电线拉过去,所以你一边呆着去。
b) 二输入一输出
我们来想一下有多少种情况。输入有4种状态,每种状态下可以有两种不同的输出状态,于是就有4的2次方即16种情况。好,开始分析这16种情况。
你4不4傻!
我们说了要寻找最基本的运算方法,所以就要将“二输入一输出”当中那些能用一部分情况和“一输入一输出”的运算方法再次运算得到的另一部分情况剔除掉。比如,输出是0000的就可以在1111的基础上“取反”得到。这里我们可以用的只有“取反”。
首先,我把表画成这样,规定,第一行的输出必须是0,这样就先用“取反”将输出情况去掉一半。
然后,把恒等式“0000”去掉,剩7个。
然后,把输出只受一个输入影响的去掉。比如输出是“0101”,这时输出只由输入1决定,另一个输入是废的,这不是二输入一输出运算,走开,别捣乱。还有一个是“0011”。这样还剩5个。
是不是只剩下5个了!开始定义这5个运算方法!So easy!
qiodomadei!里面还有浑水摸鱼的。别忘了,我们刚刚只对输出套用了“一输入一输出”的运算方法,输入也是可以用的!
没关系,让我们来看剩下的5个,边定义边分析。
我们知道,第一列叫做“与”,记作A andB = C
最后一列叫做“或”,记作A or B =C。
我们来看第2列和第3列。第2列,我们发现只有在输入组合为01的时候才输出1,是不是和“与”很像呢,我只要把输入1取反就是“与”了嘛,所以第2列就是(not A) and B = C。同理第3列就是A and (not B) = C。
第4列,我们也来看看能不能用“取反”和“与”组合得到。我想想,等一下,我上个厕所想想,再等一下,我打盘游戏再想想。不行!我想不出来,等到花儿都谢了还想不出来!看来没办法了,给你个新的名字叫“异或”吧,记作A xor B = C。
其实!我不是这么想的!我们来观察一下剩下的5种输出的规律。当我定义了“与”之后,他的作用就是使输出只在一种情况下为一个值、其他情况为另一个值。符合这种规律的还有第2、3列,其实还有第5列!只要按照都为1才得1的规律,第5列就变成not((not A) and (not B)) = C,“或”没了!而第4列的规律是有两种情况为一个值,另外两种情况为两一个值,这个规律和“与”不同,是一种新的运算方法。
就这样,我们找到最基本、完备的运算方法集,它们就是“与”“非”和“异或”!
再qiodomadei!这只是最基本、完备的运算方法集“之一”。“与或非”三者同样可以构成最基本、完备的运算方法集。我们去掉了“或”留下了“异或”,同样可以去掉“异或”留下“或”(就好像加减法任取其一都可以),因为第4列可以写成第2列和第3列的或,也就是(A and (not B)) or ((not A) and B)。
那我们就用“与或非”作为二进制系统的基本运算方法集吧,这样大家比较习惯一点。
千辛万苦啊!终于把二进制系统里最基本、完备的运算方法集找出来了!看我用的方法多高深!穷举法……
3. 总结
就这样,我们设计出了信息的基本表示方法(二进制)和处理方法(与或非),我们可以扛起锄头去造计算机了!开黑五杀上王者再也不是梦!
现在是1016年,谁去给我造个二极管先……
最最本质的原因是 TTL 和 CMOS 电路有逻辑电平!
CMOS逻辑电平是这么规定的:
(0~1/3)VDD表市低电平即逻辑 0。
(2/3~1)VDD表市高电平即逻辑 1。
绝大多数 CPU 用的是 CMOS 电路,优点是体积小便于集成,功耗低散热少,成本低便于市场推广,速度虽略慢于 TTL,但是随着工艺改进,差距也越来越小!
而VDD 这个核心工作电压可是越来越小了,已经低到 1V 了,因为主频越来越高了……这源于 CPU 的动态功耗正比于电压平方*工作频率………
其实也有 TTL 的 CPU,但是因为 TTL 虽然速度快,不过体积大,功耗高,集成比较困难,老外有做成 4bit CPU 的,你可以放狗搜搜……
手机打字麻烦……细讲会涉及很多数电/模电知识/体系结构的姿势,再多我也不会,哈哈………就酱!
计算机能读懂0和1,靠的是人类强悍的电路设计能力。计算机本来只懂得电流的有无的状态,但人类懂得二进制计数法,人类懂得电流的两种状态可以用二进制数字中的0和1来表示:当一个电路中,有电流的时候代表1,无电流代表0。所以,人可以通过开关把用01代表的信息输入电路之中,然后通过设计不同的电路,通过构造不同的逻辑门,让电路输出我们想要得到的结果。所以在外行人看来,计算机很厉害,可以计算,可以读懂人类的指令,但实际上这些结果是人类自己设计的电路运行之后的必然结果。所以计算机没什么了不起的,计算机内部凝结着的人类智慧才是最了不得的。
拿加法举例
计算二进制数字0110 和0111的和,人通过开关输入0110和0111这两个数字,计算机是如何得到1101这个结果的呢? 答案就在逻辑门里。
首先我们把两个二进制数字的求和分解为求和和进位两个部分:
比如1+1,它的求和部分的结果为0,进位部分的1,所以结果是10。如果是0+1,那求和部分为1,进位部位为0,结果就是01。
进位的结果可以反应在与门电路中。而求和的结果则反映在异或门里。拿异或门的电路举例,它的构造如下:
在这个电路中,如果左边上下两个输入状态一致,后边的输出就为0。如果连个状态不同,输出结果就是1,也就是说有电流。
接下来我们把异或门和与门两个电路并联起来,这样我们就完成了两个二进制数字A和B的加和:
以上电路叫做半加器,但是半加器只能实现两个各位的数字求和,对于位于第二位的数字还需要有来自前一位的进位输入,所以这个时候通过再添加一个半加器,就得到了下图中的全加器:
把上面的图简化:
而要实现多个位数之间的求和,只要把多个全加器联合起来就可以了,比如下图是8个二进制数字的加法器:
也许是这提问本身就有问题,题主想问的并不是为什么电脑能读懂0和1。
而是,凭什么是0和1。
这样就好解释了,没有那么多电路图,我也能给你讲明白。
其实,所谓的0和1,并不是真正意义上的0和1。
它可以叫
阴和阳
天和地
风和雷
你和我
开和关
是的,0和1只是一个代名词,真正代表的是,两种不同的状态。
太极生二仪,二仪生四象,四象生八卦
有了两种不同的状态后,就可以模拟出万物。
所以,你去看所有不同类型的存储器,它们通过不同的方式去存储所谓的0和1。
比如用
高电平 和 低电平 代表0和1
高电平和低电平 就是两种不同的状态,仅此而已。
任何类型的存储器,都是用一种状态来代表0,另一种状态代表1
两种状态通过特定的形式能够发生相互转变。
存储器懂什么叫0和1吗?
肯定不懂!它只是一个有两种不同状态的物质,人类给它赋予了0和1的意义。
那么电脑懂什么叫0和1吗?
肯定不懂!它只是一台只会干固定工作的机器,而0和1就是控制它干什么活的的代号罢了。0和1可以用任何两个不同的符号代替。比如傻和逼…
如果当时0和1不叫0和1,题主的问题应该可能改成
《为什么电脑能读懂…傻…逼》
0、1就是高低电平。
因为电子根据它的物理特性,它会从负极
跑到正极,所以电子就像绵羊一般在人类给定好的逻辑电路中从起点(输入)被赶到到终点(输出)。
先有编码的概念,即把一种东西按照约定俗成的方式传达一种信息,它不仅应用于计算机,还应用于我们的日常生活,比如不同语言之间的翻译,比如在黑夜用手电筒有间隔有顺序的关与开在两个被关在房间里无法出去的小孩之间传递信息。
比如用0(手电筒关)表示好、1(手电筒开)表示不好。
又比如用101(开关开)表示感谢、10(开关)表示讨厌。
一对元素。
可以传递两种信息。
两对就能传递四种。
以此类推。
用有限个元素的不同组合传递无限的信息。
在有人们用铁丝缠绕金属棒通电后产生的磁力,发明了摩尔斯电报机,以及摩尔斯电码。
紧接着是运用电路进行简单的布尔运算。
在之后是各种各样的逻辑门紧接着创造了全加器和半加器——可以进行简单的加减运算。
到乘除。
到各种汇编语言。
到各种软件。
并伴随着集成电路及相关设备的不断发展。
才有了我们今天的计算机。
计算机从未读懂0、1。
它能做的只是在人类设定好的电路中输入和输出而已。
而电子负责给予我们明确的反馈。(以前用电灯,现在可以用显示屏,绘图仪,音响,等一切和电有关的东西给予我们多元而且真实的反馈)
仅此而已。
布尔逻辑运算—-布尔逻辑只有两个值,但数学可解问题可以转化为布尔逻辑运算求解
编码—数都可以以二进制编码。
物体—可以用数表示
物体之间的联系—-数的运算
如果一个物体可以由另外物体得到,即一个数可以用另外的数求解,则可以用计算机进行布尔求解。
计算机并不能“读懂”什么,能够读懂东西的是使用计算机的人。
但是人能够理解各种文字、公式、图片等等,因为这些都是我们人类的语言。
如何找一种属于计算机的“语言”呢。?
就找到了在通电环境中易于区分的高低电平。
但是高低电平只是两个信号,如何用两个简单信号表示那么多人类的语言呢?
所以就人为的规定(一般)高电平为1,低电平为0(既然是人为规定,当然可以是x与y,上与下balabala)。
如何让人类能够读懂0和1呢?
所以就需要翻译,发明一套人类语言与0和1的翻译方式,于是就有了二进制、有了utf-8、有了unicode等等。
这样就完成了0、1与人类语言之间的交流。
那么他是如何工作的呢。这就涉及到一门课程叫数字逻辑(数字电路)。
我们如今使用的所有的用于计算处理逻辑的芯片,都是由几个简单的“门”构成的(不是艳照门(๑˙ー˙๑)),例如与门、或门、非门、与或门等等,我们用这些最基本的门电路进行组合,可以构成加法器等基本的结构,完成加减乘除等运算。
为什么门电路就能够进行运算呢?
这就需要理解一点二进制。二进制里0011表示十进制的3,二进制0100表示十进制的4。这里如果想把这两个数相加,可以用到基本门电路里面的或门,或门的逻辑是有1得1,否则得0。所以在计算机里面的0011和0100两个数分别进入或门的两个输入端后(一位一位数的进入,因为这里的0、1都是电信号,不能同时有两个电信号(量子计算机?)),输出端会输出0111,二进制的0111用之前人类规定的翻译方法翻译成十进制就是7。是不是!!是不是!!3+4=7!!!完成了一次最简单的加法运算!!
基本门电路又是怎么实现的呢?
其实是人类需要一个能够完成这样子逻辑(有1得1,否则得0,不要忘了0、1只是高低电流)的东西,用CMOS、二极管等东西搭出来的,就比如输入一个5v和一个1v,那么会输出一个5v,所以5v就是高(1),1v就是低(0)。
其他门还有更神奇的功能哦这就需要你自己去学习咯。
所以。计算机不能读懂东西。他只是负责把人类语言通过人类规定的方式翻译成0与1,再通过人类制造的的门电路对0与1组成的数据串进行逻辑运算,最后再把得到的代表结果的0、1数据串按照人类规定的方式翻译成人类的语言给你读懂。
看呢人类还是蛮厉害的|・ω・`)
PS。人类也不仅仅有0、1的计算机哦。前苏联搞过三进制的计算机并且成功了。只是后来二进制计算机得到了天下。所以计算机也能“读懂”0、1、2哟ㄟ( ▔, ▔ )ㄏ
以上。
计算机只是人类制造的一个按照规定当时搬砖的工人。和汽车、电灯、大铁门等等并无什么本质上的区别,除非有一天实现人工智能。否则他不能读懂任何东西。
1 “读懂”表述的意思不是真的和人类读书一样“理解”,真正的情况是,目前通用的电子计算机的操作方式都是基于二进制,而二进制只用到了两个数字:0和1
2 简单讲解一下二进制。首先,我们现在的数学体系是10进制的,简单来说就是“数到10个数字就往前扩展1个位数”,而2进制就是“数到两个数字就往前扩展1个位数”。所以二进制就象这样:
0(二进制)=0(十进制)
1(二进制)=1(十进制)
10(二进制)=2(十进制)
11(二进制)=3(十进制)
……
111(二进制)=7(十进制)
所以,二进制也是可以把现在数学体系的整数完全准确地表达出来的。至于小数,不想展开说了
3 为什么要用二进制而不是十进制,或者是其他的三进制四进制?因为按照目前电子科技现状,制作基于二进制的运算电路最简单方便快捷高效便宜实用……
4 怎么“读懂”的?概括地说,计算机只能做两种工作:运算和储存。这两种工作可以完全使用一串数字来表示,只是需要预先约定一个数字使用规范,例如使用十进制:1,2,3,并且做约定,第一个1可以约定为命令计算机做“储存”操作,后面的2约定为要储存的数字,再后面的3约定要储存到的位置。这样通过CPU的电路,就能够完成“储存”这样一个复杂的工作了。当然,这里的1,2,3实际上在计算机中是以二进制的形式(0/1)运行在电路中的。
5 以上真的就是“最最基本原始的那个工作原理”了。别问我运算和储存操作怎么能搞出wow这样复杂的游戏出来,总之就是可以做得到。
5其实最最最原始来说,计算机是读不懂数字0和1的。换句话说,0和1并没有作为数字的他们所代表的意义。计算机也不过是一个把高低电平变来变去的复杂电路的集合。只是中间太复杂了,变化方式已经不是简单的带有比较纯粹的目的性的设计了,而是模块化的中间多了好几层的设计。底下的几层(可能硬件层面都是)如前几位的珠玑之言,布尔代数等方法工具是设计的理论基础,在硬件层和操作系统层之间或之上0和1才被我们用来与计算机交流。是某些设备或者程序把0和1“翻译”成高低电平进而被计算机所使用的,然而即使有这种方法,我觉得也不能说计算机读懂了这些东西。为什么我们会产生计算机能读懂的感觉?这就是中间层的神奇。
其他我觉得可能想问的东西-
为什么是0和1而不是0到9?-因为高低电平表示成两个比较方便。如果将电平分为数档,区分他们将会很难。
写到这里倒是想起来,推荐看《编码》这本书,印象中里面讲的很好。
咦后来翻回答才发现大家都推荐了这本书,nice
不过我觉得,题主的疑惑,更倾向于计算机中程序编译所产生的机器码(0/1)是如何控制门电路产生高低电平使得计算机工作的。
来自csapp的描述。
早期计算机也有10进制实现,之所以现在2进制当然是因为电路更好实现,状态数更少。不是计算机注定只懂1和0,是我们设计上采用了2进制导致它只懂1和0。
当然,最底层来说,计算机也不知道0和1,它只知道高低电平,0和1是我们人类赋予高低电平的抽象。这样来说计算机为什么能读懂1和0是不需要回答的,电路就是为了处理电信号存在的。
另一方面,通过时钟等信号控制输出的更新时刻,组成触发器锁存器等存储单元。
Ps,1和0,在计算机内部,就是不同的两种电压,因而芯片底层都是二进制表示数的。
其实简单来说,就是通过电路的高低电平与基本电路构成与非门等逻辑电路。通俗来说,计算机就是由各种逻辑构成的,他本身并不具有创新以及独立思考的能力。。
并不是计算机只能读懂0,1,而是因为在电子中用高低电平才能将信息物理化。现在有量子计算机,可以读懂0,1,-1
首先澄清一个概念,关于计算机的概念,什么是计算机?
人类发明的工具可以分为两类:第一类是手脚的延伸。诸如汽车、飞机等等;第二类是大脑的延伸。诸如算盘、手摇计算机、电子计算机等等。广义的计算机是指大脑的延伸。我们通常说的计算机,一般指“二进制电子计算机”,是狭义的,只是计算机里面一个小小的分支,虽然目前普及程度最高,但可以预见,将来一定会被其它形式的计算机取代,如同电子计算机取代算盘等一样。
前面为什么要强调“二进制”呢?因为,计算机不仅有二进制,还有其它进制的计算机。算盘等就不是二进制,即使是电子计算机,也有不是二进制的,运算放大器就是为模拟运算设计的。
电子时代,二进制与非二进制的竞争,以二进制完胜落幕。人们为什么选择了二进制?原因其实很简单——信息判读与表示,简单准确。夜深人静,隔壁一对情侣呢哝私语,你无法听清他们说话的内容,但却可以知道他们说没说话。辨识有没有声音和辨识声音的具体内容,前者简单太多了。同理,辨识有没有电压和辨识电压值是多少,前者简单太多了。信息判读如此,信息表示同样如此。
既然选择了二进制,电路自然是要按照二进制的特点来设计的,因此诞生了“数字电路”。我们知道,二进制只有两个符号,0和1,每一位只有两种状态,0或者1。据此而设计出来的电路也就只有两种状态,高电平或者低电平,用来表示二进制的两种状态,这就是“数字电路”。由于数字电路只能表示两种状态,0或者1,因此任何0和1以外的东东,必须转换成0与1的组合才能表示,比如2必须转换成10,3转换成11,……这样无论什么内容,在计算机里的最终表现形式都是0与1的组合。
因此我们说计算机只能读懂0和1。
2 是人在 条件反射的加法器(类似1 + 1 = 2)的基础上盖起的数学大厦!
从另一个角度,来解释一下这个问题。计算机不懂二进制,就像算盘不懂十进制一样。
人懂十进制四则运算,并且设计一套算盘上的操作方法,然后把算珠的排列组合解释成相应的结果数字。
同样的,人懂二进制,并且设计了电子计算机,然后把电路的状态解释成相应的结果。
所以,不一定是01代表的二进制,任何计数法都可以。只是经过实践大浪淘沙,二进制处理起来最方便,成为了剩立者。
不一定是集成电路电子计算机,任何可以表示两种状态的元件都可以。只是电子元件处理速度快集成度高能耗小等等优点,得以推广普及。
将来假如量子计算机真的能大规模普及,电子和二进制两方面,就都可能受到挑战。
至于具体高低电压表示的二进制,是用怎样的电路处理的,其他答案写的很好了。我就不重复了。
当然,计算机和算盘相比,还有一点不同。解释算盘上数字的工作,纯粹是人做的。解释计算机内部状态的工作,通常是计算机辅助做的。
计算机可以通过计算,把二进制转换成人熟悉的十进制数字。算出来一个个的数字字符,把相应的字体点阵,显示在屏幕上,或者打印出来,方便人们理解。
理解的是人,计算机只是处理的数字。从输入设备读入数字,处理之后,再输出设备上写数字。一些输入输出设备,被设计成可以正确的发送接收这些数字,而已。
……而Q(是否应该为Q补)与BL(是否应该为BL补)的预充值不同,使得BL(是否应该为BL补)经由M1与M5放电而变成逻辑0(即Q的高电平使得晶体管M1通路). ……
所以计算机本来就是能读懂1.0的,反而人能理解1.0才是一种技能。
三体中有描述,易懂
秦始皇挥手召来了三名士兵,他们都很年轻,与秦国的其他士兵一样,一举一动像听从命令的机器。
“我不知道你们的名字,”冯•诺伊曼拍拍前两个士兵的肩,“你们两个负责信号输入,就叫‘入1’、‘入2’吧.”他又指指最后一名士兵,“你,负责信号输出.就叫‘出’吧,”他伸手拨动三名士兵,“这样,站成一个三角形,出是顶端,入1和入2是底边。”
“哼,你让他们成楔形攻击队形不就行了?”秦始皇轻蔑地看着冯•诺伊曼。牛顿不知从什么地方掏出六面小旗.三白三黑,冯•诺伊曼接过来分给三名士兵,每人一白一黑,说:“白色代表0,黑色代表1。好,现在听我说,出,你转身看着入1和入2,如果他们都举黑旗,你就举黑旗,其他的情况你都举白旗,这种情况有三种:入l白,入2黑;入l黑,入2白;入1、入2都是白。”
. 然后,冯•诺伊曼又用三名士兵构建了与非门、或非门、异或门、同或门和三态门,最后只用两名士兵构建了最简单的非门,出总是举与入颜色相反的旗。
关于计算机是怎么处理高低电平的,已经有非常好的回答了。虽然理解这些回答需要很多微电子学的基础知识,我也没有什么更好的表述。
这里想就题主的前半部分问题稍微展开一下,即:计算机真的只能读懂0和1么?
换句话说:计算机(这里包括计算机内部的信号,也包括计算机对外的信号)处理的,是否只是由高低两种电平构成的信号,答案是否定的。
反例包括两方面 模拟信号和其他形式的数字信号
通过适当的电路,对模拟信号可以实现相加、相减、多路选择、积分、微分、乘法等操作。其中详细的原理不一一详述。然而通过这些操作加以组合,不难想象也可以实现对模拟量的很多复杂计算。百度百科的”模拟计算机“条目提供了一些相关的信息。
模拟计算机被数字计算机取代,一方面因为CMOS电路优秀的集成性能,另一方面也是因为模拟电路中误差的产生和累积几乎是难以克服的。
在个人计算机中,基本上只有输入/输出的时候会有模拟信号的存在了,比如VGA接口中的视频信息,就是以模拟信号的形式表示的。在通讯中,有时也需要依照介质和协议的特性,将数字化的信息转换成经过调制的信号,在接收的时候再转换回来。
另外一方面是数字信号,是否一定会表现为高低电平的形式,也未必然。多值的信号(比如0V表示0,1v表示1,2v表示2……)也未必是不可行的,虽然这样提高了在一个时间间隔上的信号量,但是也增加了处理起来的复杂性。至少在高速运转的CPU中,似乎不是一个好主意。那么能否在储存器(比如硬盘上),让磁畴变成四种状态而不是两种状态呢?前者也并非物理原则上不可行,但是想必存在一些实践中的缺点。而在新型的储存器中,有一些于多值储存的研究,即让一个单元储存多于一个bit的信息。如果将来这样的储存器得到应用,那计算机中就不止有0和1了(虽然还是可以转换成0和1……)
计算机通过理解"一个萝卜一个坑原理"来认识数字! 不过要知道,这个坑和萝卜是人提供的! 举个例子:你自己设计了一个计算机,想打出来字母a,你需要两个步骤:
1.你就必须事先需要给字母a挖个坑,假如这个坑是10101010,这样就把字母a和10101010对应起来。
2.好,现在坑挖好了,你要打出字母a了,你现在只需要按照你之前挖挖好的坑,也就是10101010排列的数字,给计算机这样一个信号,计算机就会去找这和叫10101010的坑,找到以后一看坑里是个a,计算机就把这个字母拿给你看了。
想打字母b:
1.挖坑10101011(数字发生变化)
2. ……
想打c:
1.挖坑01010101(数字顺序变化)
2. ……
我就是感慨吐槽一下,要看具体有营养的,见楼上各位大神的回答,
折叠我吧~
有本书叫编码的奥秘。用莫尔斯码来做引子
还有就是,硬件,半导体的发展也反过来推动了这个趋势。因为半导体说简单点就像一个非机械控制的开关,可以有两种状态,正好就用来表达0和1了
原文链接:https://www.zhihu.com/question/20112194
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137328.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...