1.0.1.8和1.0.1.9这两个升级补丁怎么用找不到

1.0.1.8和1.0.1.9这两个升级补丁怎么找不到_百度知道|  
|  
|  
|  
|  
只需一步,快速开始
查看: 2054|回复: 3
【版本补丁】看到12号补丁是1.9.32.0.8的和v1.9.32.0的有啥区别么?还是一样的?
主题帖子积分
中级玩家, 积分 204, 距离下一级还需 46 积分
中级玩家, 积分 204, 距离下一级还需 46 积分
v1.9.32.0我是TESV.exe的属性里看的???应该没错吧???我能打12号补丁么?
主题帖子积分
愿时光安好
金元128481
好像一个是测试版。一个正式版。
主题帖子积分
中级玩家, 积分 204, 距离下一级还需 46 积分
中级玩家, 积分 204, 距离下一级还需 46 积分
情雅淡墨 发表于
好像一个是测试版。一个正式版。
那我能打12号补丁吗?
主题帖子积分
中级玩家, 积分 204, 距离下一级还需 46 积分
中级玩家, 积分 204, 距离下一级还需 46 积分
情雅淡墨 发表于
好像一个是测试版。一个正式版。
3DM汉化专家
3DM各汉化组成员,工作成绩突出
女性会员(包括版主)独享,活跃于论坛并有一定知名度,在各种场合中经常欺凌异性的
中秋活动勋章
大型活动中大奖两次以上
Powered by从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理
更新:承蒙大家抬爱,这篇一年多前的回答上日报了,为了避免误导还是注明一下,文章的目的是尽可能以最简单的语言让非微电子专业的读者能对芯片的工作原理有感性的认识,有高中物理和化学知识就能顺利读完,因此许多过程描述进行了简化、并不专业,也没有采用太多术语以避免诘屈聱牙之嫌,希望是如果能有一点科普作用那就极好了。原文:关于计算机为什么能读懂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=11+1=00+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起到一个占位的作用。在Si表面生长一层很薄的SiO2,然后在上面覆盖一层Si3N4。这里Si3N4起到一个占位的作用。涂抹光刻胶并烘烤,用紫外线透过掩膜进行光刻。涂抹光刻胶并烘烤,用紫外线透过掩膜进行光刻。没有被掩膜黑色区域保护的光刻胶部分就被去掉了,留下了被保护的部分。没有被掩膜黑色区域保护的光刻胶部分就被去掉了,留下了被保护的部分。干法刻蚀,就是离子刻蚀,没有光刻胶保护的部分被高能离子打掉了,从而形成了凹槽。干法刻蚀,就是离子刻蚀,没有光刻胶保护的部分被高能离子打掉了,从而形成了凹槽。去除残留的光刻胶并清洁硅晶圆。去除残留的光刻胶并清洁硅晶圆。在晶圆上沉积一层较厚的SiO2,因为是沉积得到的,表面很不光滑。在晶圆上沉积一层较厚的SiO2,因为是沉积得到的,表面很不光滑。通过CMP(化学机械研磨),将不光滑的表面磨平。通过CMP(化学机械研磨),将不光滑的表面磨平。这时用能溶解Si3N4的溶液将Si3N4去除。之前提到,Si3N4是占位的作用,它去除后,SiO2的高度就略高于晶圆表面了,这也是为了起到更好的保护隔离作用。这时用能溶解Si3N4的溶液将Si3N4去除。之前提到,Si3N4是占位的作用,它去除后,SiO2的高度就略高于晶圆表面了,这也是为了起到更好的保护隔离作用。2、
生长阱。阱就是之前介绍MOS管时的***区域,作用之前也提到过了,是为了形成N-P(阱)-N或者P-N(阱)-P这样的结构。首先还是光刻,用掩膜留下跟需要刻蚀图形相同的部分光刻胶。进行离子注入。假设我们是要制作NMOS,那么就注入正离子(形成P阱)。注意没有被光刻胶保护的部分会注入,而被光刻胶保护的部分就不会注入到了。进行离子注入。假设我们是要制作NMOS,那么就注入正离子(形成P阱)。注意没有被光刻胶保护的部分会注入,而被光刻胶保护的部分就不会注入到了。去除光刻胶并清洁表面。去除光刻胶并清洁表面。退火,主要目的是为了让离子在硅晶圆中更好地扩散,形成合适尺寸的阱。退火,主要目的是为了让离子在硅晶圆中更好地扩散,形成合适尺寸的阱。3、
制作栅(Gate)。Gate就是控制Source和Drain是否导通的部分,一般材质是多晶硅,现在有时也用其他材质了。先对晶圆做一下清洁。在晶圆上覆盖一层多晶硅。注意,要覆盖只能是晶圆表面全部覆盖,因为尺寸太小在这一步不能可能控制它的覆盖部分,只能在后续工艺中用光刻去除不需要覆盖的部分。还是涂抹光刻胶,用紫外线透过掩膜照射,留下一部分。还是涂抹光刻胶,用紫外线透过掩膜照射,留下一部分。湿法刻蚀,把没有被光刻胶保护的多晶硅去除。湿法刻蚀,把没有被光刻胶保护的多晶硅去除。去除光刻胶并清洁。这样就留下了我们需要的多晶硅部分了。不过这一部分形成的多晶硅层还不是Gate用的多晶硅,这个叫做牺牲层,主要是为了形成真正的Gate垫背用的。原因是由于Gate的尺寸很小,目前刻蚀工艺无法形成特别精确的矩形图形,所以使用了两步工序,这一步形成的多晶硅还会在以后被刻蚀掉,具体原理不再赘述。去除光刻胶并清洁。这样就留下了我们需要的多晶硅部分了。不过这一部分形成的多晶硅层还不是Gate用的多晶硅,这个叫做牺牲层,主要是为了形成真正的Gate垫背用的。原因是由于Gate的尺寸很小,目前刻蚀工艺无法形成特别精确的矩形图形,所以使用了两步工序,这一步形成的多晶硅还会在以后被刻蚀掉,具体原理不再赘述。再次覆盖一层多晶硅。再次覆盖一层多晶硅。覆盖一层电极物质,一般是金属(比如Al)。覆盖一层电极物质,一般是金属(比如Al)。涂抹光刻胶并刻蚀光刻胶。涂抹光刻胶并刻蚀光刻胶。栅离子注入。没有被光刻胶保护的多晶硅部分就被注入了离子了,这是为了增强Gate的导电性。栅离子注入。没有被光刻胶保护的多晶硅部分就被注入了离子了,这是为了增强Gate的导电性。去除光刻胶并清洁。继续涂抹光刻胶并刻蚀光刻胶。注意这一步形成的图形就是栅真正的结构了。继续涂抹光刻胶并刻蚀光刻胶。注意这一步形成的图形就是栅真正的结构了。干法刻蚀。没有被光刻胶保护的金属(***部分)和多晶硅(表面红色部分)就被高能离子轰击掉了,留下了我们需要的栅结构。干法刻蚀。没有被光刻胶保护的金属(***部分)和多晶硅(表面红色部分)就被高能离子轰击掉了,留下了我们需要的栅结构。去除光刻胶并清洁。去除光刻胶并清洁。在栅上覆盖一层氧化层(紫色部分),这是为了在下一步离子注入时保护栅。到这一步,栅(Gate)就制作完成了。在栅上覆盖一层氧化层(紫色部分),这是为了在下一步离子注入时保护栅。到这一步,栅(Gate)就制作完成了。4、
在阱上制作Source和Drain的低掺杂部分。由MOS结构图可知,Source和Drain之间有一个N-P-N(或P-N-P结构)。之前在制作阱的时候,我们把中间的这个部分(也就是阱)制作完成了,现在就是制作两边的部分。4、
在阱上制作Source和Drain的低掺杂部分。由MOS结构图可知,Source和Drain之间有一个N-P-N(或P-N-P结构)。之前在制作阱的时候,我们把中间的这个部分(也就是阱)制作完成了,现在就是制作两边的部分。首先还是光刻,留下部分光刻胶。离子注入,被光刻胶和栅保护的部分是注入不到离子的,而中间两块区域就被注入了和阱的极性相反的离子了,于是就形成了N-P-N或P-N-P的结构。离子注入,被光刻胶和栅保护的部分是注入不到离子的,而中间两块区域就被注入了和阱的极性相反的离子了,于是就形成了N-P-N或P-N-P的结构。去除光刻胶和保护层并清洁。去除光刻胶和保护层并清洁。5、
形成栅两旁的保护层。这是为了防止栅和源、漏之间由于量子隧穿效应形成漏电流。用SiO2保护就可以了。5、
形成栅两旁的保护层。这是为了防止栅和源、漏之间由于量子隧穿效应形成漏电流。用SiO2保护就可以了。沉积一层SiO2和Si3N4。直接用高能离子轰击表面,控制轰击的时间,从而就把大部分SiO2保护层去掉了,留下了栅两边的比较厚的部分。直接用高能离子轰击表面,控制轰击的时间,从而就把大部分SiO2保护层去掉了,留下了栅两边的比较厚的部分。清洁表面。从以上步骤我们也可以看出,清洁表面。从以上步骤我们也可以看出,之所以MOS工艺中要用一步步复杂的光刻、刻蚀、沉积,主要原因就是因为器件太小了,没办法直接进行机械加工操作,只能通过化学或离子轰击的方法来制作,但是这些方法又只能针对一个表面,所以需要用光刻胶和掩膜板来一次次地制作保护区域,形成我们要制备的图形。6、制作Source和Drain的高掺杂部分。之所以在制作Source和Drain时要分为高掺杂和低掺杂两块区域,是为了使用所谓LDD(轻掺杂漏极)技术,来抑制短沟道效应带来的Source和Drain之间的漏电流,并且提高MOS器件的横向耐压。首先还是上光刻胶并刻蚀出图像。低掺杂的离子注入,形成了两边的亮蓝色区域。低掺杂的离子注入,形成了两边的亮蓝色区域。去除光刻胶并清除。去除光刻胶并清除。退火,使掺杂离子稍扩散。这样高掺杂和低掺杂区域共同构成了源和漏。退火,使掺杂离子稍扩散。这样高掺杂和低掺杂区域共同构成了源和漏。7、
金属硅化物的制备。主要是用来连接Gate和电极的,导电性介于金属和多晶硅之间。7、
金属硅化物的制备。主要是用来连接Gate和电极的,导电性介于金属和多晶硅之间。首先是清洁表面。在表面覆盖一层金属硅化物。在表面覆盖一层金属硅化物。退火。退火。通过刻蚀等方法将不需要的金属硅化物部分去除,留下连接栅的那部分。通过刻蚀等方法将不需要的金属硅化物部分去除,留下连接栅的那部分。再次退火。到这一步金属硅化物(栅到电极的连接部分)就制作完成了。栅的形状是L形,之后会在L的尾部连接金属电极。再次退火。到这一步金属硅化物(栅到电极的连接部分)就制作完成了。栅的形状是L形,之后会在L的尾部连接金属电极。8、制作接触电极。栅、源、漏的硅部分已经制作完成了,现在要把它们用金属导线引出来,这样才能连接到电路中去。8、制作接触电极。栅、源、漏的硅部分已经制作完成了,现在要把它们用金属导线引出来,这样才能连接到电路中去。首先覆盖一层SiO2和Si3N4。这是MOS管和上层导线的隔离层。涂抹光刻胶,在光刻胶上形成几个穿孔。前面两个是用来连接源和漏的,后面那个是用来连接栅的。涂抹光刻胶,在光刻胶上形成几个穿孔。前面两个是用来连接源和漏的,后面那个是用来连接栅的。干法刻蚀。用高能离子轰击晶圆表面,上一步形成的3个穿孔下方由于没有保护,SiO2隔离层就被击穿了,栅、源、漏就被暴露了出来。干法刻蚀。用高能离子轰击晶圆表面,上一步形成的3个穿孔下方由于没有保护,SiO2隔离层就被击穿了,栅、源、漏就被暴露了出来。去除光刻胶并清除表面。去除光刻胶并清除表面。在表面沉积一层金属,这样金属就填充了穿孔,从而连接了栅、源、漏,将它们引了出来。在表面沉积一层金属,这样金属就填充了穿孔,从而连接了栅、源、漏,将它们引了出来。CMP工艺,打磨掉表面多余的金属。CMP工艺,打磨掉表面多余的金属。清洁表面。清洁表面。9、制作金属层。这一层就完全根据电路设计中的引线来制作了,使用的金属材质和图形都是因设计而异的。首先沉积一层介电层(就是绝缘层,用来隔离)。光刻出跟需要制备的金属层图形相同的光刻胶层。干法刻蚀,用高能离子轰击,刻蚀掉不需要的介电层。去除光刻胶并清洁。覆盖一层金属,这层金属填充到了介电层被刻蚀出的凹槽中,连接到了下方的金属电极。CMP工序,去除掉表面多余的金属。清洁表面。然后就是根据电路结构继续制作金属互联层,一层层地连接到外部电路中去。一般一个简单的芯片需要10-20层互联结构。最后就是将芯片打上与外部电路连接的电极,一块完整制作好的晶圆就产生了。一般一块晶圆上会有几十块芯片,把芯片切下来就可以测试、封装、使用了。如此,一块芯片就制作完成了。计算机通过以高低电压形式表示的1、0状态作为输入,在芯片上的千千万万个MOS管的作用下,得到同样是以电压形式表示的输出,然后通过以电压驱动的输出设备(比如显示器)显示给用户。整个过程其实是利用了电子的物理特性和极其精妙的器件组合,获得了一个“自动化”的处理方式。
这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算?&br&我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答,大家也只是解释了一部分问题,没有完整的把计算机整个的抽象层次说清楚。在大学里我看到了 Charles Petzold的《编码
隐匿在计算机软硬件背后的语言》,这部永不退色的计算机经典著作,为了讲明白了这件事儿,今天我决定用自己简略的话,回顾一下作者写作的思路,用我的理解为大家讲述计算机的工作原理。希望我能够完成。&br&&br&今天的计算机已经变得相当复杂,是有史以来人类创造的最复杂最精密的仪器,没有之一,是二十世纪技术领域的“登峰造极之作”,计算机与生俱来的层次化体系结构,掩盖了技术背后最本质的东西,现在已经很少有人去关心计算机最本质的工作原理,我希望能剖析计算机一层层‘“抽象”面纱,展现最本质的“计算”过程。基本的知识基础是高中物理,高中数学。&br&&br&&br&第一节 计算器&br&&br&下面回到高中课堂,我依稀记得在电磁学那一部分,讲到了电磁继电器,当时老师说,继电器是很重要的发明,我打开物理课本,“什么破东西嘛”,太简单了,那时候觉得像继电器这样的发明没什么用。高中数学中也讲到,布尔代数,简单老说就是,与、或、非,而且教科书上说,布尔代数意义重大云云。下面问题来了,我只用继电器能不是实现简单的计算器?注意是“计算器”,而不是计算机,***是肯定的,来,那就看看,如何用继电器打造出一个”计算器“,进而打造出一台”计算机“&br&&br&&img src=&/1fcd5eebb66_b.jpg& data-rawwidth=&991& data-rawheight=&422& class=&origin_image zh-lightbox-thumb& width=&991& data-original=&/1fcd5eebb66_r.jpg&&两个继电器串联,点亮一盏灯,这算不算实现了“与”的操作呢?两“真”为”真“&br&&br&&img src=&/5d53b4b54c655ee27b1e8c_b.jpg& data-rawwidth=&1018& data-rawheight=&490& class=&origin_image zh-lightbox-thumb& width=&1018& data-original=&/5d53b4b54c655ee27b1e8c_r.jpg&&两个继电器并联,点亮一盏灯,是不是实现了”或“的操作?一真为真&br&&br&&img src=&/0c6a6c0b33ad91d0c399d55fd662da97_b.jpg& data-rawwidth=&1081& data-rawheight=&413& class=&origin_image zh-lightbox-thumb& width=&1081& data-original=&/0c6a6c0b33ad91d0c399d55fd662da97_r.jpg&&一个继电器本身就可以实现”非“的操作&br&&br&这样一来,物理上的继电器,和布尔代数,完美的融合起来,我把与或非门继电器实现称作”物理层“,每张图右边的符号表示,称作”布尔逻辑层“,从”物理层“到”布尔逻辑层“是我们的第一层抽象,很简单吧?(当然现代计算器从物理实现到逻辑实现,已经使用继电器,而是在硅芯片上雕刻一个个的晶体管,但晶体管的数量绝对不会减少,这一点@丁旭 已经说得很明白) &br&&br&接下来可能有人问,你整这些小儿科的东西,有什么用呢?别急,看我慢慢展开!&br&&br&我们知道,布尔代数是一种数学,既然是在一种数学,那么存在数学运算啊,数学运算能用继电器实现吗,of course&br&&img src=&/df0c9b68c81acddbc64bae_b.jpg& data-rawwidth=&1245& data-rawheight=&582& class=&origin_image zh-lightbox-thumb& width=&1245& data-original=&/df0c9b68c81acddbc64bae_r.jpg&&一个或门,一个与非门,一个与门,按照图示连在一起形成了一个最常见的运算,异或运算,”相同为假,不同为真“,那物理实现上怎么做呢?请在大脑中想想怎么连线,一共七个继电器就可以实现,有了异或运算,我们就可以实现更复杂的运算,下面就和我们实现一台”计算器“直接相关了&br&&br&&img src=&/f895be5fdc8725ffc9f188eac4beef38_b.jpg& data-rawwidth=&976& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&976& data-original=&/f895be5fdc8725ffc9f188eac4beef38_r.jpg&&一个异或门和一个与门,形成一个”半加器“,图示下边的符号表示一个半加器,这里是新一层的抽象,从布尔逻辑运算到”计算器件“的抽象&br&&br&&img src=&/698a1aae7a4e46bab7f75b_b.jpg& data-rawwidth=&1202& data-rawheight=&577& class=&origin_image zh-lightbox-thumb& width=&1202& data-original=&/698a1aae7a4e46bab7f75b_r.jpg&&有一个半加器,距离我们实现手工打造一个”计算机“还很远,然而两个半加器,一个或门,可以实现一个”全加器“,为什么叫全加器呢?因为我们使用它可以实现一位加法的计算!(这里是二进制,问题的题目,为什么计算机能读懂”0“和”1“,看到这里是不是心头一喜呢?)&br&&br&&img src=&/b0e15c8c39ec1_b.jpg& data-rawwidth=&1097& data-rawheight=&601& class=&origin_image zh-lightbox-thumb& width=&1097& data-original=&/b0e15c8c39ec1_r.jpg&&有了一位”全加器“,我们实现8位加法的计算还远吗?当然不远,8个全加器,按图示相连,就可以实现8位加法计算(和我们在纸上进行加法运算很像,进位的操作很显然。当然,这里都是进行二进制加法),右下方是8位加法器的表示方式。&br&&br&要是这会儿在19世纪,在电力革命的年代,我一定要亲手打造一个计算器!&br&&img src=&/abcfb25ca278b6e76fd1be5_b.jpg& data-rawwidth=&1164& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&1164& data-original=&/abcfb25ca278b6e76fd1be5_r.jpg&&画的比较简陋,见过卡车上的按钮吗?上下拨动的那种,这是我穿越回19世纪站在专利局门口,阐述我”伟大”的发明,“我发明的计算器,有两排输入按钮,每个按钮上下拨动表示输入的是0或者1,最下排是9个灯泡,灯泡的亮与灭,指示这一位是0,还是1,我的发明是划时代的,可以把人类从繁杂的计算过程中解救出来...”&br&&br&“什么?就因为我的计算器不能实现减法运算儿拒绝我的专利申请,减法运算?减法运算,怎样实现计算机的减法运算呢?”&br&&br&计算机发展过程中,最重要的思想是“抽象”,一层层的抽象封装了实现的细节,使的计算机开发人员更关注与逻辑的实现,相信有了我上面的表述,读者应该能看懂下边的抽象思想:&br&&img src=&/c48d5ad5b23a47402bddfd269bd073a4_b.png& data-rawwidth=&700& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/c48d5ad5b23a47402bddfd269bd073a4_r.png&&这个电路实现了把输入的数据取反(0-&1,1-&0)&br&&img src=&/efa7a48ff632c3bbdc403_b.png& data-rawwidth=&546& data-rawheight=&228& class=&origin_image zh-lightbox-thumb& width=&546& data-original=&/efa7a48ff632c3bbdc403_r.png&&这是求补器的“抽象”&br&&br&减法的逻辑实现我直接给出,相信读者也应该能看明白&br&&img src=&/4bda23f057aa9c2306872_b.png& data-rawwidth=&669& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&669& data-original=&/4bda23f057aa9c2306872_r.png&&我还清楚的记得,在计算机组成这门课上,老师讲述,原码和补码概念,“在计算机内部,正数的补码是它本身,负数的补码,记得取反加1“,为什么取反加1呢?看看上边的实现,计算机内部如何实现减法?有个取反操作,还有个进位操作,这不正是”取反加1“吗?&br&&br&下面从逻辑实现层,回到物理层,思考下,需要多少继电器才能实现这样的 ”小发明“,算了,吓一跳吧?然而我们的计算机先驱康拉德?楚泽花费了十年心学,3000多个继电器才早出一个计算机原型,所以,,,本着向先哲致敬的精神,让我们在大脑中”打造出“一台计算机&img src=&/deb93fdac708c_b.png& data-rawwidth=&686& data-rawheight=&283& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&/deb93fdac708c_r.png&&”我的专利不仅仅能实现加法操作,也能实现减法操作,计算具有普遍性,具有划时代的意义,可以把人类从复杂的计算中解救而出来...“&br&&br&至此,我们实现了一个简单的计算器实现,不难吧?然而这才只是万里长征的第一步。&br&&br&接下来我来说说,计算机是如何存储信息的,这真是个费力活儿,在不太遥远的过去,二十年前,计算机的存储量还非常有限,我记得初中那会儿还没有MP3,用磁带听歌,直到最近,存储技术才有了长足的进步,当然这是后话。&br&&br&第二节,计数器&br&&br&人类的感官,听觉,触觉,味觉,视觉,感官***接受外界的刺激,在大脑中留下神经信号,进而形成对“外部世界”的认识,那抽象的事物怎么去认识呢?&br&&br&电灯通电点亮灯泡,高中的物理知识解释,足够了。电可以让物体运动,这个道理人人都懂。坐在回家的高铁上,让我想想一下高速列车是如何运动的:驾驶员按下通电按钮,带动电车引擎,电车引擎通过传动装置把牵引力传给电车车轮,列车得以启动。高速列车的动力系统也相当复杂,我不了解每一个实现的细节,但是我可以想想出电车引擎的工作原理,为什么?因为这些都是实实在在的实物,看得见摸得着。那我想想出计算机的工作原理吗?***是不能,为什么?因为计算机一层层的“抽象”,一个小小的物理器件上集成了上亿的基本元器件,使计算机真正的工作原理是我们越来越遥远。&br&&br&下面还让我们回到19世纪末,二十世纪初,那个激荡人心的电力革命的年代,让我们去还原真实的技术实现过程。回到高中物理课堂&br&&br&我们已经讲解了如何去制造一个一台简易的“计算器”,不知不觉下课了,这时我听到一阵刺耳的下课铃声。电铃和计算机有关系吗?我直接上图吧&br&&br&&img src=&/ccab_b.jpg& data-rawwidth=&500& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/ccab_r.jpg&&&br&注意看旁边的那个金属小锤子&br&&br&&img src=&/efbc42bb94d00e4ae80eb5_b.png& data-rawwidth=&570& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&/efbc42bb94d00e4ae80eb5_r.png&&电铃的工作原理如上图所示,大家想象下,电铃的小锤子震荡起来敲打金属盖发出声音的情形,duang,duang,daung,形象吧?(这种电路叫做震荡器)&br&&br&&img src=&/a324e541ffe65a6faf82b2_b.png& data-rawwidth=&513& data-rawheight=&168& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&/a324e541ffe65a6faf82b2_r.png&&振荡器是不是可以实现计数功能呢?交替的输出0和1,哈哈,感叹造物的神奇吧!&br&&br&下面我们再来看一些神奇的电路,当初的先驱们是怎么想到这些复杂而精致的设计&br&&img src=&/b6e75df9b37dbd5afaa343_b.png& data-rawwidth=&614& data-rawheight=&216& class=&origin_image zh-lightbox-thumb& width=&614& data-original=&/b6e75df9b37dbd5afaa343_r.png&&闭上上方的电路,灯亮了&br&&img src=&/0d6a50c628f05d316bf3c_b.png& data-rawwidth=&582& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&/0d6a50c628f05d316bf3c_r.png&&断开上方的电路,灯依然在亮&br&&img src=&/35e969d3c178a380f62b5cb8f6375270_b.png& data-rawwidth=&499& data-rawheight=&199& class=&origin_image zh-lightbox-thumb& width=&499& data-original=&/35e969d3c178a380f62b5cb8f6375270_r.png&&闭合下方电路,灯灭了&br&&img src=&/92b6eaf9db307a7_b.png& data-rawwidth=&488& data-rawheight=&187& class=&origin_image zh-lightbox-thumb& width=&488& data-original=&/92b6eaf9db307a7_r.png&&断开下方的电路,灯依然不亮&br&&br&电路的奇特之处在于:同样是在开关都断开的状态下,灯泡有时候亮,有时候不亮,当开关都断开时,电路有两个稳定状态,这类电路叫做“ 触发器”。(英国物理学家1918在工作中发现的)&br&&br&触发器电路可以保持信息,确切的说,可以“记忆”某些信息,他可以“记忆”那个开关先闭合。触发器是一个大家族,大家要是有兴趣可以去看相关资料。请记住一点!触发器是用来“记忆”信息的,我再给出两类常用的触发器&br&&img src=&/8f1fa6ecea31_b.png& data-rawwidth=&517& data-rawheight=&247& class=&origin_image zh-lightbox-thumb& width=&517& data-original=&/8f1fa6ecea31_r.png&&这个叫做“D型触发器”,具体实现如上图,我们的表示一直都停留在很“底层”,一直都很关注实现的细节,随着细节实现越来越多,我们需要上升到高一层的层次,更加关注功能的实现,而不是陷于细节实现的泥潭!(想一想,为什么说,计算机具有与生俱来的层次结构)&br&&br&数据端简写为D,时钟端简写为Clk,功能表如下:&br&&img src=&/eb33d69de15ff30fcda3b0d_b.png& data-rawwidth=&248& data-rawheight=&194& class=&content_image& width=&248&&脑袋里想象下,触发器是一个很听话的孩子,当clk端通电时,相当于告诉孩子,“孩子啊,你要记住我传给的信息”,clk断电时,孩子在自由自在的玩耍,完全不接受任何传过来的指令,很形象,不是吗?&br&&br&在D型触发器的基础上实现了更复杂的功能,“ 边缘触发的D型触发器”&br&&img src=&/c935dbb047ae91a8ddd145011eeb7dee_b.png& data-rawwidth=&587& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&/c935dbb047ae91a8ddd145011eeb7dee_r.png&&“抽象”图&img src=&/e81dfaf7af19_b.png& data-rawwidth=&156& data-rawheight=&91& class=&content_image& width=&156&&again,抽象的思想,使我们脱离的细节实现(上图),更加关注功能&br&&img src=&/6f72ffb9fce_b.png& data-rawwidth=&220& data-rawheight=&145& class=&content_image& width=&220&&向上的箭头,表示电信号从0到1变化的那一瞬间有效,再次在脑袋里想象下,触发器是一个很听话的孩子,当clk从0-&1变化时,相当于告诉孩子,“孩子啊,赶紧接住我给你的球,球在这里指信息”,其他状态下,孩子在自由自在的玩耍,完全不接受任何传过来的指令。&br&&br&有人问,说了这么多,到底想干什么?好的,告诉你,用这些可以实现一个计数器,记得小孩子学数数吗?我们要做的的就是要用机器来从0开始数数,真的吗?恩,离这一步已经很近了,不信看下边&br&&img src=&/fd8fa89f2ff60fbff7ba9f_b.png& data-rawwidth=&369& data-rawheight=&156& class=&content_image& width=&369&&&br&简单的,把振荡器和触发器相连&br&&img src=&/232f79df6e2e612d67f3bc2bd779dafc_b.png& data-rawwidth=&518& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&/232f79df6e2e612d67f3bc2bd779dafc_r.png&&&br&电平信号的变化&br&&br&稍微扩展一下,实现更复杂的功能,应该能看明白吧&br&&img src=&/65c84dbb7a2ad9ca691aff_b.png& data-rawwidth=&528& data-rawheight=&179& class=&origin_image zh-lightbox-thumb& width=&528& data-original=&/65c84dbb7a2ad9ca691aff_r.png&&电平信号的变化(标上0和1)&br&&img src=&/cb7db76c286e_b.png& data-rawwidth=&594& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&/cb7db76c286e_r.png&&嗨嗨,清醒下,我们得到了什么?把上图顺时针旋转90度,你发现了吗&br&&img src=&/ae382b0ce95c316b8eeb4e2_b.png& data-rawwidth=&354& data-rawheight=&461& class=&content_image& width=&354&&这不就是在计数吗?用二进制的方式计数!&br&&br&把8个触发器连接在一起,然后放入一个盒子里,构成了一个8位计数器,能从0数数到2^8-1,(0-255),这个计数器称为“8位行波计数器”&br&&img src=&/dc95beb4ba_b.png& data-rawwidth=&477& data-rawheight=&167& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&/dc95beb4ba_r.png&&现在,我们已经懂得如何继电器来做加法、减法、计数了,这一件很有成就感的事儿,使用的技术也是100多年前就存在的技术。&br&&br&第三节 存储器&br&&br&我想用继电器打造一个存储量为64K x 8的存储阵列,我能实现吗?这会儿可是在二十世纪初!如果我穿越回那个年代,一定会再次为我的“发明”申请专利,如果真是这样,那计算机的发展史上会留下我的名字(呵呵,意淫一下),下面就看看我是如何实现我的“发明”吧&br&&br&上节,我已经提到,触发器可以“记忆”1位的信息&br&&img src=&/aa16bb2ce862a99723af1bb_b.png& data-rawwidth=&563& data-rawheight=&244& class=&origin_image zh-lightbox-thumb& width=&563& data-original=&/aa16bb2ce862a99723af1bb_r.png&&就是上图这个样子,我们把它抽象成:&br&&img src=&/77b631ab0_b.png& data-rawwidth=&227& data-rawheight=&137& class=&content_image& width=&227&&我们把上图称作“1位锁存器”,想一想,两个输入线和一个输出线都是什么意思,我上节已经解释过,来、来、来,想一想那个淘气的小朋友。&br&&br&有了“1”,那么距离“100000”还会远吗?无非就是如何组织n个“1”,“抽象”的量级提升的过程&br&&img src=&/fdb0e7f337c_b.png& data-rawwidth=&736& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&736& data-original=&/fdb0e7f337c_r.png&&这是8位锁存器&br&&img src=&/e6001e7cee4fee19efb3f0e93b29c4bf_b.png& data-rawwidth=&490& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&490& data-original=&/e6001e7cee4fee19efb3f0e93b29c4bf_r.png&&简写成这种形式&br&&br&再来看两个神奇的发明,或许你也会为发明者神奇的构思所折服&br&&img src=&/a1b5b1067aff3bb66f5e7c4e44e41664_b.png& data-rawwidth=&590& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/a1b5b1067aff3bb66f5e7c4e44e41664_r.png&&我想制作出这么一个元器件,他要实现这些功能。想想一下,某一天,你成了一个名人,每天前来拜访的人络绎不绝,今天呢,来了八个人,但是你时间有限,只能见一个人,那就让5号来吧(把拜访者编号,0-7),5号拜访者带来了自己的礼物(0或者1的信息)。看图,左边的三根线表示拜访者的地址(当然是二进制编码),000,001,010,011,100,101,110,111,5号就是101,这时候呢,我只需要把S0和S2通电,那么5号拜访者就进来了,献上自己的礼物(1位的信息)。&br&&br&怎么实现这个功能呢?有兴趣的自己去研究下面实现,请记住,我们现在讨论的内容抽象的层次已经不是最最底层的实现了,而是更加关注于逻辑器件实现的功能&br&&img src=&/5ce1334ec94cbd23fe8d2d239c75b87f_b.png& data-rawwidth=&578& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&/5ce1334ec94cbd23fe8d2d239c75b87f_r.png&&这叫“8-1选择器”&br&&br&反过来,我有一封信需要送出去,这封信的内容是0或者1,现在我也有8个快递小哥可以选择,编号分别是000,001,010,011,100,101,110,111,我让谁去给我送信呢?那就还是5号吧,于是我把地址分别设置为101,5号小哥就去给我送信了,给出具体实现,有兴趣的自己去看吧&br&&img src=&/c415fae875bae2918b3bddb7f29ffef7_b.png& data-rawwidth=&437& data-rawheight=&504& class=&origin_image zh-lightbox-thumb& width=&437& data-original=&/c415fae875bae2918b3bddb7f29ffef7_r.png&&这个电路名儿叫做“3-8译码器”&br&&br&有了8-1选择器和3-8译码器,就可以制作出一个8位存储器了&br&&img src=&/f62f1d4cbbe509c9c738fd1d5425468d_b.png& data-rawwidth=&674& data-rawheight=&488& class=&origin_image zh-lightbox-thumb& width=&674& data-original=&/f62f1d4cbbe509c9c738fd1d5425468d_r.png&&again,把复杂的电路实现,抽象成简单的符号表示&br&&img src=&/fdb7fd3c8fab7_b.png& data-rawwidth=&430& data-rawheight=&171& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&/fdb7fd3c8fab7_r.png&&读/写存储器,通常叫做随机访问存储器或者叫RAM,RAM可存储8个单独的1位数据&br&&br&如何得到16 X 1的RAM呢?相信大家都能想到,用2个 8 X 1的RAM,我仿佛回到了《计算机组成》的课堂,让我再来做一次作业吧&br&&img src=&/bfb5aecfeee07b5be62ee_b.png& data-rawwidth=&530& data-rawheight=&357& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&/bfb5aecfeee07b5be62ee_r.png&&简写如下:&br&&img src=&/733d785f5ce80d346472d_b.png& data-rawwidth=&446& data-rawheight=&196& class=&origin_image zh-lightbox-thumb& width=&446& data-original=&/733d785f5ce80d346472d_r.png&&这种方式或许正确,但是使用了三根地址线,两根数据线,能不能使用4根地址线1根数据线呢?&br&加一个2-1选择器不就行了吗?(设计一个2-1选择器,这会儿应该不算什么难事儿)&br&&img src=&/5bbad23c2d954426ffaa_b.png& data-rawwidth=&557& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&/5bbad23c2d954426ffaa_r.png&&再次用符号简写:&br&&img src=&/15f7d75b93ab9fd1a53b56f_b.png& data-rawwidth=&461& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&461& data-original=&/15f7d75b93ab9fd1a53b56f_r.png&&&br&回到我们的出发点,怎么得到64K X 8的存储阵列呢?&br&无非就是努力提高8位锁存器的集成程度嘛,我可以想象,读者看到这里,脑子里全是密密麻麻的的连线,或许你还一时想象不到连线的方式,但是看到这里,64K X 8的存储阵列一定能用某种方式实现,对吧?虽然没有实现其电路图,但我也可以说,我理解了存储器工作原理,(你懂了吗?)。&br&&img src=&/1b19ffdc0c3d5fa8bfef0230_b.png& data-rawwidth=&544& data-rawheight=&188& class=&origin_image zh-lightbox-thumb& width=&544& data-original=&/1b19ffdc0c3d5fa8bfef0230_r.png&&1024 X 8RAM的符号表示,2的16次方,即64K,地址线有16根,数据线有8根&br&&br&为了申请我的专利,我需要做出一个机器的外部壳子,和第一节中的“计算器”一样,把这个机器的壳子把我所有实现的过程封装起来,形成一个“黑盒”,只保留几个外部的接口(也就是那几根数据线,一定要记得他们的功能),我要做成的外部盒子是这个样子&br&&img src=&/490b43bd0d0_b.png& data-rawwidth=&626& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&626& data-original=&/490b43bd0d0_r.png&&上一排的对应16根数据线,下一排有8根数据线,这个不用解释,相信把上文看完的都能明白什么意思,takeover这个按钮表示是否使得当前控制面板处于“激活状态”,也就是说,这个开关的作用是确定由控制面板还是又外部所连接的其他电路(从来没说过,没有连接外部其他电路,或者想象下,我这个机器壳子外面有一排的针孔,外部电路可以接进去,想想电脑机箱后边的针孔,就是这个意思,Soga)来控制。如果有其他电路相连。这时候takeover为 0(图示状态),此时存储器由其他电路接管,控制面板上的其他开关不起作用,当takeover为1 时,控制面板将重新获得对存储器的控制能力。&br&&br&最后还是给出电路实现&br&&img src=&/ffd325ac9a32d0f0dc9e642_b.png& data-rawwidth=&655& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&/ffd325ac9a32d0f0dc9e642_r.png&&想一下,机器壳子后面的针孔连那里,控制面板的开关又连接哪里?&br&&img src=&/b1c58ea11ed73b09e92017_b.png& data-rawwidth=&600& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/b1c58ea11ed73b09e92017_r.png&&简化的图示,是不是又用到“抽象”的思想呢?&br&&br&一个辛辛苦苦装满65,536字节(8位为一个字节,字节编码请去参考ASCII编码)珍贵数据的64K X 8的RAM阵列,如果断电,会发生什么事情?首先电磁铁会因为失去电流失去磁性,随着“梆”的一声,金属片讲弹回原位,RAM中的所有数据将如风中残烛一般消失在黑暗之中,所以,RAM也成为“易失性”存储器。&br&&br&那我一手打造的64K X 8的存储阵列,需要多少继电器呢?***是是500W左右,是不是惊讶到恐怖呢?谁会没事儿造出这么个恐怖的怪兽?(100年后的今天,用二极管,三极管,集成这么多元器件的芯片,连指甲盖的大小都不到,感叹人类技术的进步吧)。&br&&br&我穿越回二十世纪初,再次站在专利局的门口,为我这项“伟大的发明”申请专利,瑞士专利局的爱因斯坦会因此吓尿吗?世界上最聪明的大脑,能理解“黑箱”背后发生了什么吗?&br&&br&第四节
自动操作&br&&br&说了这么多电子线路的知识,我相信的我的讲述方式,大家都是能看懂的,前面所写的,其实只是为大家讲述一件事儿,“把电子元器件内部实现展开”,现有的一个个电子元器件,现在就是一个个小工具(把内部实现封装起来,保留外部接口,外部接口,就是那一根根地址线,数据线,和其他开关)、原材料。那我们现在看一看现在都有那些原材料呢?&br&&br&计算器:一个会算数的小朋友,每次你把要进行计算的两个数给他,拍一下小朋友的头,小朋友帮我算一下吧,他会把计算的结果给你,没有一点误差,计算速度很快,并且乐此不疲。&br&&br&计数器:一个一直在数数的小朋友&br&&br&存储器:辛辛苦苦装满了64K 字节的箱子&br&&br&译码器:《唐伯虎点秋香》中有个代号,9527,一个数字,你说它什么意思呢?如果,我“规定”9527指的是唐伯虎,让译码器来做这件事,译码器你把9527给我带过来(地址线用2进制表示的二进制是多少呢?),这时候译码器“很听话”的把唐伯虎叫过来。(在这里,机器“理解了”人类的语言吗?)&br&&br&有了这些原材料,我们就可以着手打造一台computer了,我们的工作才刚刚开始,请读者保持耐心,我们最终要实现的是一台通用计算机,这台“先进的”机器可以使加减法的过程自动化,is that unbelievable?这台机器可以解决所有能有加、减法处理的问题,而事实上现实中的许多问题确实可以用加法与减法来解决。&br&&br&让我来回顾一下自己的教育经历。从咿呀学语之后,幼儿园开始,我们就要开始一生的学习了,小学的数学课现在还叫不叫“算数”?刚开始,我们扳着自己的手指数数“1,2,3,4,5,上山打老虎...”,学会数数之后呢?老师先教我们加法与减法,那么乘法和除法呢?我依稀记得,是用加法和减法来实现的,对吗?&br&&br&加法与减法,可以从底而上,构建更加复杂的算数系统,以至于,微积分也是建立的基本的算数系统之上,我还清楚的记得泰勒公式带给我的震撼,记得第一次见到牛顿迭代法时的情景。&br&&img src=&/41bbe01adc4e96f1c24cfcb_b.png& data-rawwidth=&719& data-rawheight=&103& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/41bbe01adc4e96f1c24cfcb_r.png&&最美的数学公式之一,不解释为什么了,参考大学微积分&br&&br&假如,假如我们已经实现一台可编程的最原始的执行加减法运算的“计算机”,如何计算出e的值呢?&br&&br&想明白这一切,就需要我们了解“自动操作”的过程,了解程序的本质什么?编写程序的过程就像堆多米诺骨牌,辛辛苦苦,小心翼翼堆了半天,只为了那一下推到骨牌的快感!下面这一部分内容较难,请读者一定保持耐心,我会试着按我自己的理解讲清楚,如果我有理解不对之处,欢迎大家指出来,讨论改正&br&&br&&b&新纪元&/b&-能接受“指令”的计算器&br&&br&有人问我,真的可以用上述提供的那些原材料(计算器、计数器、存储器、译码器)造出一个计算机吗?就像维克多?弗兰肯斯坦组装怪物一样,当一切都已经就绪,看着我们一手打造出的庞大的怪物,小心翼翼的通上电,“醒来吧,孩子”,就像给他赋予生命一般,这些破铜烂铁奇迹般的苏醒过来,按照我给他的指令,完成我想要的工作,真的,人世间没有比这样的工作更让人神往了,你能理解《模拟游戏》中Turing对克里斯托弗的一往情深吗?至少他打动了我的心。&br&&br&扯多了,我可以很明确的告诉你,只用那些原材料确实可以打造出一台计算机,并且历史上确实有人实现了!是谁?冯诺依曼?图灵?很遗憾地告诉你,no。主人公的名字,我前边已经提到了,他叫康拉德?楚泽,1935年还是一个工科学生的他,在位于柏林的家中打造出一个可编程的计算机,一共花了3000多个继电器。&br&&br&接下来让我们穿越回到1935左右,让我们跟随“主人公”的思路,尝试打造出一台“计算机”。&br&&br&还记得上小学时,你学完数数,学完加减法之后,大人们常常考考你的题目是什么?“你给我算一下从1一直加到100吧”,问题是,我能用机器代替我来算数吗?哦哦,简单,我的原材料里不是有“加法器”了吗?,稍作修改就行,好,看看我的设计&br&&img src=&/8415ede484dafc24df26_b.png& data-rawwidth=&506& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&506& data-original=&/8415ede484dafc24df26_r.png&&&br&拿一个8位的加法器和一个8位的锁存器,按上述方式相连,每次我们可以通过加法器的开关输入我们要算的数(当然要输入的数是0-255之间,计算的结果也是0-255之间,在这里可以先计算1-10的和),我们小心翼翼的拨动开关,最后下方的一排指示灯显示计算的结果。简单吧(这个器件称作累加器)可是我一不小心输错了一个数怎么办?只有重新来算,完全再来一遍,好麻烦啊,有没有可以改进的方式呢?我突然想到,不是有存储器嘛,可不可以把我要计算的数据先存入存储器,再通过读取存储器的内容,把数据传送到加法器,执行运算,最后显示结果。&br&&br&good idea!具体该怎么做呢,我给出一种实现方案&br&&img src=&/c84dcad0e5edd0b85ed1a_b.png& data-rawwidth=&633& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&633& data-original=&/c84dcad0e5edd0b85ed1a_r.png&&一个振荡器(想想duang,duang,duang的电铃),16位计数器(我们的存储器容量不是64K X 8么,需要16根地址线),一个64K X 8的RAM(RAM连接控制面板,控制面板可以输入数据,还记得控制面板的takeover按钮是做什么用的么?),一个8位加法器和一个8位锁存器。&br&&br&让我们闭上眼睛,来想一想,这是怎么工作的。首先,请清零开关,然后闭合控制面板上的takeover按钮,这时候控制面板接管了存储器,如果要算的有100个数,我们一次调整存储器的地址线和数据线,把数据存入h的地址空间(这一部分你明白了吗,该怎么操作控制面板呢?上述地址空间用16进制表示)。数据输入完了,我们断开控制按钮(takeover键),这时候控制面板失去对存储器的控制,断开清零开关,这时候,计数器开始工作,0000h,电信号传入存储器的地址线,存储器呢,是一个忠实的仓库保管员,来,我看看你要取什么东西,他接过传来的地址,哦原来要0000h盒子内的东西啊,好,你拿走吧,(0000h“盒子”内的东西就是刚才输入的第一个数),第一个数据传入到加法器,加法器小朋友一看,好了,你和自身相加,这不还是你自己吗?他把计算结果给了锁存器,锁气器把计算的结果放入一个临时的盒子内。经过一点时间(很短)计数器变成0001h,还是和刚才一样,计数器小朋友把自己的数给存储器管理大叔,大叔根据传过来的数,把取出的数据传给加法器小朋友,加法器小朋友执行加法运算,把得到的结果给锁存器。他们是如此的兢兢业业,乐此不疲,“机械式”的完成自己的任务,没有一点儿怨言。&br&&br&哎,计算的结果是什么?我怎么看到指示灯在闪烁,计算的结果哪里去了?哦哦哦,计数器小朋友实在是太敬业了,根本没有办法让他停止工作,当他数到FFFFh之后又从0000h开始数数了。&br&&br&还有这样的计算也太机械了,功能也实在是太有限了,要是我想把100个数,分成50组,计算每一组的和,这又该怎么做到呢?聪明的读者你也动动脑袋想一想,怎么做到呢?&br&&br&楚泽看到这里也许和咱们一样皱紧眉头,怎么做呢,怎么做呢?该怎样解决这个问题呢?这时候或许突然迸发出“革命性”的想法,把运算的结果存回到RAM阵列中不行吗?这样一来,就可以在适当的时候用RAM阵列 的控制面板来检查运算结果(按下takeover),为了实现这个目的,在控制面板上加一排显示灯。eureka!&br&&br&改变之后的连线图&br&&img src=&/8c1058d66dbedc7bbd67d_b.png& data-rawwidth=&574& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&574& data-original=&/8c1058d66dbedc7bbd67d_r.png&&这里略去了一部分,包括振荡器和清零开关。这样做是很好,但是问题来了,怎样控制RAM写入信号呢(何时存入RAM,把结果存在什么位置?)&br&&br&假如我有一个这样的计算任务要完成:首先对三个数进行求和,然后对两个数进行求和,最后再对三个数进行求和,图示如下&br&&img src=&/533ffcfdeb6fc903e82744_b.png& data-rawwidth=&425& data-rawheight=&343& class=&origin_image zh-lightbox-thumb& width=&425& data-original=&/533ffcfdeb6fc903e82744_r.png&&图中用一小段连续的纸条(标记上连续的格子)表示一小段存储器,格子内表示存的内容。怎样使自动加法器为我们完成这项任务呢?我们不能期待向RAM阵列中输入一组数,然后自动加法器自动完成任务,自动加法器怎样“理解”我们交给它的任务,它怎么“知道”我们要他们干什么?&br&&br&为了完成这个任务,我们需要用一些数字代码来标示加法器需要完成的每一项工作:加载(Load)、相加(Add)、保存(Save)、终止(Halt)&br&&br&有了上述的指令,我们就可以命令计算器来工作了(暂时不去了解如何实现),对于上述的任务,可以表示如下:&br&(1)把0000h地址处的内容加载到累加器&br&(2)把0001h地址处的内容加到累加器&br&(3)把0002h地址处的内容加到累加器&br&(4)把累加器中的内容存储到0003h地址处&br&(5)把0004h地址处的内容加载到累加器&br&(6)把0005h地址处的内容加到累加器&br&(7)把累加器中的内容存储到0006h地址处&br&(8)把0007h地址处的内容加载到累加器&br&(9)把0008h地址处的内容加到累加器&br&(10)把0009h地址处的内容加到累加器&br&(11)把累加器中的内容存储到000Ah地址处&br&(12)命令自动加法器停止工作&br&&br&有了这些指令代码,那么这些指令代码存放在哪里呢?得了,不去想了,简单粗暴的解决方式就是在加一个RAM,一个RAM存放数据,另一个RAM存放数据对应位置的操作符(也就是上文指定的那些代码),再次对我们的机器进行改造,改造后的结果如下&br&&img src=&/4c87b392ea539c41eed286cb_b.png& data-rawwidth=&580& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&/4c87b392ea539c41eed286cb_r.png&&观察要仔细啊,数据的RAM即可以通过Control Panel控制面板进行输入,也可以接受外部的数据,而存储代码RAM只能通过控制面板写入!&br&&br&那么往存储代码的RAM里写入什么内容吧?机器又不认识load、store、add、halt这些单词。既然机器不认识,我就让他们认识!解决方式,就是编码,其实两位信息编码足够&br&操作码,代码&br&Load(加载),10h&br&Store(保存),11h&br&Add(加法),20h&br&Halt(停止),FFh&br&&br&这样一来,存储代码的那个RAM里边要存的内容就一目了然了&br&&img src=&/1f7b442f1eac20bb008f4f575ec32254_b.png& data-rawwidth=&332& data-rawheight=&363& class=&content_image& width=&332&&看到这里,读者有疑问吗?还是我最早提出的那个问题,机器是如何“理解”人类的语言的,我虽然把要操作的指令用0和1进行编码,但你把编码之后的内容拿给我们一手打造的这台机器,他还是“不明白”什么意思,去进行何种操作啊!我们转来转去又转回最初的起点,你让冷冰冰的机器去“理解”人类的指令,无异于天方夜谭,机器就是机器,永远也不可能具有思维,当初,我在这里也是困扰好久,哦,原来如此!&br&&br&我已经把***告诉你了,机器就是机器,永远也不可能具有思维&br&&br&我不管你有没有思维,你必须完成我给你的任务,你把上述的任务算个结果出来,这一点儿或许能办到,嘻嘻&br&&img src=&/e7c77b645be_b.png& data-rawwidth=&613& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&/e7c77b645be_r.png&&&br&为了体现Load和Add命令,我的机器内部又进行了部分改变,你看出差别来了吗?&br&&br&其实上述有一小部分没有连线。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,这些勤劳的小朋友和勤劳的大叔又继续工作了...&br&&br&用这种方式,我终于实现了我的想法,这真是一件值得高兴的事儿,我要好好休息下,等等,休息之前,顺便扩展一下我们的机器,让它也能运算减法。好简单,增加一条指令不就行了?Subtract(减)&br&&img src=&/aa008dade8ed6fe728a7b082c9c3c6a3_b.png& data-rawwidth=&312& data-rawheight=&183& class=&content_image& width=&312&&相应的,机器内部实现再改造下,增加一个取反器&br&&img src=&/baeebc0c93dcf23f0d6b1_b.png& data-rawwidth=&670& data-rawheight=&674& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/baeebc0c93dcf23f0d6b1_r.png&&布置一道作业题,取反器的那根控制信号线接在哪里?&br&&br&&b&数据“流水”&/b&&br&&br&我们从继电器打造出门电路,进而实现加法器,计数器,存储器,都是为了向我们的那个终极目标一步步前进。这就像点亮科技树的过程,一步步提高,直到实现我们的终极目标--一台可编程的通用计算机,那现在来看看,我们的科技树点亮到哪一步了,现在我们亲手打造的“能读懂人类指令的计算器”,离我们的目标还有多远?&br&&br&来看看我们这台机器能不能完成我们想要完成的任务。假设现在要把56h和2A相加,然后再从中减去38h,结果是多少呢?不是有指令了吗?来,设置指令,让机器去完成&br&&img src=&/232af880f3e6dcbeb0533_b.png& data-rawwidth=&526& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&/232af880f3e6dcbeb0533_r.png&&&br&由于指令和数据是分开存储的,我们分别通过控制面板在RAM中输入数据,启动机器,机器就“神奇”的计算出结果,可以用个控制面板来查看计算的结果。&br&&br&如果我的计算任务扩大一些,算一算1W个数的和吧?啊?10000个数,这时候我可以想象,站在台机器前面的“主人公”满脸苦逼的表情,我们小心翼翼的输入这指令,Load ...,Add ...,Add ...,Add ...,......Store ...。然后我们再输入数据,这真是个体力活儿啊!当我们终于把这一切都完成之后,启动机器,Come on,baby!计算吧&br&&br&让我们再次闭上眼睛,想象机器工作的情形,计数器多么像一颗跳动的“心脏”,过一段时间发出一次“心跳”,存储器收到心跳的脉冲,从此中取出数据,数据被传送到累加器“加工厂”等待处理,要通过一道道的“门”(2-1选择器),最后会传到存储器。每每想到这里,我不禁想起在欢乐谷水上漂流的过程,穿过一道道门,经过一间间屋子,每经过一道关卡,都可能被水淋到(数据被加工),最后转了一圈回到起点,机器内部执行的过程,就是数据坐在船上“流水”的过程,不是吗?&br&&br&让我们来看看机器算出来的结果,这可真是一个激动的时刻,辛辛苦苦拨了半天开关,现在要见证奇迹了。“咦”?怎么结果不对,这数值也太小了!&br&&br&哦,原来如此,我的累加器只能算8位的数据,让我去安静的哭一会儿去。&br&&br&你可能想到,把两个8位的加法器连在一起构成一个16位的设备,这是一种解决方案,但是,还有代价更小的解决办法。&br&比如要计算76ABh+232Ch,最终结果是99D7h&br&&img src=&/87f0ddf5aca348e4d20f19_b.png& data-rawwidth=&123& data-rawheight=&82& class=&content_image& width=&123&&我们可以把高低位分开来算&br&&img src=&/9c5acf7260d0dae4cdfba7b_b.png& data-rawwidth=&159& data-rawheight=&114& class=&content_image& width=&159&&低位加法&br&&img src=&/94b774c728adf104ff28d0b647acee25_b.png& data-rawwidth=&137& data-rawheight=&99& class=&content_image& width=&137&&高位加法&br&最后把计算的结果写回存储器&br&&img src=&/76fe75c916ebeda8fd6464a_b.png& data-rawwidth=&629& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/76fe75c916ebeda8fd6464a_r.png&&D7h被写入地址0002h处,99h被写入地址0005h处&br&&br&这是很理想的状况,因为,在上述的例子中把高低位分开计算,低位计算恰巧不存在进位的情况。如果要把76ABh和236Ch这两个16位的数相加该怎么做?ABh+6Ch=117h;1h+76h+23h=9Ah。计算的结果为9A17h,怎么解决这个问题呢?可能有读者已经想到了,加一个进位锁存器(存储进位)不就行了?那我再问一句,“那我们的指令码是不是需要扩展一下呢?怎么使得译码器来触发读取进位的信号呢?”读到这里,读者也应该和我一样,我们现在不关心具体实现细节,一定会有某种逻辑门的组合来实现,对吧?下边我给出扩展的指令码(也叫作操作码)&br&&img src=&/290ff25fd0055fab5ad2_b.png& data-rawwidth=&502& data-rawheight=&251& class=&origin_image zh-lightbox-thumb& width=&502& data-original=&/290ff25fd0055fab5ad2_r.png&&上述指令中,增加了一个“进位加”(Add with Carry)和“借位减”(Subtract with Borrow)有了他们,就可以极大的扩展加法器的功能,而不仅仅局限于8位数据的运算了,可以对16位,24位,32位,40位数进行加、减法操作了!比如对两个32位数7A892BCDh和65A872FFh进行加法运算。仅仅需要1条Add指令和3条Add with Carry指令&br&&img src=&/fcb0b3fcf56a33eb9c0160a_b.png& data-rawwidth=&590& data-rawheight=&492& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&/fcb0b3fcf56a33eb9c0160a_r.png&&我们通过增加操作码指令扩展的我们的“计算器”,在通往终极目标的路上又迈出了坚实的一步,“数据流水”的方式也确实也可按照我们的意愿实现一些计算任务,但是,对于计算1W个数相加之类的任务,总不能期待一条条的输入指令吧?&br&&br&让我们看看问题出在哪里。第一,对于上图来说,保存计算结果的存储单元地址不连续。第二。当前设计的自动加法器不允许在随后的计算中重复使用的前面的中间结果,一旦我们把计算的结果写回存储器,我们就无法再次读取它的值了。&br&&br&产生上述情况的原因就在于,我们构造的自动加法器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址,直至停机。&br&&br&要解决这个问题,需要对我们设计的加法器做一个根本性且程度极大的改变。我想几十年前第一代的计算机的设计者康拉德?楚泽,Turing等人一定会为这个问题寝食难安,因为解决了这个问题,才可以实现真正意义上的“自动操作”,这个问题也是&b&计算器&/b&与&b&计算机&/b&最根本的区别。&br&&br&没想到会有这么多人点赞,谢谢你们的鼓励,我们的万里长征已经看到胜利的曙光了,马上就要迎来激动人心的时刻了,请保持最后的耐心。&br&&br&&b&数据“转圈圈”&/b&&br&再次看一下我们设计的机器,代码的存储和数据的存储是同步的、顺序的,并且只能从0000h开始顺序寻址(计数器小朋友在一次计数,告诉存储器管理员大叔从哪个抽屉里取数据),直至停机。但是,如果我的数据是连续存储的,并且在任意地址保存数据(也就是说,存储器存放数据的抽屉式随意的,我们只知道抽屉的编号),该怎样去取数据进行计算,并且存储计算结果啊?这时候我突然听到一声,“你傻啊,你把要取数和存数的抽屉编号告诉我不就行了?”,管理员大叔一语惊醒梦中人,是啊,有了存储器的地址不就行了?可以把数据的地址与数据的内容分开存!这可真是石破天惊&br&&br&那就再次改变我们的设计吧,&br&&img src=&/890bf8df8a86df61453ff3_b.png& data-rawwidth=&786& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&786& data-original=&/890bf8df8a86df61453ff3_r.png&&这次,我们把指令(代码和数据的地址称为一条指令,先得到数据的地址,在根据地址取数据)放在一个RAM中,把数据存在另一个RAM中,并加了3个8位锁存器(临时存放8位数据),示意图只画出了改变的部分,其余部分与原来保持一致(累加器和代码解析器还有相应的控制信号)。指令占1个字节,16位的数据地址占2个字节,一条指令共占用3个字节,每次从RAM中取出1个字节,所以每次取出一条完整指令需要3次计数,数据地址再次传给存储器(这里多加了一个RAM),RAM取出数据传给加法器,而代码的解析与数据传输到加法器进行计算操作也需要1次计数,这必然需要更加复杂的控制信号。&br&&br&从存储器中取出一条完整指令的过程叫做取指令,机器响应指令码的一系列操作的过程叫做执行指令,虽然机器可以自动取出指令,并执行指令,你能说它是一种“有生命”的东西吗?&br&&br&看到这里有人可能要问,我们现在不是假设在1935左右吗?RAM是很奢侈的(500W个继电器),能不能想法舍弃掉一个RAM?把指令(代码和数据地址)与数据存在一起就可以了,这简单,还记得2-1选择器小朋友吗?(存储器部分提到了)&br&&img src=&/c8dce29efce26d279d676e3_b.png& data-rawwidth=&734& data-rawheight=&529& class=&origin_image zh-lightbox-thumb& width=&734& data-original=&/c8dce29efce26d279d676e3_r.png&&很简单,得到数据地址之后,把地址回传给存储器(此时计数器小朋友的计数无效),再次根据地址取出数据。&br& 来看一个小例子吧,计算45h+A9h-8Eh=?,假设45h,A9h,8Eh分别存在地址0010h,0011h,0012h处,计算的结果存于0013h处。我们应该给机器这样的指令:&br&把0010h地址处的字节装入累加器,&br&把0011h地址处的字节装入累加器,&br&从累加器中减去0012h地址处的地址,&br&把累加器中的内容保存到0013h地址处,&br&停机,&br&&br&数据的存储可以是任意的,我们只需要知道其相应的地址,那么指令呢?指令还是机械的顺序的往下执行,会不会出现这种情况,顺序执行指令,可是数据和指令地址冲突(要存指令的地址处已经有了重要的数据,需要跳过),指令能否跳过某一段区域,继续执行呢?&br&&br&这涉及到指令寻址方式的改变(耐心听下去,我们万里长征,最终的一步来了,跨过他,前方就是一马平川),怎样跳过某一段儿区域,继续执行指令呢?那就jump啊,对,扩充一条跳转指令(Jump)&br&&img src=&/3d661c746d390d611881dae08e3aef84_b.png& data-rawwidth=&491& data-rawheight=&242& class=&origin_image zh-lightbox-thumb& width=&491& data-original=&/3d661c746d390d611881dae08e3aef84_r.png&&相应的机器内部实现也要改变&br&&img src=&/ddaa2c668c1fc02b53a776cab39c0ffc_b.png& data-rawwidth=&800& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/ddaa2c668c1fc02b53a776cab39c0ffc_r.png&&在上一步基础之上,增加了一条到计数器的数据通路,相当于告诉计数器小朋友,“小朋友,你下次从我告诉你的那个数开始计数,叔叔给你糖吃,乖~”&br&&br&让我们回到电子线路中,计数器的实现,振荡器和D触发器串联方式(16个D触发器),我们稍作修改一下边缘型触发的D型触发器&img src=&/870faa339e7aea32c885f27_b.png& data-rawwidth=&385& data-rawheight=&259& class=&content_image& width=&385&&&br&可以不用了解上图的实现,请注意我们现在重点不在于具体实现,而在于实现某一功能,我们需要为16位计数器的每一位都设置一个这样的触发器。一旦加载了某个特定的值,计数器就开始从该值开始计数(是不是用糖果把计数器小朋友收买了,呵呵)&br&&br&Jump(跳转)指令确实很有用,但是一个有条件的跳转更有用(“我是个有原则的人,除非满足我的条件才jump”),比如要计算A7h与1Ch(十进制的28)相乘的结果,和28个A7h相加的结果相同,计算过程涉及到大量的重复操作&br&假设乘数和被乘数以及计算结果保存在一下地址:&br&1000h:00h,A7h,(16位乘数保存在此处)&br&Ch,(16位被乘数保存在此处)&br&h,(16位乘积保存在这两个连续的地址空间)&br&&img src=&/eab1c5e3fc0ccd4fece4c16_b.png& data-rawwidth=&728& data-rawheight=&467& class=&origin_image zh-lightbox-thumb& width=&728& data-original=&/eab1c5e3fc0ccd4fece4c16_r.png&&当这六条指令执行完毕之后,存储器1004h和1005h地址保存的16位数与A7h乘以1的结果相同。还要把这6条指令反复执行27次才能达到乘法的目的,如果在地址0012h处置放一条Jump指令会怎样?&br&&br&这个过程不会停止下来,它会一直反复执行下去!&br&&br& 我们需要这样一种Jump指令,它只让这个过程重复执行所需要的的次数,这种指令就是条件跳转指令,怎么实现它呢?我给出一种实现方式,简单看看就好&br&&img src=&/91bc8bd72f19bb5b52109b0ecd2dea33_b.png& data-rawwidth=&645& data-rawheight=&271& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&/91bc8bd72f19bb5b52109b0ecd2dea33_r.png&&这种锁存器叫零锁存器,当8位加法器输出为零时他锁存的值才是1。有了进位锁存器和零锁存器以后,可以为指令表新增4条指令&br&&img src=&/56f6ac745bdac4_b.png& data-rawwidth=&495& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&495& data-original=&/56f6ac745bdac4_r.png&&&br&非零跳转指令只有在零锁存器输出为0时才会跳转到指定的地址,如果上一步的加法、减法、进位加法或者借位减法运算结果为0时,将不会发生跳转。只需要在常规的跳转命令的控制信号之上再加一个控制信号&br&&br&那么继续刚才提出的问题,0012h地址之后的的指令为&br&&img src=&/1defccdeb670c342d75b87_b.png& data-rawwidth=&648& data-rawheight=&473& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&/1defccdeb670c342d75b87_r.png&&Store指令不会影响零标志位的值,只有Add、Subtract、Add with Carry、Subtract with borrow这些指令才能影响零标志位的值,当执行到地28次循环时,1004h和1005h地址保存的16位数等于A7和1Ch的乘积。1003h地址保存的值为1,他和FFh相加的结果为0.零标志位被置位!Jump If Not Zero指令不会再跳转回到0000h地址处,程序执行完成。&br&&br&现在可以说,我们这台不断完善的机器真的可以称得上是一台真正意义上的computer了!条件跳转指令将计算器和计算机真正区分开来。&br&&br&那么,你现在明白了吗,为什么计算机能读懂0和1?计算机和程序到底是什么?&br&&br&数据被附在电流上不断地转圈圈(循环的过程),当满足某一条件之后,得到最终结果。&br&&br&&b&汇编语言&/b&&br&&br&把上述机器码表示成助记符的形式&br&&img src=&/fffebb97f03eb04beb04a_b.png& data-rawwidth=&679& data-rawheight=&389& class=&origin_image zh-lightbox-thumb& width=&679& data-original=&/fffebb97f03eb04beb04a_r.png&&那么这个乘法的程序可以写成这种形式&br&&img src=&/f4fce2ed9c5f8ab0a6028_b.png& data-rawwidth=&351& data-rawheight=&487& class=&content_image& width=&351&&编码时最好不使用实际地址,用label来指代存储器中的地址空间,所以上述程序可以改写为&br&&img src=&/50add86b354e02d208ca72a_b.png& data-rawwidth=&744& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&744& data-original=&/50add86b354e02d208ca72a_r.png&&终于在春节到来之前写完了,算是圆了自己的一份小小的心愿。&br&&br&写的不好,欢迎大家批评改正。
这个问题从高中就开始疑惑,计算机究竟是如何理解人类思维,如何进行计算? 我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答…
玉来了&br&&br&既然是问最最原始的那个工作原理。。。&br&&blockquote&从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理&/blockquote&&br&&br&+++理论的分割线+++&br&&br&最最基本原始的那个工作原理甚至都和电无关,是数学原理,布尔代数(搜索),任何可以改变状态传递信息的技术都可以拿来实现布尔逻辑,而实现了布尔逻辑,就离计算机不远了。&br&&br&像是三体里面的人列计算机,就是用三体人实现计算机,这一段我直接跳了,没什么可看的,因为我懂嘛。。。&br&我还设想过水流+开关实现逻辑门,是可行的。&br&&br&&br&&u&「现在可以公开的情报」&/u&&br&&ol&&li&计算机的理论基础是布尔代数&br&&/li&&li&计算机的实现基础可以是任何拥有『改变状态』和『传递信息』的技术&/li&&/ol&&br&&br&&br&+++基础实现的分割线+++&br&&br&继续正题。。。&br&起初, 科学家 创造计算机, 科学家 说,要先有逻辑门,然后就用真空二极管实现了逻辑门&br&真空管的原理去搜吧&br&&br&电子计算机的原理就是利用通电、断电(或曰高电平低电平)这两个状态来表示布尔代数中的逻辑真和逻辑假从而实现布尔运算,由于这个原因,设逻辑真为1和逻辑假为0,这样就可以用计算机表示二进制的数字了。&br&&br&现在的计算机用的是晶体二极管,虽然底层原理不同,但是性质是一样的,这就是编程中常说的封装和抽象的好处,你不需要关心它的原理,用它实现你的功能就行了。&br&所以说起来,现代电子计算机的实现,是物理原理,计算理论,是数学原理。&br&&br&二极管的性质是这样的,只有一个方向可以通电,反向不通电&br&『想知道具体原理的可以搜索PN结』&br&还有三极管(还有一种性质相似的场效应管FET),性质是这样的,b通电ec通,b断电ec断&br&『具体原理搜索NPN结』&br&&br&&b&&u&【【【【配图】】】】&/u&&/b&&br&&b&&u&二极管和三极管&br&&/u&&/b&&img src=&/7e57a10bbfb98f26db9c63e450a328cc_b.jpg& data-rawwidth=&600& data-rawheight=&327& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/7e57a10bbfb98f26db9c63e450a328cc_r.jpg&&&br&&br&然后可以组成逻辑电路,下面分别是与或非(AND、OR、NOT)三种逻辑门的电路实现&br&&br&&br&&b&&u&【【【【配图】】】】&/u&&/b&&br&&b&&u&从左到右分别是与或非三种门,x j表示输入,m表示输出&br&&/u&&/b&&img src=&/f16fc1eae6d02ea_b.jpg& data-rawwidth=&872& data-rawheight=&620& class=&origin_image zh-lightbox-thumb& width=&872& data-original=&/f16fc1eae6d02ea_r.jpg&&&br&&br&有了这三种逻辑门电路,你就可以实现任意逻辑门了,比如与非门、或非门、异或门、同或门(异或非门)。(搜索逻辑门)&br&(实际应用中,是以与非门(NAND(Not AND) gate)为基础原件来构建电路,因为其他所有门电路都可以用与非门构建,&u&&b&关于这一点,你可以思考一下&/b&&/u&)&br&&br&&br&&b&&u&「现在可以公开的情报」&/u&&/b&&br&&ol&&li&地球当代的计算机的实现基础是电子技术&br&&/li&&li&二极管和FET的技术原理是PN结和NPN结,是原子、电子层面的原理(很底层吧。。。)&/li&&li&用二极管和FET可以实现布尔代数中的逻辑操作,称为『逻辑门』&/li&&/ol&&br&&br&&br&+++逻辑的分割线+++&br&&br&二进制数字的加法如下:&br&1+1=10&br&1+0=1&br&0+0=0&br&0+1=1&br&用上文中的逻辑门就可以实现这个加法。&br&不考虑进位的情况下(术语叫半加器),用一个异或门就可以实现两个数字相加,很简单,就不画图示意了,自行思考吧。。。&br&&br&考虑进位的情况下(术语叫全加器),稍微有点复杂,输入通过XOR(异或门)得到结果,同时过一个电路得到进位结果&br&进位规则如下:&br&1+1进位1&br&1+0进位0&br&0+0进位0&br&0+1进位0&br&可见进位规则可以用AND(与门)得到结果,所以电路图如下:&br&&br&【【【【配图】】】】&br&&img src=&/eb1d701aacbe_b.jpg& data-rawwidth=&698& data-rawheight=&475& class=&origin_image zh-lightbox-thumb& width=&698& data-original=&/eb1d701aacbe_r.jpg&&&br&把这样的电路串起来,就可以实现多位加法,自己想想看吧。&br&不过这里有一个问题,要连多个例图中的加法器,需要给电路添加一个输入口m,它是上一位的进位,有兴趣可以思考一二。&br&&br&&br&实际应用中,电路并不是凭空想的,是通过布尔逻辑运算得到一个最简逻辑表达式,然后按照这个表达式来组装电路,『请搜索数字电路』。&br&&br&淘宝可以买到LED灯、二极管和三极管,虽然现在涨价了,但价格依旧感人,不到顺丰快递费就可以买一大把,有兴趣的同学可以自行购买这些元器件组装电路来玩玩。&br&输出端接上led灯,就可以观察到电路运行结果。&br&&br&额外的,如果你把几个灯泡并联并且弄成一条线段的样子当做一个整体灯管,然后通过输入来点亮相应灯泡,就可以用来显示数字了。。&br&像下面这种,一共7个灯管&br&1点亮右边两根、2点亮相应的,以此类推&br&这样可以用布尔代数做出来5个输入7个输出相对应的逻辑,然后用上文的逻辑门组成电路图实现&br&(为啥输入是5个?)&br&&img src=&/5ba44e68d1ba119c0a00fd_b.jpg& data-rawwidth=&310& data-rawheight=&232& class=&content_image& width=&310&&&br&&br&「现在可以公开的情报」&br&&ol&&li&可以用逻辑门实现加法,也可以实现减法&/li&&li&实现加法的原理在于通过输入进行逻辑运算得到输出,这一学科可以通过搜索『数字电子技术』获得详情&/li&&li&通过灯泡等设备,可以实现电路的输出&/li&&li&计算机的&b&&u&本质&/u&&/b&原理就是接受『输入』,通过『计算』,得到『输出』&/li&&li&通过上文所有文字,已经部***决了楼主计算机为什么能读懂1和0以及内部工作原理的问题,虽然还剩下时序逻辑,不过这已经够了。楼主赶紧点赞吧&/li&&/ol&&br&&br&&br&+++分割线+++&br&&br&太长了。。。&br&后续还有反馈电路、触发器、时序逻辑存储器等等等等,最终目标是弄出一个CPU来(如果我有时间的话)可以写一个模拟器让感兴趣的同学用逻辑门拼凑CPU(如果我还有时间的话)&br&&br&『待续(应该大概真的会续)』&br&&br&&br&&br&&br&**不过最后还是想提醒还在学校的cs同学们,这些知识对找工作毫无帮助,请不要在此屠龙之技上浪费时间。
玉来了 既然是问最最原始的那个工作原理。。。 从小到大,我们被告知的都是,计算机只能读懂1和0,但我好奇的是为什么计算机它就能够读懂1和0呢,它是怎么读懂的?读懂后,又是怎样进行工作的呢?嗯...我想问的就是,最最基本原始的那个工作原理 +++理论的…
已有帐号?
无法登录?
社交帐号登录
字九日,号旮旯居士。

参考资料

 

随机推荐