写在前面:这篇文章是我在学了五年计算机结果连门都没完全入后,决定重新了解“计算机”这个神奇玩意的总结笔记。不过笔者学习能力较差,学识也很浅,文中避免不了出现认知错误、逻辑不通等问题,若此文有出现哪些错误问题等,欢迎大佬指出交流改正,谢谢(*^▽^*)!!
我了解到的计算机发展过程
算盘(实现简单单纯计算,速度较慢)
通过进制法来计算
计算器(实现基本四则运算,速度提升,应用领域扩展)
机械计算器:加法器
步进计算器:乘法器,用来实现乘法运算
计算表:通过查表来快速查找到结果
差分机:能提高乘法速度和改进对数表等数字表的精确度(未成功实现,后由历史学家实现)
分析机:通用计算机(可以应用于多个领域)-借鉴于差分机的设计,在差分机设计中途提出
打孔卡片制表机:用来加快人口普查的速度
电子计算机(加入控制电路)(重点在于对开关的控制来模拟01)
继电器:(机械臂有质量,无法快速开关,部件容易损毁,故障多,出bug)
最大机电计算机之一哈佛马克一号(BM)
热电子管(真空管):会烧坏、价格昂贵、磨损少
二极管(电子单向流动)
三级真空管(在两级之间加入第三个“控制电极”)(计算机机电转电子)
无线电
长途电话等
巨人一号:第一个可编程的电子计算机
ENIAC:电子数值积分计算机,世界上第一个通用可编程电子计算机
AN/FSQ-7:SAGE防空计算机系统一部分
晶体管(控制电路中间加了半导体,小、快、可以进行上百万次切换、能工作几十年)
逐渐普及大众:IBM608
半导体:硅(硅谷)
晶体管中的逻辑门
二进制:只需要用true 和false来表示事物的状态
布尔代数:乔治布尔发明的,用两种状态解决所有运算和法则
布尔代数的三个基本操作和异或与在晶体管中构成的逻辑门
图片源于网络
我的逻辑门总结
用晶体管开关表示的0/1如何在计算机中表示数字字符(表示存储数据)
二进制:
因为计算机只能识别0/1,所以在计算机中的数据表示中人们采用了二进制的方法,二进制与十进制相似,都是逢(n)进一,所以二进制的每位数都只能是0或1,刚好适合了晶体管中对开关的应用。
在计算机中一位0/1就是1bit,而一个字节就等于八位二进制数1byte = 8bit
1KB = 1024byte(B字节) = 2^10byte
1MB =1024KB = 2^20byte
1GB = 1024MB = 2^30byte
1T = 1024G = 2^40byte
而现今的操作系统也分为32位和64位,32位可以处理将近43亿数据,而64位可以处理9.2*10^18数据。
正负数:在32位中,第一位用1/0表示正负,其余31位表示数字
浮点数:遵守标准IEEE754 0.781(有效数字)*10^3(指数)
32位浮点数:第一位表示正负,第二到九标识指数,其余23位标识有效数字。
字符编码:
ASCLL:用8位二进制来表示字母,符号(但该编码仅适用于英语)
unicode:用16位二进制数来表述字符(解决了不同国家之间不同语言的问题)
对表示存储的数据进行计算(开始计算数据)
算术逻辑单元ALU:包括算数单元与逻辑单元
算数单元
半加器
一个XOR门加一个AND门,一位表示进位(C),一位表示和(S),可以最大加1+1
图源网络
全加器
两个半加器连接在进位处加入一个OR门,可以完成三位二进制数的加法
图源网络
8位行波进位加法器:八个全加器相连,可以计算八个二进制位的加法,但当数据超过八位,也就是第八次出现进位时,就会产生溢出(overflow),这时候就需要32/64位加法运算器(但位数越多,就会出现越复杂繁多的逻辑门)
(不确定是八位全加器还是七位全加器和一位半加器)
图源网络
现代ALU:超前进位加法器(未详细了解)
逻辑单元:进行逻辑操作
将ALU抽象输入两个8位二进制,4位操作代码,输出8位结果以及一位标志位(flags:也就是三种特定状态, 零测试电路zero:判断两数是否相等 negative:判断第二个数是否小于第一个 overflow:判断第二个数是否大于第一个)
图源 原文链接: https://blog.csdn.net/weixin_52290314/article/details/124219557
将存储的数据放入到内存的过程,(开始存储数据)
计算机内存存储的特点:可以随机访问任何位置的数据
RAM(随机存取存储器)
SRAM(静态随机存取存储器)
如何在内存存取二进制数字:
存1:用到了一个OR门再加一个回路
图源视频:Crash Course Computer Science
由上表可见当AB输入都不为0时,输出结果都为1,就可以存储二进制1了
存0:用一个AND门加一个回路
图源视频:Crash Course Computer Science
由上表可见当AB输入都不为1时,输出结果都为0,就可以存储二进制0了
触发器:如何在内存中存取一位数字0/1
AND-OR锁存器:一个AND门和OR门的回路加上一个NOT门
图源视频:Crash Course Computer Science,A:复位线B:设置线
由上表可见只有当AB输入都为0时,输出结果就可以保证C前后一致,也就是与输入结果一致,就可以存储二进制0/1了
门锁:也就是完善电路,让电路的设置线与复位线连成一路,并设置内存的启动线
图源视频:Crash Course Computer Science
门锁实现了当允许写入线为1时,数据输入线为1/0,数据输出为1/0
当允许写入线为0时,数据输入线为1/0,数据输出线只能为0
寄存器:8位寄存器:将门锁简化为一个单元,同时通过一条线接入8个门锁的允许输入线。也就是位宽为8的一个寄存器,还可以通过此方式连接8、16、32、64个门锁,实现更多位的数据存储。
图源视频:Crash Course Computer Science
256位寄存器:16x16门锁矩阵:当门锁过多时,一条线连接多个门锁,需要连接的线路将成倍增多,就不是很方便了,这个时候就需要使用到矩阵
图源视频:Crash Course Computer Science
将门锁以这种矩阵的形式排列,当你想要存数据时,只要打开第几行第几列的的写入线即可。
多路复用器:
计算机想要访问矩阵的行列必须通过输入相应的地址,并将地址转换为行和列,列入第12行第2列,地址就可以写成1100 0010,前四位第几行,后四位表示第几列。
行列分别接入1-16多路复用器,前四位就就对应了行地址的每根线,后四位就代表了列地址的每根线
图源视频:Crash Course Computer Science
256位寄存器
图源视频:Crash Course Computer Science
可寻址内存(也就是一个完整的SRAM)
将8个256位寄存器顺序连接在一起,实现最多2048bit的数据存储,也就是可以存储256个字节
图源视频:Crash Course Computer Science
抽象这8个256位内存,即可得到一个可寻址内存,一个地址可以读取8位!!有疑问
图源视频:Crash Course Computer Science
DRAM
闪存
NVRAM等
以上几种内存与SRAM类型,只是不同的逻辑门、电容器、电荷捕获、忆阻器等
将ALU、寄存器、RAM整合,实现一个完整的运算流程(整合各个部件组成CPU)
如图,一个完整的简单的部件整合
图源视频:Crash Course Computer Science
组成部件:
4个8位寄存器(REGISTER A B C D):用于临时存放数据和操作数据,初始值都为0000 0000
控制单元:放入了指令寄存器和指令地址寄存器
指令寄存器外接逻辑门来检查操作码与指令表中的哪个操作码及指令相符,初始值为 0000 000
指令地址寄存器通过地址线将地址送入RAM,完成一次操作+1,初始值为0000 0000
ALU:算术逻辑单元,将操作码和寄存器送入的数据进行运算,并将输出结果暂存入控制单元,还要输出标志位
RAM:可寻址内存,相应的地址对应相应的数据,并与整个CPU单元用数据线、地址线、允许写入线、允许读取线连接。
时钟:管理CPU的节奏。
以精准的时间间隔,触发电信号,控制单元通过该信号推进cpu的内部操作,保证按顺序执行。
时钟速度:cpu的取指-解码-执行,完成一次也就是一周期,一周期=1赫兹(赫兹为时钟速度的单位),1兆赫兹 相当于1s100万个时钟周期
动态调整频率:时钟的频率也可以根据所需调整
超频:加快时钟频率
降频:降低时钟频率
以上结构CPU的执行过程如下
图源视频:Crash Course Computer Science
上图为操作码对应的指令表
第一次操作
取指阶段:
指令地址寄存器地址为:00000000,也就是返回RAM的0号地址的数据00101110
将得到的数据存入指令寄存器中,指令寄存器现在的数据为00101110
解码阶段:
指令寄存器的前四位为操作码,在控制单元中通过逻辑门检查识别操作码对应的指令,指令是否为LOAD_A,LOAD_A可以实现的功能就是将RAM中获取的地址存入寄存器A,检查成功后通过该电路将RAM的允许读取线与寄存器A的允许写入线打开
执行阶段:
指令寄存器的后四位为RAM的地址,1110转换为十进制也就是14,将允许读取线打开之后将地址14传入RAM,地址14对应的数据为00000011,也就是十进制3,因为0010操作码通过指令表查询可知该操作就是将地址对应的值放入寄存器A中。
将3放入寄存器A。此时寄存器A为00000011
关闭电路
指令地址寄存器的值 0000 0000 +1 = 0000 0001
以上三个步骤完成了一周期,接下来开始第二次操作
取指阶段
指令地址寄存地址现在为: 0000 0001 ,将地址通过地址线传入RAM后对应的数据为0001 1111
将得到的数据存入指令寄存器,此刻的指令寄存器数据为 0001 1111
解码阶段
指令寄存器的前四位为 0001,查看指令表 0001对应指令LOAD_B,该指令会将获取到的RAM数据存入寄存器B中
在控制单元先识别操作码对应的指令,识别成功通过识别电路打开RAM的允许读取线与寄存器B的允许写入线
执行阶段
指令寄存器的后四位为1111,1111转换为十进制是15,将地址15传入RAM对应的数据为0000 1110,也就是十进制的13
将13放入寄存器B中,此刻寄存器B的数据为 0000 1110
关闭电路
指令地址寄存器的值 0000 0001+ 1 =0000 0010
接下来进行第三次操作
取指阶段
指令地址寄存器的数据为 0000 0010 ,将地址传入RAM后对应的数据为1000 0100
将得到的数据存入指令寄存器,此刻指令寄存器的地址为 1000 0100
解码阶段
指令寄存器的前四位为 1000,对应指令表中的 ADD指令,该指令的功能是将两个寄存器中的数据相加,并把结果存入后一位中
在控制单元中识别操作码对应的指令
执行阶段
指令寄存器的后四位代表的不再是RAM的地址,而是用两位来代表寄存器,其中00代表寄存器A,01就代表寄存器B
0100就是将寄存器B的数据放入ALU的第一个输入,而将寄存器A放入ALU的第二个输入
控制单元通过上述操作码1000的指令,将该指令发送给ALU,告诉ALU即将要做出什么运算。
在ALU中计算了寄存器B 0000 1110 +寄存器A0000 0011的值得出结果 00010001
然后将得出的结果暂存入控制单元,关闭ALU,之后将暂存的结果传入寄存器A中,
此刻寄存器A的数据为:0001 0001 寄存器B的数据为: 0000 0011
关闭电路
指令地址寄存器的值 0000 0010 + 1 =0000 0110
接下来进行最后一次操作
取指阶段
指令地址寄存器的值此刻为 0000 0110,将该地址传入RAM对应的数据为 0100 1101
将得到的数据通过数据线传入指令寄存器,此刻指令寄存器为 0100 1101
解码阶段
指令寄存器的前四位为0100 ,操作码0100对应指令表的的STORE_A指令,该指令的功能为将寄存器A中的值放入RAM中
在控制单元中识别操作码的对应指令、并通过识别电路将RAM的允许写入线和寄存器A的允许读取线打开
执行阶段
指令寄存器的后四位为1101,转化为十进制也就是13
将寄存器A的数据 0001 0001通过数据线传入RAM的13地址中,此刻RAM的地址13,对应的数据就为0001 0001
关闭电路
指令地址寄存器的值 0000 0110 + 1 = 0000 0111