穿越计算机的迷雾

bit入门

如何用电来表达一个数字:

  • 1v为1 、2v为2… 但难以计算到底是几v
  • 开关,0代表无 1代表有。二进制

如何对二进制实现加法

  • 对于每一位
    • 两个输入一个进位
    • 一个输出一个进位
  • 多位串联起来
    • 低位的进位传递给高位

电与磁

电能生磁,通过电流通断规律控制衔铁臂上下运动画出莫尔斯电报

​ 距离太远?继电器实现不同回路的继电

磁生电,线圈切割磁感线产生电流:话筒 声波->电流 扬声器 电流->声波 二者可以是同一个东西

为什么是交流电

  • 产生更容易,圆周运动
  • 通过变压器轻松实现升降压,而高压传输损耗更小

全加器

同门电路image-20230511153924305

与非image-20230511154215546

异或门

image-20230511152444206image-20230511152733412

  • 对全加器列出真值表,化简出逻辑表达式,并使用继电器构造出来,22个->18个 1940年计数器

    S = A ⊕ B ⊕ Cin

    Cout = (A B) + (Cin (A ⊕ B))

image-20230511151739600

image-20230511172429980

至此我们得到了运算器

触发器

为了记录下1bit!!!(后面采用电容存储1bit(DARM 内存;晶体管做触发器SRAM cache))

二极管:加热的灯丝可以放出电子

三极管:中间增加一个栅极,可以截断或者放大

振荡器:把一个非门的输出接到输入

触发器:

​ 输出永远相反,而当输入只有一个1时,可以改变输出状态(输入期望也相反) 问题:我只想在想记录时记录

​ 输入S置为一后,Q一直会保持1,R(reset)可以将Q置零。都为1不稳定

image-20230511163751743image-20230511164109382

D触发器:

​ 增加一个控制端,实现1bit的保存。CP为1时,Q=D保存输入,CP为0时,忽略

image-20230511165325821

上升沿D触发器

​ CP为上升信号时,触发保存。对于继电器,一次记录可能需要延时1s

image-20230511165731250image-20230511170247155

走马灯:移位寄存器

​ (移位寄存器)振荡器 + 循环连接的上升沿触发器,其中有一个1;每震荡一次1就传递给下一个。image-20230511170124003

寄存器:多个上升D

多个CP就可以构成寄存器存储数据

T触发器:

​ 反转

image-20230511170310516

​ 串联: 二进制计数器,计算上升沿的数量

image-20230511172102638

至此我们得到了寄存器,能够缓存一部分数据。

继电器 ->电子管 -> 晶体管 -> 集成电路

一连串加法

之前的加法器只能保证两个输入得到一个输出,但不能连续计算。结合寄存器优化!!

1.基本思想:使用寄存器保存值,一个数为直接输入,另一个为RA寄存器的值。加法器会实时计算两个输入的值

image-20230511190342020

2.为了实现连续计算,加法器的输出要直接接到输入

image-20230511190457135

问题:共用一条线(总线)会冲突,需要添加控制实现轮流使用总线

image-20230511190610102

3.添加上总线控制GA,GB,总线控制是按住,而寄存器装载是上升沿按下松开

image-20230511190438862

10+3+2

第一步为装载,2~3为相加

  1. 扳出10(在实际中,取数也是一个自动操作 后面实现),按住GA,延时后按下RA,装载输入1的值为10
  2. 扳出3, 按住GA,这时候加法器已经得到了实时输出,按下TR,装载输出到寄存器
  3. 再按住GB,代表输出需要占用总线,数据传输到RA时按下RA装载结果,实现一次计算
  4. 重复2过程,扳出数字2…

4.添加一个控制器控制,列出真值表,即可得到控制器电路(K的状态相当于指令,控制器电路需要解析指令)。延时问题后面解决

  • 上面两个为模式,选择一个
  • 下面两个为当前模式下的操作,k0~x只有一个为1

image-20230511195305178

5.控制器优化,只使用一个控制

  1. 既然操作t只有一个为1,那么用循环移位寄存器RR实现

  2. 延时问题,我现在先让G(控制线先输出),而数据寄存器R需要再按下开关时才触发

    松开开关代表切换操作,松开状态下数据参数门打开

    松开后再按下代表上一个数据已经传过来了,要用快点用,按下瞬间装载数据

    也就是松开实现模式切换,按下实现数据保存

image-20230511195839855

全自动加法

现在还需要手动将数据输入,能不能一次性全部输入:需要先存储 存储器!!

单bit存储:输入和输出共用一条线,通过信号控制输入还是输出,G就相当于总线控制(输出器)

image-20230511193329800

存储器

把多个bit连一起就可以组成一个大数(一行),多个数就可以组成存储器,需要地址译码器选择哪个数据(门牌号)

image-20230511193502167

封装一下:输入:地址引线 RW , 输出n个bit

image-20230511193521662

磁芯

W:不同的电流方向导致不同的磁场方向

image-20230511193659896

R:写入一个0,如果原来是0,读出线上电压变化很小。如果原来是1,磁场变化导致读出线上感应电压大

image-20230511193820128

1949年10月21磁芯存储器专利

自动取数

需要一个计数器ACC,AR寄存计数器的值(地址寄存器),DR寄存数据(数据寄存器)

  1. 按下KAR锁存当前地址
  2. 按住KRD读取数据,同时按下KDR寄存数据
  3. 按下KAC实现地址增加

image-20230511201809307

同样使用一个循环移位1器和译码器实现上面的逻辑结构,至此按下三下即可取出一个数据到DR寄存器

image-20230511202034724

连接加法器

加法器包含2个操作,存储器包含三个,一共五个

image-20230511202615465

将相加还是装载添加到指令中,指令也是从存储器中取,指令通过EC解析后,翻译出当前的任务,反过来影响译码器,也就是告诉计算机进行的下一步操作。IR + EC + 译码器相当于是控制器

image-20230511203156283

image-20230511203046934

现代的指令中,数据可以直接包含在指令中。原来的AC更像是现代中的PC指针,指向指令的位置

image-20230511203602817

最后,把手动按下K换成一个振荡器,即可实现全自动。需要添加一个中止指令,代表程序结束了

如何处理进位?额外产生一个进位标志来影响控制器

image-20230512122031198

现代计算机

SRAM:使用晶体管构建触发器,形成存储器,SRAM,但太贵了6个晶体管一个bit,只用来做cache

DRAM:使用电容和晶体三极管,2ms刷新一次DRAM,做内存

ROM:一开始只读,然后可擦除。U盘、固态硬盘

外存:磁芯 —> 磁盘(机械硬盘 磁头+ 磁道 + 扇区) —> 固态硬盘

流水线:充分利用CPU和内存,错开执行 取指 译码 运算 写回操作

image-20230512125603868

IO设备

CPU从哪里读取数据:IO接口

什么时候去读:CPU不知道IO接口到底有没有数据

  • 不停的读:CPU不能干别的事情了
  • 定时询问
  • 中断:中断向量号表示谁请求了中断,再根据中断向量表转到相应中断处理逻辑