当前位置: 首页 > 科技观察

插图-你管这狗屎叫电脑?

时间:2023-03-16 11:57:01 科技观察

本文转载自微信公众号《低并发编程》,作者孙山客。转载本文请联系低并发编程公众号。我和小宇很早就相恋了,我们就住在隔壁。1、编码与电路——信号转换晚上家长会把手机没收,而我们还想继续聊天,又不敢出声,于是想出了这个方法……我们用灯泡转on和off全部用中文组合来表示,同时同意每秒读取灯泡的状态并记录下来,这就是我们的暗号。我:开,开,关,开,关,开,开,关,开,开,关,开,开,开,开,关,开,开,开,关,开,开,关,开,开,开,关,这样,即使我们没有手机,也可以天天聊天,虽然效率很低,但还是很开心。就这样,我和小宇不经意间把语言变成了灯泡亮灭的组合。这个过程称为编码。2.门电路——信号连接我和小宇一直偷偷聊到上大学,父母再也不能管我们用手机了。但是小灯泡打了这么多年,总觉得事情没有那么简单,于是开始了一些新的探索。我们添加了一个开关。这时,当两个开关同时闭合时,灯泡就会亮起来。这样一来,两个开关和灯泡之间就不再是简单的对应关系,而是一个逻辑。开关的断开和闭合分别对应于电路的断开和接通。小灯泡的灭和亮也分别对应电路的断开和接通。那么两者就可以统一起来,不再依赖于具体的物理性能。此外,开关的连接和断开是有效的。小灯泡的连接和断开是被动的和结果的。我们把开关的接通和断开称为输入端,把灯泡的接通和断开称为输出端,把整个电路封装成一个图,可以得到如下抽象:我们决定把这个电路称为门上面的电路称为与门。为了将来更抽象的探索,我们将连接的电路表示为数字1,将断开的电路表示为数字0。我们将这种表示称为二进制。InputAInputBOutput000010100111慢慢地,我们发现了越来越多的玩法。对于上面的电路,我把它抽象成如下门电路的形状,称为或门。之后一发不可收拾,我和小宇设计的门电路越来越多。我们发现只要是我们能想到的逻辑关系,都可以设计成相应的门电路。3、加法器——信号计算可以将十进制数转换成二进制数,二进制数可以对应门电路的输入输出。于是我和小宇有了一个大胆的想法,能不能设计一个计算加法的电路呢?我们先从最简单的一位二进制数加法开始:0+0=0;0+1=1;1+0=1;1+1=10变成表格如下AddendAAddendBSumoutputCarryoutput0000011010101101即我们需要设计一个电路,可以实现表中的输入输出效果。经过不懈努力,终于发现这个电路可以由两个门电路组成,一个异或门和一个与门。该设备实现了二进制一位加法,但并不完美,因为只考虑了这两个数的进位输出,而没有考虑前一位的进位,所以只能称为半加器。如果考虑到前面的进位,只需要多一个半加器,拼接一个或门就可以了。至此,我们已经构建了一个完美的一位加法器,我们自豪地称之为全加器。全加器做出来后,不管能做出多少位加法器,把全加器一个一个拼起来就行了。让我们试着做一个八位加法器。OK,大功告成,有了加法器,理论上任何数学运算都可以实现。因为我们知道乘法可以转化为加法,除法可以转化为减法,减法可以转化为补码加法。我们现在可以自豪地将这部分称为算术逻辑单元ALU。4.时钟——信号的振荡,我和小宇都很开心,终于借助电路实现了计算功能。但是渐渐地,我们觉得没什么意思,于是突发奇想,设计了下面这个诡异的电路。当开关A闭合,整个电路导通,开关B吸低,整个电路断开,电磁铁失磁,开关B又弹起,此时电路又接通,开关B又被吸了下去。这样,开关B就在断开和闭合之间连续快速地循环,我们从不干预这个电路,因此电路具有自反馈特性。由于开关B来回振荡,我们称这个电路为振荡器,又因为它产生不断变化的电信号,像时钟一样不断有规律地运行,所以我们称这个设备为时钟。它产生的交变电信号称为时钟信号。5.RAM——保存信号虽然有加法器,但输入的数字是从哪里来的呢?它可以先存储在某个地方吗?我和小宇经过多次实验发明了一个非常复杂的电路:如果输入端为1,改变“某控制端”的信号(信号由0变为1的瞬间),输出端就会变成1,然后输出端仍然会保持(存储)刚才的1。如果输入端为0,当“某个控制端”的信号发生变化时,输出端变为0,然后输出端仍然保持(存储)刚才的0。看不懂没关系,记住这个电路的设计,实现了一位的存储功能!我们称之为1位锁存器。然后我们组合多个锁存器,再加上一些3-8译码器,8-1选择器等电路,就可以实现一个可以存储8位二进制,并且可以随机读写的存储器,我们称之为RAM,或者memoryfor短的。该组件可以再次组合形成一个N×MRAM阵列。例如,我们可以表示一个1024*8的RAM数组。这表示1024个单元的存储容量,每个单元占用8位。为了表达更方便,我们规定1024=1K,8位=1字节(8位=1字节),那么可以说这个RAM的存储容量为1K个单元,每个单元占1B。也就是说,地址空间为1K,存储容量为1KB。至此,RAM模块就接近完美了,我们甚至可以单独使用它,在某个地址存储数据,在某个地址读出数据。如何方便人们操作?只需要将地址输入、数据输入、写操作端子接到一个控制面板上,用开关控制这些信号的输入是1还是0,再把数据输出接到一些灯泡上就可以了。方便。观察一下,这样一个可以手动操作的独立存储设备,就搞定了。有了可读可写的内存,我们可以预先在内存中存入若干个数字。接下来,能否让算术逻辑单元ALU自动读取这个数,进行加法运算呢?6、程序——自动化我们首先介绍一个新的元件,一个10位的计数器,其中Clk接我们在第四部分讲到的时钟信号,Clr是清零端。具体效果看下面动图一目了然。计数器的输出为0、1、2、3、4、5,可以认为是内存中的地址。我们接上这个计数器,还有上面提到的ALU和RAM,尝试实现一个可以累加和求和的设备。我们要计算的是1+2+3+4+5+6+7,这个自动计算器是这样工作的1.用控制面板把数字1~7存入RAM地址0~6是的,已经在上一节中实现。2、当计数器的值为0时,输出数据1给加法器计算。此时加法器A=1,B=0,计算结果为1,但是记住锁存器存放的是上一次加法寄存器输出0,而这次的计算结果要等待下一次锁存器遇到上升沿信号。3、当计数器的值为1时,数据2输入加法器。这时锁存器存入最后一次计算结果1,并把这个1输出给灯泡,同时返回给加法器的B,所以此时加法器A=2,B=1,计算结果为34,当计数器的值为3,依此类推,请看下图,我们将累加求和的过程自动化!如果要计算累计和,只需要使用控制面板将数据提前保存在内存中即可!是不是很方便?七、程序指令我们还是想要更多的自动化!现在这个设备只能无脑地把RAM中的数据从头到尾一直在积累,无法选择加哪不加,也无法选择什么时候停止。比如我们RAM中的数据就是这样的。地址(十六进制)数据(十进制)0x00...0x01100x02...0x03200x04300x05.........我们只想把RAM蓝色地址的数据累加起来,其他的数据places被忽略,它停在RAM0x05。我们应该做什么?我们可以再加一个RAM,这个RAM里面存放的数据就是“指令”的意思!我们先发明三种指令。add:将RAM中该位置的值累加nop:忽略此处的值(即什么都不做)halt:停止(禁止计数器的值加一)那么为了实现上述功能,相应的指令在RAM数据应该是这样的。注意:下面指令RAM的地址和上面数据RAM的地址是一一对应的!地址(十六进制)指令RAM的值指令含义0x00nop什么都不做0x01addAccumulate0x02nop什么都不做0x03addAccumulate0x04addAccumulate0x05haltStop.........我们需要引入一个控制单元,放在下面的位置,遇到nop指令(0x00),则输出会禁止latch的W位,写操作不允许闩锁,所以不会输入累积结果。再比如,如果输入的是一个halt命令(0x05),则禁止计数器的EN位,不允许计数器为+1,从而达到停止的效果。此时让时钟信号再次震荡,实现选择性求和过程,悬停在指定位置。现在让时钟信号振动,看看这个过程。(这里只留下关键部件)这个控制单元是如何实现的?我们知道,只要给定输入和输出,就可以制作任何组件。本文不再展开。有了三个指令,我们就知道所有的操作都可以通过使用指令和各种复杂的控制器实现完全自动化。接下来要做的就是设计控制器,约定大量的指令,通过这大量指令的排列组合,实现任何自动计算操作。