我和小玉从小就相爱了。我们住在隔壁。
1.编码和电路信号转换
晚上爸妈会没收我的手机,但是我们还是想聊天又不敢发出声音,所以就想到了这个办法。...
我们所有的汉字都是通过灯泡的开和关的组合来表达的。同时约定每秒读取灯泡状态并记录。这是我们的秘密代码。
我:亮亮。
Xi:出去,出去,出去
欢:熄灯,熄灯。
你:亮亮。
就这样,我们虽然没有手机,但还是可以没日没夜的聊天。虽然效率很低,但我们还是很开心。
我和小宇不经意间把语言转换成了灯泡的组合。这个过程叫做编码。
第二,门信号相关性
我和小宇一直偷偷的聊,直到上了大学,父母再也管不了我们用手机了。
但是和小灯泡聊了这么多年,总觉得事情没那么简单,于是开始了一些新的探索。
我们增加了一个开关。此时,当两个开关同时闭合时,灯泡就会亮起。
两个开关和灯泡这么简单的对应,已经不是以前的那种了,而是一种逻辑。
开关的断开和闭合分别对应电路的断开和闭合。但是,小灯泡的亮度也对应着电路的断开和接通。那么两者就可以统一起来,不再取决于具体的物理性能。
此外,开关的连接和断开是活动的。小灯泡的连接和断开是被动的和结果。
我们把这里开关的接通和断开称为输入端,灯泡的接通和断开称为输出端,把整个电路封装在一个图中,可以得到如下抽象:
我们决定把这个电路叫做门电路,上面这个叫做与门。
为了以后更抽象地探讨,我们把电路连接表示为数字1,电路断开表示为数字0。
我们称这种表示为二进制。
输入a
输入b
输出
慢慢的,我们发现了越来越多的玩法。
我把上面的电路抽象成下面的门电路形状,叫做或门。
之后就一发不可收拾了。我和小玉设计了越来越多的门电路。我们发现任何我们能想到的逻辑关系都可以设计成相应的门电路。
3.加法器-信号计算
十进制数可以转换成二进制数,可以对应门电路的输入输出。
于是我和小玉有了一个大胆的想法。能不能设计一个计算加法的电路?
让我们从一位二进制数的最简单加法开始:
0+0=0;0+1=1;1+0=1;1+1=10
把它变成如下的表格
添加一个
添加b
添加和输出
进位输出
也就是我们需要设计一个能达到表中输入输出效果的电路。
经过不懈的努力,终于发现这个电路可以由异或门和与门两个门电路组成。
这个器件实现了二进制一位加法,但并不完美,因为只考虑了这两个数的进位输出,而没有考虑最后一位的进位,所以只能称为半加法器。
如果考虑到前一个进位,只需要再加一个半加法器,拼接一个或门。
此时,我们已经构建了一个完美的一位加法器,并自豪地称之为全加器。
全加器做好以后,不管加法器有多少位,只要把全加器一个一个的放在一起就行了。让我们试着做一个八位加法器。
好了,你完成了。有了加法器,任何数学运算都可以在理论上实现。
因为我们知道乘法可以转化为加法,除法可以转化为减法,减法可以转化为补码加法。现在我们可以自豪地称这个组件为ALU。
第四,时钟——信号的冲击
我和于豆都很开心。最后,通过电路实现了计算功能。
但是慢慢的就没什么意思了,于是我们突发奇想,设计了下面这个诡异的电路。
当开关A闭合时,整个电路接通,开关B会被吸下去,整个电路断开,电磁铁失磁,开关B又弹起。这时电路又接通了,开关B又会被吸下去。
这样开关B在断开和闭合之间连续快速循环,我们从不干涉这个电路,所以这个电路具有自反馈特性。
因为开关B来回振荡,所以我们称这个电路为振荡器。因为它可以产生不断变化的电信号,所以它像时钟一样不断有规律地运行。我们也称这个装置为时钟。它产生的交流电信号称为时钟信号。
动词 (verb的缩写)RAM保存信号
虽然有加法器,但输入的数从何而来?你能先把它放在某个地方吗?
我和小宇经过多次实验,发明了一种非常复杂的电路:
如果输入端为1,并且“控制端”的信号改变,则输出端变为1,然后输出端仍然保持(存储)1。
如果输入端为0,且“控制端”的信号改变,则输出端变为0,然后输出端仍保持0。
如果你不懂,没关系,记住这个电路的设计,实现一位存储功能就行了!我们称之为1位锁存器。
然后我们把几个锁存器组合起来,加上一些3-8译码器,8-1选择器等电路,就可以实现一个可以存储8位二进制的存储器,并且可以随机读写。我们称之为RAM,简称内存。
该元件可以再次组合,形成一个N × M RAM阵列。例如,我们可以表示一个1024 * 8的RAM阵列。
这意味着存储容量为1024个单位,每个单位占用8位。
为了更方便,我们规定1024 = 1K,8位= 1字节,所以我们可以说这个RAM的存储容量是1K个单位,每个单位占1B。或者说,地址空间1K,存储容量1KB。
这个时候,这个RAM模块已经近乎完美,我们甚至可以单独使用,把数据存储在一个地址,把数据读出一个地址。
如何方便人们操作?只需将地址输入、数据输入、写操作端子分别连接到一个控制面板上,通过一个开关控制这些信号的输入是1还是0,然后将数据输出连接到一些便于观察的灯泡上,就可以做到单个可以手动操作的存储设备。
有了可读可写的存储器,我们可以预先在存储器中存储几个数字。接下来能不能让算术逻辑单元ALU自动读取这个数并相加?
不及物动词程序-自动化
先介绍一个新的元件,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,计算结果为3。
4.当计数器值为3时,以此类推,请参见下图。
我们已经自动化了积累和求和的过程!之后,如果你想计算累积和,只需使用控制面板将数据预先存储在内存中!不方便吗?
七。程序指令
我们也想要更多的自动化!
现在这个设备只能无脑的把RAM里的数据从头到尾累加,不能选择加还是不加,也不能选择什么时候停。
比如我们RAM里的数据是这样的。
地址
数据
0x00
...
0x01
10
0x02
...
0x03
20
0x04
30
0x05
...
...
...
我们只想把RAM蓝色地址的数据累加,忽略其他地方的数据,停在RAM 0x05。我们做什么呢
我们可以再增加一个内存。存储在RAM中的数据表示“指令”的含义!
我们先发明三种指令。
加法:累加RAM这个位置的值。
Nop:忽略这里的值
停止:停止
那么,为了实现上述功能,相应指令RAM中的数据应该如下。
注意:下面指令RAM的地址和上面数据RAM的地址是一一对应的!
地址
指令RAM的值
指令含义
0x00
not otherwise provided 除非另有规定
什么也不做
0x01
增加
总和
0x02
not otherwise provided 除非另有规定
什么也不做
0x03
增加
总和
0x04
增加
总和
0x05
停止
停止
...
...
...
我们需要引入一个控制单元,并把它放在下面的位置。
当遇到nop指令时,输出禁用锁存器的w位,不允许锁存器写操作,因此累加结果不会被输入。
比如当输入是halt指令时,禁止计数器的en位,不允许计数器+1,从而达到停止的效果。
此时可以再次振荡时钟信号,从而实现选择性求和过程,时钟信号可以悬停在指定位置。现在让时钟信号振动,看看过程。
这个控制单元怎么实现?我们知道,只要给定输入和输出,任何元件都是可以制造的。本文不再展开。
有了三条指令,我们知道所有的操作都可以通过指令和各种复杂的控制器实现自动化。
接下来要做的就是设计控制器,约定大量指令,通过这些指令的排列组合,实现任何自动计算操作。
我们会设计很多指令。
调用指令集
我们排列组合指令后可以实现的功能。
叫做程序。
我们在这个过程中结合指令的排列。
叫做编程。
我们会安排结合这些说明的人。
叫做程序员。
我们将如何称呼这个承载所有这些的设备呢?
没错,这件蠢事就是
免责声明:该文章系本站转载,旨在为读者提供更多信息资讯。所涉内容不构成投资、消费建议,仅供读者参考。