外观
计算机底层逻辑
约 2374 字大约 8 分钟
2020-03-02
计算机里只有电信号,高电压和低电压。
现在的芯片基础材料是硅。(沙子里提炼出来的)
硅很特别既不是绝对导电,也不是绝对不导电, 所以叫半导体
物理特性是在其中掺杂别的元素,再接上电线加电压,就可以用电流控制它导电或者不导电。 这个可以被电控开关的开关,叫晶体管。
简单理解:
加正电压 -> 把参杂的东西吸附 -> 形成通路 -> 通电 -> 1
不加电压 -> 通道消失 -> 阻断通路 -> 断电 -> 0现在的CPU中有几百亿个晶体管。所谓的4纳米、3纳米的工艺就是指晶体管的大小,能做到在一个指甲盖大小的硅片上放进去上百亿个晶体管。
晶体管的核心功能: 给控制端施加高压电->导电;低压电->断开。 高电压定义为逻辑1,低电压定义为逻辑0.所有的计算机原理都是建立在这两个状态上的。
逻辑门
- 与门
- 两个晶体管串联,施加高电压 电流能从一个晶体管流通过另一个晶体管输出1,否者都是0
- 或门
- 两个晶体管串联,只要其中一个施加了高电压 电流都都能通过输出1,只有两个都施加低电压 结果才是0
- 非门
- 两个晶体管,施加高电压 结果0 施加低电压 结果1 (跟输入相反)
- 异或门
- 两个晶体管,输入相同结果0;输入不同结果1
有了与或非门就可以构成计算机的所有运算、逻辑!
算术逻辑单元
加法
一位 A+B
| A | B | C(进位) | S(结果) | |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0+0=0 |
| 0 | 1 | 0 | 1 | 0+1=1 |
| 1 | 0 | 0 | 1 | 1+0=1 |
| 1 | 1 | 1 | 0 | 1+1=10(进位了) |
总结(半加器):
- 进位(C) = A AND(与) B
- 结果(S) = A NOR(异或) B
两位及以上 A₀A₁ + B₀B₁ (计算11+11)
- 右边是低位:A₁、B₁
- 左边是高位:A₀、B₀
- 低位算完,进位交给高位
- 高位不能只算 A₀+B₀,还要加上低位来的进位
- 第一步:算低位 A₁ + B₁ = 1 + 1 用半加器:
- 和 S₁ = 1 XOR 1 = 0
- 进位 C₁ = 1 AND 1 = 1 结果: 本位 S₁ = 0,进位 C₁ = 1
- 第二步:算高位 A₀ + B₀ + C₁ = 1 + 1 + 1 这里必须用全加器(3 个数相加)
- ① 先算 1 + 1(半加器 1)
- 临时和 = 1 XOR 1 = 0
- 临时进位 = 1 AND 1 = 1
- ② 再算 0 + 进位 1(半加器 2)
- 高位最终和 S₀ = 0 XOR 1 = 1
- 临时进位 = 0 AND 1 = 0
- ③ 合并两个进位(或门)
- 第一个进位:1
- 第二个进位:0
- 最终进位 C_out = 1 OR 0 = 1 高位结果: S₀ = 1,最终进位 C_out = 1
- 把结果拼起来
- 最终进位:1
- 高位和 S₀:1
- 低位和 S₁:0 从高位到低位写:1 1 0 也就是二进制 110 = 十进制 6
半加器:一位二进制计算不考虑进位
全加器:一位二进制计算考虑进位计算
当写上一个加法的代码a+b时,在底层,代表a和b的电信号进入晶体管的加法电路中,经过极短的物理延迟,电路的另一端就输出了代表结果的高低电压,把这个高低电压写成0和1就是二进制,转换成十进制就是我们日常可读的。
寄存器
上面完成了计算,但是只是算没用,记不住啊一断电全没了。 于是引入了寄存器。
加法器是组合逻辑,输入没了,输出立刻消失,不记东西,要存结果就要时序逻辑 也就是触发器。
工程师发明了一种巧妙的短路,叫触发器,当计算完成后把输出端的信号再接回输入端,就算原始输入没有了,电路也能依靠内部的反馈记住当前的高、低压状态。
把这个触发器做一排,放在算术逻辑单元的边上,它就是寄存器。电信号传输距离短,速度快,造价高,所以只能做的很小!
触发器 = 把输出接回自己的输入,形成一个反馈环路。
只要环路通着,电路就能自己维持 0 或 1。
输入撤掉,状态还在。
这就叫:锁存、记住状态。(寄存器!) 他的本质是一个时钟信号(给触发器的电信号)。
- 平时:保持不变
- 时钟来一下:更新一次
- 更新完:继续保持
时钟信号
计算机主板上有一个晶振,石英晶体振荡器。只要通电他就会产生固定频率的脉冲电信号(加上放大器)
类似一个节拍器,也可以理解为是计算机的心跳,就是他多久更新一次电信号
我们的主频多收多少GHz,比如3GHz 就是一秒钟更新30亿次 也就是每0.000...0003秒 寄存器、加减法器、电路更新一次状态
为什么要有时钟信号?
- 加法器,逻辑门 都是有输入了就立刻计算
- 而触发器寄存器 需要等待指令才更新
这样电路变化就会矛盾,高位没计算完成 低位已经变了,寄存器的数据还没写完就被读取走了
所以需要一个时钟信号
信号每跳变一次
- 电路允许完成一步操作
- 寄存器只在始终跳变时才更新、锁定、存储
- 所有运算、读写,全部都跟始终同步
高 ┌───┐ ┌───┐ ┌───┐
│ │ │ │ │ │
低 ┘ └───┘ └───┘ └───
1 2 1 2 1 2内存条(DRAM)
他的原理和寄存器基本一样,只是他不用触发器,使用微小的电容来存储电荷。
电容中有电荷就是1没点和就是0,因为电容结构很简单,只需要一个晶体管和一个电容就能存一位数据,所以可以把容量做得很大,几十上百GB
由于寄存器存储容量不大,于是有了内存条(动态随机存取存储器 DRAM)
但是电容有个致命缺陷,会漏电,存储的数据如果不管 几毫秒内部的电荷就会漏掉,会从1变为0,所以需要不停的给他刷新充电!(所以一关机断电内存的数据就全没了)
所以有了内存控制器,来给内存里的数据进行批量保存在填充回去,这个过程就叫刷新!
CPU工作流程
现在有了
- 算术逻辑
- 时钟
- 寄存器
我们可以执行指令了,但是如何把很多指令串起来执行呢? 这时候就要用到程序计数器
程序计数器
是一个有着专门用途的寄存器,存储的下一条指令地址 他的作用告诉CPU下一步该执行哪个指令,这个指令记在内存中的哪个位置,
工作流程
- 程序计数器存着下一条指令的地址
- CPU去内存中把这个地址的指令拿过来
- CPU执行这条指令
- 程序计数器+1(或+指令长度),指向下一条
- 循环....
当晶振开始振动,第一个节拍打响,CPU就会去程序计数器中取指令,程序计数器把地址发给内存,内存把那个地址中存储的一长串0和1的指令送回CPU;
PC → MAR → 地址总线 → 内存 → 数据总线 → MDR → IR → 译码单元。指令到CPU后进入控制单元(逻辑门)译码,根据指令激活通向算术逻辑单元的开关。同时指令后的0和1指名要参与计算的数据在哪个寄存器中,然后更新程序计数器中下一个指令的地址 以此循环
无数个硅基晶体管组成电控开关,搭成与、或、非、异或等逻辑门,再组成负责运算的算术逻辑单元;用带反馈回路的触发器做成能记住 0 和 1 的寄存器,再由统一的时钟信号规定电路多久同步更新一次电信号,最终形成一套能算、能存、步调一致的计算机核心硬件。
这就是计算机运行的全部底层真相。
没有任何高级的智能,只有晶振在规律地打着节拍;程序计数器在死板地递加地址;控制单元在机械地根据读进来的0和1切换电信号的通路;算术逻辑单元在被动地把涌入的电平转换成新的电平
- 因为高低电压可以组合出逻辑门,所以有了能做数学题的算术单元。
- 因为反馈电路可以锁死电压状态,所以有了能存数据的寄存器。
- 因为我们需要有节奏地指挥电信号流转,所以有了晶振和控制单元。
- 因为这套系统太复杂不方便人类直接输入电平,所以我们发明了指令集,把0和1包装成了汇编语言,最后包装成种类繁多的开发语言,c c++ python ..
