Skip to content

计算机底层逻辑

约 2374 字大约 8 分钟

2020-03-02

计算机里只有电信号,高电压和低电压。

现在的芯片基础材料是硅。(沙子里提炼出来的)

硅很特别既不是绝对导电,也不是绝对不导电, 所以叫半导体

物理特性是在其中掺杂别的元素,再接上电线加电压,就可以用电流控制它导电或者不导电。 这个可以被电控开关的开关,叫晶体管。

简单理解:
	加正电压 -> 把参杂的东西吸附 -> 形成通路 -> 通电 -> 1
	不加电压 -> 通道消失        -> 阻断通路 -> 断电 -> 0

现在的CPU中有几百亿个晶体管。所谓的4纳米、3纳米的工艺就是指晶体管的大小,能做到在一个指甲盖大小的硅片上放进去上百亿个晶体管。

晶体管的核心功能: 给控制端施加高压电->导电;低压电->断开。 高电压定义为逻辑1,低电压定义为逻辑0.所有的计算机原理都是建立在这两个状态上的。

逻辑门

  • 与门
    • 两个晶体管串联,施加高电压 电流能从一个晶体管流通过另一个晶体管输出1,否者都是0
  • 或门
    • 两个晶体管串联,只要其中一个施加了高电压 电流都都能通过输出1,只有两个都施加低电压 结果才是0
  • 非门
    • 两个晶体管,施加高电压 结果0 施加低电压 结果1 (跟输入相反)
  • 异或门
    • 两个晶体管,输入相同结果0;输入不同结果1

有了与或非门就可以构成计算机的所有运算、逻辑!

算术逻辑单元

加法

一位 A+B

ABC(进位)​S(结果)
00000+0=0
01010+1=1
10011+0=1
11101+1=10(进位了)

总结(半加器):

  • 进位(C) = A AND(与) B
  • 结果(S) = A NOR(异或) B

两位及以上 A₀A₁ + B₀B₁ (计算11+11)

  • 右边是低位:A₁、B₁
  • 左边是高位:A₀、B₀
  • 低位算完,进位交给高位
  • 高位不能只算 A₀+B₀,还要加上低位来的进位
  1. 第一步:算低位 A₁ + B₁ = 1 + 1 用半加器
  • 和 S₁ = 1 XOR 1 = 0
  • 进位 C₁ = 1 AND 1 = 1 结果: 本位 S₁ = 0,进位 C₁ = 1
  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. 把结果拼起来
    • 最终进位: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下一步该执行哪个指令,这个指令记在内存中的哪个位置,

工作流程

  1. 程序计数器存着下一条指令的地址
  2. CPU去内存中把这个地址的指令拿过来
  3. CPU执行这条指令
  4. 程序计数器+1(或+指令长度),指向下一条
  5. 循环....

当晶振开始振动,第一个节拍打响,CPU就会去程序计数器中取指令,程序计数器把地址发给内存,内存把那个地址中存储的一长串0和1的指令送回CPU;
PC → MAR → 地址总线 → 内存 → 数据总线 → MDR → IR → 译码单元。

指令到CPU后进入控制单元(逻辑门)译码,根据指令激活通向算术逻辑单元的开关。同时指令后的0和1指名要参与计算的数据在哪个寄存器中,然后更新程序计数器中下一个指令的地址 以此循环


无数个硅基晶体管组成电控开关,搭成与、或、非、异或等逻辑门,再组成负责运算的算术逻辑单元;用带反馈回路的触发器做成能记住 0 和 1 的寄存器,再由统一的时钟信号规定电路多久同步更新一次电信号,最终形成一套能算、能存、步调一致的计算机核心硬件。


这就是计算机运行的全部底层真相。

没有任何高级的智能,只有晶振在规律地打着节拍;程序计数器在死板地递加地址;控制单元在机械地根据读进来的0和1切换电信号的通路;算术逻辑单元在被动地把涌入的电平转换成新的电平


  • 因为高低电压可以组合出逻辑门,所以有了能做数学题的算术单元。
  • 因为反馈电路可以锁死电压状态,所以有了能存数据的寄存器。
  • 因为我们需要有节奏地指挥电信号流转,所以有了晶振和控制单元。
  • 因为这套系统太复杂不方便人类直接输入电平,所以我们发明了指令集,把0和1包装成了汇编语言,最后包装成种类繁多的开发语言,c c++ python ..