取数
通过PC取操作指令,到MAR中寻找地址,根据地址找到数据给MDR再由MDR交给IR IR再交给执行控制单元CU CU通过分析指令得知这是取的操作,取得数得地址就是指令的后半部分,然后IR根据地址到MAR查询然后再存储体中找到数据交给MDR 这个时候MDR就会直接将数据传给ACC
PC-MAR-M-MDR-IR
OP(IR)-CU
AD(IR)-MAR-M-MDR-ACC
存数
PC-MAR-M-MDR-IR
OP(IR)-CU
AD(IR)-MAR-M
ACC-MDR-M
加法
PC-MAR-M-MDR-IR
OP(IR)-CU ==+
AD(IR)-MAR-M-MDR-X
ACC+X->ACC
减法
PC-MAR-M-MDR-IP
OP(IR)-CU ==-
AD(IR)-MAR-M-MDR-X
ACC-X>ACC
乘法
PC-MAR-M-MDR-IP
OP(IR)-CU *
AD(IR)-MAR-M-MDR-MQ
ACC-X
ACC0
X*MQ>ACC(high)+MQ(low)
2^MAR位数 * MDR位数 得出多少bit
每个io设备通过BR线发出请求,控制部件根据请求顺序,通过BG线来允许设备占用总线,若此时设备响应设需要向BS发出指令,表示占用总线
每个设备发出请求,总线控制器则有一个计时器,再根据设备总线来以此查询各设备是否发出请求,若发出则该设备发信息到BS线
每个设备发出请求,控制器中的排队器对请求得优先级排序,再对设备通过BG线进行应答
磁头先寻道,找到之后磁片旋转到目的扇区
flash memory 充当中间层 主存快速读取副存的内容
cache 是cpu 和 主存之间的桥梁 速度比主存快
缓存和主存之间最大的问题是速度不匹配,为了解决这个问题主要用了特定的硬件来做。
主存和辅存则是解决容量问题这里是软硬件结合来做的通过虚拟存储器,来构造逻辑地址,当程序装载时再转化成主存中的真实地址
MAR MDR 现在集成在了cpu中
按字寻址:根据子长发现一个字是由几个字节组成的 按字寻址则只需要找到几个字节中的首字节就能找到该字的全部字节,我觉得有些浪费内存
译码驱动:cpu给出地址通过总线中的地址线传输给主储存器的译码驱动,根据译码驱动单元确定存储矩阵的某个具体单元来完成存取操作
读写电路:连接数据线
片选线:存储器内部有很多片,片选线可以确定访问的地址在哪片当中,一般有两种CS CE
读写控制线:操作信号
首先用八个芯片组成16k8位的存储器同样的地址同时操作相当于16k个地址8位的宽度
由于要变成64k这个64k则表示地址容量所以要增加地址容量就必要再增加芯片数量由于要保持8位的同时输入输出所以只能再之前的16k8的基础上再增加三组这样地址总数也达到了64k,这个时候为了能够保持一组当中的芯片能同时读取则需要把芯片中的片选线集合在一起,给第一组分配0-16k的地址,往后每组地址以此类推
存取周期表示连续两次的写或读操作所需要的最短时间
由于电容容易漏电所以需要经常刷新,刷新的时候是刷新行地址,刷新一行的数据。
内存在计算机运行时都会不停的刷新数据,有几种刷新的方式
增加了存取周期,并且每进行一次存取周期都会刷新一行,但并不需要这么高的刷新频率 如第一种方式那样2ms只刷新一次128行,但如果这种方式就会在2ms内刷新多次128行了
异步刷新则综合了前两种方式,我们的目的是在刷新周期内将所有的行刷新一次,如在2ms内刷新128行,故我们只需要每过15.6us 就进行一行的刷新这样2ms就可以完成128行的刷新了
两个片同时使用共同的地址
有一个关键点就是如何让两片同时工作,即根据第11根地址线来控制cs 来决定那一片被使用
高位交叉是在同一个存储体内从上到下顺序执行,同一时刻只在一个存储体内工作
浪费带宽,主要用于存储器容量的扩展
程序在存储体见横向存储这样在同一时刻可以有多个存储体,因为cpu可以不断的输入地址码 ,这样实现了流水线操作
tao的意思时总线传输数据的周期,总线周期分为地址周期、控制信号周期、等待时间周期、数据传输周期
依靠程序访问的局部性原理来提高缓存的利用率
主存的块地址号和缓存的块地址号时对应的 块的大小是相同的 块内地址位数也是相同的 内存和缓存间传输数据时整块传送的,所以块号和块内地址都不会发生变化
块内地址就是数据在块内的偏移地址
cpu如何命中cache中的块?
根据地址中的主存储块号来对比cache中的标记号,若有相同的则命中
cpu对内存的访问过程
通过地址总线传输地址
地址分为块号和块内地址
块号拿出给cache的一个控制结构处理检查是否命中即(存储体中有该标号)命中则根据块号和块内地址直接访问cache存储体
若未命中则检查是否可以装进块到cache中若时则将块放入cache中
若不能则需要cache替换机构根据替换算法来决定替换cache中的哪些块
主存和cache存储体间有直接通路可以交换数据
cache可以分布在cpu内部或者主板上
直接映射方式
首先要明确的是一个地址分为块号和块内地址
在直接映射中块号位数=主存字块标记t位+cache字块地址c位
所以在主储存体中用了2^(t+c)个块由于高速缓存的大小是远远小于主存的,所以我们称cache存储体的大小为一个区
而为了达到直接映射的目的,所以我们也把主存上的块为划分为区 这个时候按照cache字块地址的位数c可以把chache划分为2^c个块 主存为了达到相同的效果所以把块号的c个低位哪来当块号 用t位来当区号 这样就形成了2^t个区
当cpu给出一个地址后,我们可以先根据块号先定位到cache中的对应块号,再根据 地址中的区号来与在cache中定位到的块的标记做比较相等区则表示命中,反之未命中
优点:速度很快,我们可以快速的判断是否命中cache块
缺点:cache的利用率很低,在程序执行的时候若有跳转指令则可能调到例外区块上的在cache中已经被占用的块的位置,这个时候就有冲突,之前的cache块就要被替换,当这个时候其他的cache块都是空的没有利用到、
这种映射方式 仍是将主存分块 但并没有为块分区因为可以随机把主存中的块放入cache中的任意块
cpu给出一个地址 只需要将主存块标拿出来和cache存储器中的没块的标记进行比较若相等则命中
缺点:电路难以设计,在映射的过程中标记位比较长效率不高
优点:命中率高
首先要理解什么叫做组?主存中每个区的相同编号的块的集合,大小由组内位置所决定
首先我们从公式中可以理解cache中有多少各组那么对应的主存中每一个区就有多少个块,映像当中每个区的第一块都可以放在cache中第一个组中的任意一个字块,即通过每个块在所在区的块号我们可以得知他会被放在cache中的哪个组、
优点:减少了直接映射的那种冲突问题
这个比较牛皮
这种模式的关键在于分组,它综合了直接映射和全映射的模式这了个中
当r=c时 这个时候只有一个组 这个时候就变成了全相连
当r=0时 这个时候变成直接相连
在cpu的cache可以采用直接映射
中间层次的cache可以采用组相连映射
先进先出算法
比较垃圾存在很多问题
最少使用算法LRU
比较好
磁盘驱动器送来信号表示操作的磁道,音圈电机操作小车移动读写臂进行寻道
数据控制则是完成数据的转换和读写控制
io接口和io设备之间并行传输并需要请求应答过程
同步的关键
主机必须要要有统一的时标,时表规定了在某一个时间点必须开始或完成的工作 跟总线的周期一样
程序启动io设备过后没有停止等待,而是转而执行现行程序,等到io借口中的数据准备好后向cpu发出程序中断请求后cpu保存当时现场转而和io接口传送数据,传输完毕后恢复现场继续执行程序
缺点:需要各种指令来控制现场和中断等
我觉得DMA牛逼
设备选择线 通过cpu传输过来的设备地址与io接口中的相匹配 匹配即选中
数据线: 双向 多根
命令线 cpu发出的命令
状态线 :表明设备的工作状态
接口功能:
1 选址 由设备选择电路组成
2 传送命令的功能 由命令寄存器,命令译码器完成
3传送数据的功能 由数据缓冲寄存器完成
4 反应设备状态的功能 设备状态标记 由触发器实现
每个io设备会发出中断请求,请求会在排队器中排队,确定优先级(硬软)、
cpu根据求求确定中断向量地址(中断向量地址形成部件)
可以看到中断向量地址形成部件传输到cpu后再到内存中取指 这里jmp到200 执行打印机服务程序
首先cpu用过地址线选择到设备,再通过启动命令来通过与门 这时会让d为0 b为1 b为1则会启动设备 ,设备将数据读入到数据存储器中,设备结束工作 这个时候将d置为1 cpu不断查询的设备的状态就是d是否为1 当d为1时 cpu就知道可以通过数据线读取数据寄存器的数据了
1选择设备和启动命令
2 d0 b1 设备启动并准备好数据到DBR
3 d1 b0
4 mask =0 INTR的D端输入为1
5 cpu 进行中断查询 置INTR为1、
6INTR发出中断请求,并且在排队器排队
7 cpu响应请求通过设备编码器将请求从排队器中拿出形成向量地址 再有cpu从向量地址中读取跳转指令或者中断程序的地址,最终执行中断服务程序,中断服务程序再从DBR中读取数据。
单中断和多重中断
关键在于多重中断在中断服务程序中会开中断,允许这个中断服务程序被其他的中断服务请求打断
指令解释的过程中控制单元发出的一些指令,这些指令要完成的动作和整条指令要完成的工作相比要小。所以叫微操作命令
完成一条指令的四个工作周期
取指
间址
执行周期 完成操作数的取数和计算的工作
pc传到MAR 通过地址总线传递给存储器,cu发出读命令,指令通过数据总线到MDR,再到IR
cu要判断指令的op pc+1、
间址周期
在取指的基础上 cu应该会分析处IR码中的指令特征
为间址这样就将指令的形式地址发给MAR
MAR通过地址总线到存储器
cu发出读指令
存储器将操作数的实际地址发给MDR
MDR将实际地址添加到AD(IR)
1,非访存的指令
CLA 清acc 0->ACC
COM 取反 将ACC取反
SHR 算术右移
CSL 循环左移
2 访存指令
转移指令
时钟控制控制单元发出各种类型的信号
一个机器周期中存在许多的微操作
时钟周期是控制计算机操作的最小的时间单位
一个时钟周期可以做一个或多干个微操作
一个微操作也可能花费多个时钟周期
将一个机器周期划分成活干个时间相等时间段(时钟周期)
用时钟周期控制产生一个或多个微操作命令(并行的执行)
一般存在访问内存的机器周期时间会长一些
脉冲信号周期内是没有信号的。就象人的脉搏一样。脉冲信号一般指数字信号,它已经是一个周期内有一半时间(甚至更长时间)有信号。计算机内的信号就是脉冲信号,又叫数字信号。
cu会发出各种的有序的微操作命令(控制信号),这些信号都是有先后关系的,有固定的时间点
而先后关系和时间点的确定就是由节拍信号所控制的
所以必定有一个节拍发生器产生信号输入到cu中
节拍发生器的外端接的时计算机主频算是主时钟 (我理解为产生脉冲信号(数字信号)一个周期激发态占一半时间)
节拍发生器会产生多个节拍信号(我理解为时钟周期)输入到cu中
在每个节拍信号的起始端(上升延)cu会产生给定的控制命令(微操作 产生何种微操作与现在执行的时哪条指令有关系)、
op(IR)经过译码以后会有n位连接到cu中但只有一位是1 (高电平),cu会根据这个来判断出是什么样的操作,再通过标志位(比如说有些跳转指令需要标志位)来产生在一个节拍信号中所要进行的微操作 例如到c0-ck中有一个或几个有效,并且在同一节拍中有效的微操作可以时并行的。
cu 在操作码 节拍信号 标志位 的输入下,产生控制信号1-12 还有对算术逻辑单元的控制信号,以及根据计算结果修改标志位
t0:两个微操作操作的对象不同可以在同一个节拍执行
t1:两个微操作操作的对象不同且没有依赖关系可以调换顺序
t2:两个微操作只在cpu内部进行没有访存操作时间快 一个节拍放两个操作也行,这个两个操作有先后顺序
在cu中通过硬件电路来控制 控制信号的产生 比如上图 能够在不同机器周期和节拍产生同一种指令
上面这样列表格的作用就是根据表格得出每一个控制信号的表达式 再根据表达式来画出逻辑图
逻辑图清楚的表明了控制信号会在哪种情况下产生
比如说在上图的控制信号会在取指阶段的所有指令下的t1节拍中产生
设计思想
将一个节拍中的可以并行操作的微操作合并成为微指令 微指令中的 1代表执行1这个位置所代表的微操作即发出控制信号 ,由多个微指令构成的叫做微程序 一个微程序对应一个条机器指令 一个微指令对应一个节拍且对应1一条或多条可以并行执行的微操作
微程序控制单元的基本框图
指令操作码-》微地址形成部件-》顺序逻辑(在标志位和时钟信号的控制下)展示微程序的首地址(第一条微指令)给CMAR(控制内存地址寄存器)-》将地址交给地址译码器到控制存储器中取出微指令到CMDR中同时还会取出下一微指令的地址,最后由CMDR来将控制信号传递给cpu内部和系统总线
注意的时 微地址形成部件给出的时微程序的地址,再由顺序逻辑在多个地址中选择,选择正确的地址送入到控制存储寄存器。
之一微指令的格式:操作控制码 顺序控制码(下一条微指令的地址)
需要注意的是:
微地址形成部件会决定每个周期微程序的首地址
在M+2的微指令的地址码区不能表明下一跳微指令的地址 ,这里要执行其他的指令周期,这个时候需要微指令地址形成部件根据操作码再生成下一个周期(比如说执行周期或者间址周期)的首地址
个人感觉逻辑控制单元设计和微程序设计差别在于逻辑控制单元是根据节拍 标志位 操作码 通过逻辑电路动态生成控制信号的,而微程序设计则是提前将控制信号保存在只读内存中,需要用某一个微程序时从控制内存中读出微指令,微指令则表明了一个节拍中可以并行执行的控制信号,这样指令的执行过程就只是把微指令从控制内存中读出来而已,不需要动态生成
微程序设计还有两个关键的地方
1、微指令的控制信号字段该如何组合,怎么用来表示控制信号
2 如何形成下一条地址
1直接编码
在控制字段当中每一位代表一个微操作命令
1微指令的下地址段指出
2根据机器指令的操作码形成
3增量计数器
因为负数的绝对值要和补数的绝对值相加等于模数(我理解模其实相当于进位+1 原本的位全部归0)
对于补数的理解
+6 + -3 模为4
+6 +0110
-3 -0011
+0110 + -0011 = +0011 =3
-3 的补数为 1101 补码为11101
+0110 + 1101 = 1,0011 除去模即溢出位 为 0011
所欲 +6 + (-3|-3的补数)结果都一样
补码高位仅仅是为了表明这是负数的补码
一般用于浮点数的阶码部分
顿悟:可以直接用补码的补数部分减去模得到真值
译码和补码其实就是符号位取反
负数补码向右移动一位表明真值扩大了一倍 所以对应的补数也要扩大
负数补码向左移动一位表明真值缩小了一倍 所以对应的补数也要缩小
结论 无论是什么码 左移都代表真值翻倍 右移都代表真值减小一倍
对于这个的理解:
对于不同的真值丢弃对真值的填充的值是没有影响的 但丢弃非填充值则有影响
负数的反码丢弃0则会出问题
练习二 可以口算得出正确结果为-138 但是机器字长只有8位 表示的的范围为-128-127 -138 超过了表示的范围、、
最高有效的进位表示数值部分相加产生的进位
符号位的进位表示两个符号位相加产生的进位
负数相加没产生溢出表明最高有效位的进位为1
正数相加没产生溢出表明最高有效位的进位为0
a是被加数
x是要被运算的数
ga为1表示加法
gs为1 表示减法
做减法的时候由于最终是要做加法 所以要把被操作数进行全取反(符号位也要取反)+1的操作,+1的操作可以由其他加法器或者就用上图的加法器进行操作,然后暂存到acc中 再放回x中 之后再去被加数到acc中