冯诺依曼体系各硬件工作原理解析
Posted 捕获一只小肚皮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冯诺依曼体系各硬件工作原理解析相关的知识,希望对你有一定的参考价值。
文章目录
计算机结构体系来源
1946年,美国发明了世界上第一台计算机ENIAC,可用于比较快速的数据计算,但是其运算速度却受到了人工数据的输入速度的限制,为此我们现在所广为人熟悉的大佬 冯诺依曼提出了程序存储的概念:
- 将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
当采用程序存储概念以后的计算机,其运算速度得到了明显提升,比如第一台采用冯诺依曼体系结构的计算机EDVAC(electronic discrete variable automatic computer)
,翻译过来就是电子离散变量自动计算机;
冯诺依曼体系结构
冯诺依曼体系结构由五大设备组成,分别是: 输入设备, 运算器, 控制器, 存储器和输出设备,它们之间的关系如下:
-
输入设备的作用是: 将信息转换为机器能识别的形式,即二进制数据;
-
运算器设备的作用是: 作为其输入设备和输出设备的中转站; 把数据从存储器来回运输; 进行算术运算和逻辑运算; (这里说的是冯诺依曼结构里的运算器作用);
-
存储器设备的作用是: 存储计算机数据和程序,注意数据和程序在本质上都是二进制,属于等价关系,所以存储器对它们一视同仁;
-
控制器设备的作用是: 从存储器设备读取和解析相关指令,比如加减乘除运算指令,然后指挥程序运行;
-
输出设备的作用是: 将二进制数据转换为人类能识别的形式,比如文本,图像;
冯诺依曼体系结构的特点:
- 整个机构由五大部件组成;
- 数据和程序指令在存储器中同等地位,且都是二进制形式,可以按照地址寻访
- 指令由操作码和地址码组成;操作码代表加减乘除等运算行为,地址码代表所存储的数据在哪个位置
- 可以存储程序;
- 整个结构以运算器为中心(输入输出设备的数据都需要运算器进行传送完成,这将会导致运算器执行本来不该他执行的工作,导致效率比较低(相对来说)),这就是冯诺依曼体系的缺点
因此,现代计算机避免了此缺点,将计算机设计成了让输入输出设备和存储器进行直接相连,即以存储器为中心
而我们所熟悉的CPU,其实就是控制器和运算器的集合体,所以现代计算机模型大致如下:
因此本文的所有硬件结构大致可以如下展示:
这里需要提醒一下:
主存这里指的主存储器,即我们常说的内存条,或者手机说的运行内存,属于通电闪存;
而辅存指的是硬盘等大容量容器,比如电脑的SSD,或者手机上的256G等大容量
主存储器的基本组成
主存储器结构主要又三个部分组成:
- 存储体: 存储数据和代码指令
- MAR(memory address register): 存储地址寄存器,用于查找地址
- MDR(memory data register): 存储数据寄存起,用于向存储体存数据或者取数据
为了方便理解,主存储器的结构可以用快递驿站进行类比:其存储体相当于驿站的存物架(具有表示哪个架子,几层,几号的标记),MAR相当于柜员,MDR相当于柜台,而我们相当于CPU;
当我们想取地址为10-8-3上面的包裹时,我们可以将该地址告诉柜员(MAR),然后MAR根据地址去取第10个柜台,第8层,上面排列着的第3个包裹放到柜台上(MDR),然后我们(CPU)从MDR上取走快递(数据)
当然这仅仅只是为了方便理解进行的类比,并不一定准确
而存储体的结构如下:
存储体被划分为了一个个单元,称为存储单元,每个存储单元里面存放着一串二进制代码
而每个存储单元中存储的所有二进制内容的组合称为一个word,即字,有时也称为存储字
而word的长度,我们称为存储字长,即二进制的位数;
运算器的基本组成
运算器的基本作用是实现算术运算(如加减乘除)和逻辑运算(如与或非),它的内部主要由ACC,MQ,ALU和X寄存器构成;
- ACC(accumulator),累加器,用于存放操作数或累加结果
- MQ(Multipul-quotient),乘商寄存器,用于存放操作数或乘商结果
- X, 通用操作数寄存器,用于存放操作数
- ALU(arithmetic and logic unit),算术逻辑单元,通过内部复杂电路实现内部算术或者逻辑运算,被称为CPU的核心元件
也就是说前三者都是用来存放数据,后者用来进行计算
其中ACC,MQ,和X存放的数据如下表
加 | 减 | 乘 | 除法 | |
---|---|---|---|---|
ACC | 被加数,和 | 被减数,差 | 乘积高位 | 乘积低位 |
MQ | ***** | ***** | 乘数,乘积低位 | 商 |
X | 加数 | 减数 | 被乘数 | 除数 |
控制器的基本组成
控制器的作用是统筹全局,用以发布各种控制信号,其内部主要由三个部件组成:
- CU(control unit): 控制单元,分析指令,给出信号
- IR(instruction register): 指令寄存器,存放当前指令
- PC(program counter): 程序计数器,存放下一条即将执行的指令的地址,具有自动加一功能
计算机的工作过程
了解冯诺依曼体系结构的三大核心模块以后,我们就可以开始进行尝试进行程序执行模拟
假设这里有一段C代码:
int main()
int a = 2,b = 3,c = 1,y = 0;
y = a * b + c;
return 0;
计算机为了执行出y最终的值,编译软件会首先将该程序进行编译为机器语言存储到了主存储器,最后形成了如下数据(实际存储器只会存储有中间只能栏的数据,其他地方只是为了方便理解添加的),这里温馨提醒后面的操作要多看这张表格
根据该表,计算机CPU中的PC(程序计数器program counter)初始位置存放的是地址0
-
(PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 0,然后PC自增1
-
M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的0地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0000010000000101 -
M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0000010000000101
-
(IR)—>CU, IR将指令的**控制码(000001)**发给CU,CU进行分析,发现是“取数操作”指令
-
(IR)—>MAR, IR将指令的**地址码(0000000101,十进制为5)**发给主存储器的MAR,此时的(MAR) = 5
-
(MAR)—>MDR, 主存器中的MAR去存储体中的5地址读取数据,然后放到MDR中,此时的(MDR) = 0000000000000010,即十进制数字2
-
(MDR)—>X, MDR将值传给X进行存储
(1-3)步骤可以看做在取指令,(4)步骤可以看做在分析指令,(5-7)可以看做在执行指令(即读数据)
(上面的操作过程路径)
到这里算完成了把a的数据放进CPU中的运算器;
然后此时的PC值为1(前面步骤已经自增过):
- (PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 1,然后PC自增1
- M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的1地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0001000000000110 - M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0001000000000110
- (IR)—>CU, IR将指令的**控制码(000100)**发给CU,CU进行分析,发现是“乘法操作”指令
- (IR)—>MAR, IR将指令的**地址码(0000000110,十进制为6)**发给主存储器的MAR,此时的(MAR) = 6
- (MAR)—>MDR, 主存器中的MAR去存储体中的6地址处读取数据,然后放到MDR中,此时的(MDR) = 0000000000000011,即十进制数字的3
- (MDR)—>MQ, MDR将值传给MQ进行存储
- 然后控制单元给ALU发乘法运算信号,ALU便开始执行乘法运算ab = 23=6,最后将结果放在ACC
(1-3)步骤可以看做在取指令,(4)步骤可以看做在分析指令,(5-7)可以看做在执行指令(即读数据),(8)是CPU在进行计算
(上面过程的操作路径)
现在PC的值为2:
- (PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 1,然后PC自增1
- M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的1地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0000110000000111 - M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0000110000000111
- (IR)—>CU, IR将指令的**控制码(000011)**发给CU,CU进行分析,发现是“加法操作”指令
- (IR)—>MAR, IR将指令的**地址码(0000000111,十进制为7)**发给主存储器的MAR,此时的(MAR) = 7
- (MAR)—>MDR, 主存器中的MAR去存储体中的6地址处读取数据,然后放到MDR中,此时的(MDR) = 0000000000000001,即十进制数字的1
- (MDR)—>X, MDR将值传给X进行存储,导致(X) = 1;
- (ACC)+(X)—>ACC,控制器给ALU发送加法信号,ALU进行a*b(前两部算过) + c(这个步骤做的事情),然后存储到ACC中,此时ACC=7(2*****3+1)
(上面操作过程路径)
此时的PC=3:
-
(PC)—>MAR,PC寄存器将自己的地址告诉给MAR,此时(MAR) = 3,然后PC自增1
-
M(MAR)—>MDR,控制器给MAR发送读信号,主存储器中的MAR去存储体中的3地址位置读取数据,然后放到MDR中,
此时的(MDR) = 0000100000001000 -
M(MDR)—>IR,MDR将自己的数据交给控制器中的IR存放,此时的(IR) = 0000100000001000
-
(IR)—>CU, IR将指令的**控制码(000010)**发给CU,CU进行分析,发现是“存储操作”指令
-
(IR)—>MAR, IR将指令的**地址码(0000001000,十进制为8)**发给主存储器的MAR,此时的(MAR) = 8
-
(ACC)—>MDR,控制器发送给运算器信号,ACC将数据发送给MDR;
-
然后MDR根据控制器发送的存储信号,去地址MAR=8处存数据(ACC) = 7;
最后同理,此时PC=4
继续按照上面的逻辑进行读数据,最后当IR给CU控制码时候,CU发现是停机指令,所以控制器就会发送中断信号,终止程序继续运行;
总结
以上是关于冯诺依曼体系各硬件工作原理解析的主要内容,如果未能解决你的问题,请参考以下文章