文章目录
- 写在前面
- 1.计算机的早期历史
- 2.电子计算机
- 3.布尔运算和逻辑门
- 4.二进制
- 5.算术逻辑单元-ALU
- 6.寄存器和内存
写在前面
所有的一切源于这样一个网站——CS自学指南。
这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Computer Science。
无笔不读书,记录自己的学习笔记如下:
电子计算机系统的 抽象层次:
物理(电子)——>器件(晶体管、二极管)——>模拟电路(放大器、滤波器)——>数字电路(与门或门)——>逻辑(加法器、储存器)——>微体系结构(数据路径控制器)———>体系结构(指令寄存器)——>操作系统(设备驱动程序)——>应用软件(程序)
1.计算机的早期历史
算盘——>打孔机(人口普查10年一次,但是手工编排需要13年之久,于是出现了IBM,发明了打孔机是时间缩短到了2.5年)
以前的computer是指一种职业,后面才变成一种机器
2.电子计算机
3.布尔运算和逻辑门
CPU制作者无需在物理层面考虑,只需要在逻辑器件方面下功夫即可
4.二进制
32位电脑,64位电脑,指的是一块块处理数据,每块数据32位或者64位。
Instagram的图像色彩很棒,因为用了32位处理图像。
5.算术逻辑单元-ALU
ALU——计算机的数学大脑,是现代计算机的基石。是负责计算的组件,几乎所有的部件都用到了它。
,我们来看看ALU的真面目,下面是英特尔的74181ALU——
下面我们用上面学的布尔逻辑门来做一个简单的ALU逻辑电路,功能与74181相同。之后我们从头开始造一台电脑。
ALU有两个单元——1个算术单元和1个逻辑单元。
先讲第一个单元——运算单元:
算数单元负责所有数字操作,比如加减法。今天的重点是一切的根本——如何将两个数相加
会用到AND、OR、NOT、XOR等逻辑门电路。最简单的就是将两个比特相加。假设有2个输入A、B,1个输出OUTPUT,也就是结果。需要注意的是,这三个都是比特(0或1).所以总共会有3种可能——
结合二进制里面的0=TRUE,1=FALSE,所以上面的三个算法结果与XOR门一致,如下:
所以我们将XOR门用做1位加法器(adder)
但是第四个组合是一个特例——1+1=10,上面的1位加法器无能为力。所以需要做调整,即当两位全是1时,会出现进位1,我们便需要额外的线来输出这个1。加一个AND门刚好可以做到,故调整如下——
carry为进位。调整后的器件叫半加器(HALF ADDER)——就是两个逻辑门而已:
将其抽象化后,得到如下图示——
但是如果想处理超过1+1的运算,比如1+1+1我们需要全加器
这可以在半加器的基础之上实现。如下——
全加器表格如下
这样我们就又得到了一个全加器,下面再次提升抽象,将其封装成一个独立组件。
全加器会把 A,B,C 三个输入加起来,输出"总和”和“进位”。
现在有了新组件,我们可以相加两个8位数字了。假如叫做数字A和B。
先将A、B的最后一位A0、B0相加,得到sum0,因为没有来自前面的进位,所以只用半加器就好。
下面将A1、B1相加,因为A0、B0可能会有进位与之相加,所以这里用全加器,并输出sum1。
下面的各个位依次进行之
就这样,我们将8位全相加。这也叫做行波进位加法器。
注意这里可能会有溢出,即最后一位有进位,代表数字太大,超过了8位,发生了溢出。这会导致不可预料的结果。
比较著名的溢出现象就是吃豆人游戏用8位存储游戏关卡数,当打超过256之后,就是这样一幅画面,溢出出现BUG。
如果想避免溢出,我们可以加更多的全加器,如16位、32位。但是也有缺点,每次都要进位,会导致时间消耗,但是电子移动相当之快,影响不大。但是目前的运算是每秒几十亿的量级,也会造成相应影响。为了克服之,现代计算机用的加法器有所不同,叫做**“超前进位加法器”**。做的事仍然是将二进制相加,但是更快。
以上就是ALU如何将两个数相加的全过程。但是ALU还可以做其他更多运算,都是逻辑电路组成的。
下面来讲ALU的另一个单元——逻辑单元。
逻辑单元执行逻辑操作比如之前讲的AND、OR、NOT、XOR之类
比如下面的所有电路输入必须全为0,输出才为1——
让我们回到开头的英特尔74181,和我们的不同,他只能处理4位输入,意味着我们的ALU比英特尔的还好!
工程师们常用一个大V代表ALU运算单元,又一层抽象!
现在我们知道了计算机是如何在没有齿轮和杠杆的情况下进行运算的了。接下来我们会用ALU做成CPU,不过在这之前,会先学习计算机的“记忆”——内存。
6.寄存器和内存
我们在上面一章中说到可以根据ALU算出来数据,但如果算出来就扔掉就没有意义了。所有需要找东西将算出来的数据存起来,已进行接下来有可能的步骤。这就是内存/存储的工作。
计算机中的很多事情,底层其实都很简单,难的是理解一层又一层的精妙的抽象
今天我们来做出只能存储一位的电路,然后在扩大做出内存模型,下次再和ALU结合起来做成CPU:
我们之前的电路都是单向永远向前流动的,现在我们来做成回环的电路,我们拿一个OR门将输出连回输入,如下:
首先两边都输入0,结果输出是0
之后将输入调成10,结果是1,之后结果1会很快传回至输入为0的地方,所以很快就会看到输入全是11。
如果将输入变成01,结果是1,之后也一直是1,上面的0不会影响输出1.所以现在存住了信息1,而且这是永久的。无论怎么试,都不会将1变回0
接下来看看换成与门AND会怎么样
首先将输入全设置为1,输出为1。但是将输入任意之一变成0之后,输出永远为0,所以这个电路能记录0,与之前的相反。
现在我们有了能存储01的电路,为了做出有用的存储(memory),我们将他们结合起来,叫做锁存器(AND-OR Latch)。
这有两个输入,设置输入1,将结果变成1
复位输入1,将结果变成0
如果结果和复位都是0,那么电路会输出最后放入的内容。也就是说,他存住了1位信息!这就是memory的原型!
这叫“锁存器”,因为他“锁”住了一位信息。放入数据的动作叫“写入”,拿出数据的动作叫“读取”。
然而,用设置与复位来输入,有点让人难以理解。为了更容易使用,我们只希望用一条输入数据线(DATA INPUT),一个允许写入线(WRITE ENABLE)来控制信息存取。也就是下面的样式,这叫做“门锁”(Gated Latch)。
我们不想关注底层原理,提升一层抽象,将“门锁”封装做成一个盒子,这个盒子能存一个bit。如下:
只有允许写入线打开时,器件才开始工作。
然而这只是一个锁存器做成的门锁器件,只能存一个bit,我们可以将8个并排的锁存器并用,这样就可以存8bit。一组这样的锁存器叫“寄存器”,寄存器能存一个数字,这个数字有多少位叫做“位宽”。位宽从8一直发展到现在的64。
启动寄存器之前,要先启动里面所有锁存器。将所有的允许写入线设置为1后,数据输入线写入值,再将允许写入线设置为0,这样值就存储了。
存入10110101进寄存器——
为了节约并排时的线路,将锁存器做成矩形排列,以下是256个锁存器以矩形形态展示。要启动哪一个锁存器,就打开相应的行线和列线。
以下是具体的结构实现图
我们想通过唯一的方法来指定上述的交叉路口(锁存器),即交叉点的地址。由于上面的排列最多16行16列,所以用4bit即可。我们刚才找的是12行,8列。则表示成地址就是12——>1100,8——>1000。则地址就是11001000。
为了将地址转化行和列,我们需要“多路复用器”(MULTIPLEXER)——来将行列十进制转换为二进制代码,如下——
我们不妨把上面的256位内存当成一个整体,又提升一个抽象层级。
下面的8位地址前4个为代表行,后4个代表列,用于定位唯一的锁存器。
不幸的是,256bit仍然不能做什么,我们像之前寄存器的排列一样,并行排列8个256bit大小的内存单元,每次从里面存一位,这样就能一次读取8bit,也就是1byte了!
而这里一个内存单元共256位,所以总共能存256byte!
不管内部,我们再次将之抽象,将其看成一个可寻址内存条——
下面的内存条中,我们有256个地址,每个地址能存8位值的信息。我们下面做CPU时就会用到这个内存条。
这里的内存条有一个重要特性就是可以访问任何位置,所以叫做随机存取存储器(RAM)
内存就是RAM,就好比于人的短期记忆,记录当前在做的什么事。
下面以一个真实的1980年代的真实内存条来结束本章:
下面的内存焊了8个内存模块
以下是详解:
来
今天我们用锁存器做了一个SRAM(静态随机存取存储器),还有其他类型的RAM,如:DRAM、闪存。他们功能相似,但使用不同电路存取单个位,比如用不同的逻辑门,电容器、电荷捕获或忆阻器。但根本上,这些都是矩阵层层嵌套来存取大量信息。
就像计算机中的很多事情,底层其实都很简单,难的是理解一层又一层的精妙的抽象。