随看随记
- MAR(主存地址寄存器)和MDR(主存数据寄存器)不是CPU的组件,但是常常把他们两个集成到CPU中。
- ()中保存的是地址,或者寄存器,表示地址或寄存器中的内容。例如AD(IR):AD表示的是IR地址中的内容
- 一条机器指令对应一个微程序,这个微程序是由若干条微指令构成的。因此,一条机器指令的功能是若干条微指令组成的序列来实现的。简而言之,一条机器指令所完成的操作划分成若干条微指令来完成,由微指令进行解释和执行。
- 在这篇博客中。指令是一句话,操作是给出指定的硬件的信号。
指令系统
机器指令
- 机器指令的一般格式包括操作码字段和地址码字段
- 操作码字段也不一定要集中在一起,下图也只是个表示方式。
操作码
- 操作码主要反应计算机想要做什么操作。
固定长度
- 用于指令字长较长的情况,RISC(精简指令集计算机 Reduced Instruction Set Computer RISC) ,和程序局部性原理有些许类似,80%的常用程序,仅使用了20%的指令集
长度可变
- 主要采用扩展操作码技术。
扩展操作码技术
- 这里展示了使用特有码点作为操作码扩展位的技术。
- 扩展操作码主要通过减少指令集中的地址码的个数。
- 以下图为例,四位操作码的指令集中可以有三个地址指令,操作码最多是从0000~ 1110(0~ 14) 共15条。1111开头的操作码指令作为特殊码点,用来表示这个机器指令是8操作码指令。即8操作码指令的机器指令开头必定是1111。12操作码指令的机器指令开头必定是1111 1111。16操作码指令的机器指令开头必定是1111 1111 1111。
- 同时也可知1111 、1111 1111、1111 1111 1111都是特殊码点,但是1111 1111 1111 1111 不是特殊码点,因此4、8、12位操作码都是最多15条指令,16位操作码可以有16条。
- 同时当操作码长度变大了,地址码的长度就变小了。因此4、8、12、16位操作码分别对应了三地址指令、二地址指令、单地址指令、零地址指令。
- 短操作码一定不能是长操作码的前缀,否则在编译的时候可能就会出错。
- 三地址指令减少一个地址数,最多可以产生2^4 种二地址指令。(当1111 1111不作为特殊码址时,是可以16种二地址指令。当1111 1111作为特殊码址时,是15种二地址指令).
- 二地址指令减少一个地址数,最多可以产生2^4 种单地址指令。
- 高频常用指令用短操作码表示,低频指令使用长操作码表示。
地址码
四地址码
- 从四地址操作码开始:四地址操作码中,四个地址分别表示,A1第一操作数地址,A2第二操作数地址,A3结果地址,A4下一条指令的地址,其得出来的结果就是下一个机器指令的OP部分操作码。
- 其操作就是A1和A2进行操作后,得出结果存储到A3中。
- 在这个操作中进行了四次访存,包括取指令(A4),取第一操作数(A1),取第二操作数(A2),存第三个操作数(A3)。
- 四地址操作指令的寻址范围太小了,每个地址只有2^6 = 64位。为了提高每个地址的寻址范围,减少地址码的个数。
三地址码
- 和四地址码相比,通过PC(Program Counter,指令计数器)来寻找下一条指令的地址,而不是从存储器中访问,这样可以节省一个地址码的个数。因此寻址范围从2^ 6 变成了 2 ^ 8= 256个。
- 虽然是PC寻址,但是PC依然要访问存储器,因此依然是四次访存,到那时寻址的范围扩大了。取指令(PC),取操作数(A1),取操作数(A2),存结果(A3)。
二地址码
- 和三地址码相比,可以将计算结果存储到A1或A2的地址中,而不是另存到A3中。因为不需要A3地址,因此寻址范围又扩大了到了2^12。
- 访存依旧是四次,取指令(PC),取操作数(A1),取操作数(A2),存结果(A1或A2)。
单地址码
- 和二地址码相比,将操作的结果存储到ACC寄存器中,这样就可以减少2次访存的次数,同时仅仅需要下一个操作数的地址,因为上一个操作数保存在ACC中了。寻址范围又扩大了到了2^24
- 访存是二次,取指令(PC),取操作数(ACC),取操作数(A1),存结果(ACC)。从ACC中存取是不需要访存的。
零地址码
- 无地址码,主要对ACC进行操作,例如归零之类的不需要地址的操作。
指令字长
- 指令字长决定于:操作码的长度、操作数地址的长度、操作数地址的个数
- 指令字长分为两种情况:
- 指令字长固定:指令字长=存储字长
- 指令字长可变:按字节的倍数变化
- 当使用寄存器存储相应的操作数或操作码时,可以不访存。
操作数类型和操作种类
操作数类型
- 地址:无符号整数
- 数字:定点数、浮点数、十进制数
- 字符:ASCII
- 逻辑数:逻辑运算
数据在存储器中的存放方式
- 数据在主存中的存放方式包括大端方式和小端方式。分类的方式根据地址的高位(12)在主存中的存储位置。
- 如果字地址(0,4,8)存储的是高位,就是大端存储方式。 如果字地址存储的是低位,就是小端存储方式。
从任意位置开始存储
- 下面图中的每一行都是16个字节,前面的字地址是16进制
- 字节编址,数据在存储器中的存放方式(存储字长64位,机器字长32位)为例
- 优点:不浪费存储资源。
- 缺点:除了访问一个字节之外,访问其它任何类型的数据, 都可能花费两个存储周期的时间。读写控制比较复杂。
- 因为是从任意的位置开始存储,因此需要判断数据的位置和长度以及是否跨存储字,这样就会增加访存的时间。
从一个存储字的起始位置开始访问
- 优点:无论访问何种类型的数据,在一个周期内 均可完成,读写控制简单。
- 缺点:浪费了宝贵的存储资源
边界对准方式(从地址的整数倍位置开始访问)
- 数据存放的起始地址是数据长度(按照编址单位进行计算)的整数倍。如果是双字,就是按照8byte的倍数,如果是单字就按照4byte的倍数。如果是半字就按照2byte的倍数,如果是单个字节就是1的整数倍
- 本方案是前两个方案的折衷,在一个周期内可以完成存储访问,空间浪费也不太严重。
操作类型(这一部分包括了很多汇编得内容,没学过汇编,强行理解一下吧)
数据传送
- 数据从一个位置转移到另一个位置
- 对于堆栈来讲是在内存中,因此可以使用PUSH,表示入栈。POP表示出栈。
- 也可以是将指定的寄存器清0等操作。
算术逻辑操作
- 就是上一大部分所学习的东西,包括加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算、与、或、非、异或、位操作、位测试、位清除、位求反。
- 这类操作可实现算术运算和逻辑运算。有些机器还具有位操作功能,如位测试(测试指定位的值)、位清除(清除指定位)、位求反(对指定位求反)等。
移位操作
- 算术移位 逻辑移位 循环移位。
转移操作
- 无条件转移:JMP
- 条件转移:
- 调用和返回:和我们写代码时的函数调用是一样的。
- 陷阱(Trap) 与陷阱指令(意外事故的中断)例如操作数异常,运算结果外溢等等。一般不提供给用户直接使用,在出现事故时,由CPU自动产生并执行(隐指令)
- 有些陷阱指令是供用户使用的陷阱指令,完成系统调用
输入输出(相对于I/O来说)
寻址方式
- 寻址方式分成两种
- 确定本条指令的操作数地址:数据寻址
- 下一条要执行指令的指令地址:指令寻址
指令寻址
顺序寻址和跳跃寻址
- 顺序寻址是和PC(程序计数器)有关的,当一条指令操作完,PC+1按顺序执行下一个指令。
- 这里的+1指的是按顺序的意思,如果指令的字长较大的话可能是+2,+4等。
- 跳跃指令:如图所示,指令地址3跳转到指令地址7。
指令寻址
- 数据寻址的机器指令结构如图所示
- 形式地址A:指令字中的地址,需要经过一定的操作,转化成有效地址,进行寻址。后面的EA表示有效地址。
- 有效地址:操作数的真实地址,可以直接寻找的操作数的地址。
- 约定 指令字长=存储字长=机器字长
数据寻址
立即寻址
- A中存放的就是操作数,因为A中存放的就是操作数,因此不需要访存。
- 但同时A的位数也限制了A中能够存放的立即数的范围。
- 寻址特征#表示的A中存放的就是立即数。
直接寻址
- A中存放的是EA,有效地址,有效地址中存放了操作需要的操作数。
- 执行阶段访问一次存储器,取出这个操作数,放入ACC中。
- A的位数也限制了A的寻址范围。
- 操作数的地址不易更改。因为A中的地址不易更改。
- 寻址特征表明这是直接寻址
隐含寻址
- 寻址特征表明这是隐含寻址
- 当一个操作需要两个操作数时,只给出一个操作数的地址,另一个操作数隐含在ACC寄存器中。
- 例如图中的加法操作。
- 因为本来指令中需要两个地址,但是隐含了一个地址,因此可以缩短指令的字长。
间接寻址
- 寻址特征表明这是间接寻址。
- 感觉有点像是Java中的引用对象,寻找地址的地址。
- A中存放的也是一个形式地址A ` , A `中存放的是EA,在EA中存放的是操作数。
- 因为A中存放的也是一个形式地址,因此可以通过修改A`来修改EA的地址,因此扩大了寻址的范围。
- 间接寻址也可以多次寻址。间接寻址需要多次访存,一次间接寻址就需要两次访存,多次间接访存就需要多次访存。
- 间接寻址举例:
- A中存放了主程序的形式地址,当子程序结束了,中断需要返回时,就执行JMP@A,就跳转回202地址。
寄存器寻址
- 寻址特征表明这是寄存器寻址。
- 当操作数存储在寄存器中时,A为寄存器的编号,
- 存储在寄存器中的数据不需要访存,仅仅访问寄存器就可以了,而且访问速度快。
- 因为寄存器的个数不多,因此不需要像存储器那样需要很多位。因此可以缩短指令字长。
寄存器间接寻址
- 寻址特征表明这是寄存器间接寻址。
- 有效地址存储在寄存器中,访问寄存器,得到有效地址,再从有效地址中访存操作数。
- 需要一次访存操作。
- 便于编制循环程序
基址寻址
- 寻址特征表明这是基址寻址。
- EA=(BR)+A
- 专用寄存器作为基址寄存器。基址的内容是由操作系统来确定的,用户不可更改。
- 有一个专门的基址寄存器(BR),有效地址(EA)是(BR中的寄存器)加上A中的寄存器。因此可以扩大寻址的范围。因为基址寄存器的位数可以大于形式地址A的位数。
- 基址寻址有利于多道程序的执行。
- 多道程序:多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。
- 当有多个段,有时我们不必关心自己的程序位于哪一个位置,我们只需要给出基址寄存器,操作系统或者管理程序就可以根据主存空间状况,为我们指定的基址寄存器赋一个初值。
- 基址寻址的有利于多道程序设计,表达的是:将程序放在不同的位置后,只需要修改一下基址寄存器即可(该过程由操作系统完成),就能把数据之间的那些地址自动映射过去。
- 多个程序每个程序在主存中的位置不好确定,因此使用基址填充一个初值,有助于地址在不同内存程序的映射。
- 使用通用的寄存器作为基址寄存器
- 具体的操作和专有基址寄存器是类似的。只不过是由用户指定那个通用寄存器当作基址寄存器。但是基址的内容还是由操作系统来确定的。
变址寻址
- 寻址特征表明这是变址寻址。
- EA=(IX)+A.IX为变址寄存器,也是专用的。和基址寻址最大的不同就是用户可以自行修改IX中的内容,而BR中的内容只能由操作系统修改。
- 执行过程中IX可变,A一般不变,非常便于处理数组问题,将数组中的第几位放到IX中,帮助遍历。
- 直接寻址:将D的地址取到,放到ACC中。ACC每次对D的地址进行加一并和地址中的操作数相加。加了N个之后,除以N,存到ACC中。保存结果到内存中,共执行了N+2条指令。
- 变址寻址: 相当于变址寻址使用了一个循环。将ACC添加0,X寄存器中添加0,然后把D地址放到X寄存器中,并和ACC中的数字相加,结果存储到ACC中。INX为加一操作,和i++一样。CPX是和N,比较。如果比较的结果不是0,则跳转到地址M,重复执行D地址放到X寄存器中,并和ACC中的数字相加,结果存储到ACC中,并将X寄存器中的地址进行加1的操作。如果比较结果为0,则除以N,结果保存到ACC中。ACC的数据存放到内存中。
相对寻址
- A存放的是相对PC指令的偏移量
- EA = (PC) + A。 A可正可负,用补码表示
- 当程序在内存中的位置不是固定时,无法确定一个M地址,因此需要一个相对地址,来表示要跳转到的指令的位置。
- 相对寻址示例
- *表示相对位置特征,表示当PC执行到该步程序时,跳转到该步-3的地址中。
- 字节寻址的相对寻址。
- 当PC的地址为2000H时,需要跳转到*+8的PC,执行指令。但是通常情况下,在指令取出,还没有进行执行时PC的地址已经下移了,因此偏移量这里不能写08H,要写06H。
堆栈寻址
- 堆栈分为硬堆栈和软堆栈。
- 硬堆栈表示使用多个寄存器来表示堆栈
- 软堆栈表示使用指定的存储空间来表示堆栈
- 在堆栈寻址中,使用SP来表示栈顶地址。
- 栈就是顶端进栈PUSH和顶端出栈POP。
- 下图左侧表示进栈,假设SP的初始为2000H。当有数据要进栈时,数据需要存储在SP地址的上一个地址上,因此SP要减1为1FFFH.
- 下图右侧表示出栈,假设SP的初始为1FFFH。当有数据要出栈时,SP先取出数据到寄存器,然后在主存中数据,SP地址要向下移一位,因此SP+1为2000H。
- 堆栈寻址示例
- 当ACC想要把值压入主存中的栈时,把ACC的值存放到SP-1的地址中,同时SP-1.
- 当ACC想要取出主存中的栈时,首先SP先将栈顶的值存放到ACC中,删除SP中的数据,然后SP+1.
- SP的更改值和贮存编码有关。
- 如果按照字来进行编址,那么每进行一次进栈、出栈操作都会时SP进行加一或减一,因为数据存储的大小一般都是一个字。
- 如果按照字节来进行编址,如果存储字长为16位,就是2个字节,因此每进行一次进出栈操作,都会对地址修改2个字节,因此SP要±2。同理,如果存储字长为32位,就是4个字节,因此每进行一次进出栈操作,都会对地址修改4个字节,因此SP要±4。
指令格式举例
设计指令格式时应考虑的各种因素
- 指令系统的兼容性
- 其他因素
- 操作类型:包括指令个数及操作的难易程度以及指令使用的频率等
- 数据类型:确定哪些数据类型可参与操作
- 指令格式:指令字长是否固定,操作码位数、是否采用扩展操作码技术地址码位数、地址个数、寻址方式类型
- 寻址方式:指令寻址、操作数寻址
- 寄存器个数:寄存器的多少直接影响指令的执行时间
- 下面的是IBM360的举例,稍微了解一下吧,我也没学过汇编,照着汇编指令的表格对照着看吧。
RISC技术
- RISC ( Reduced Instruction Set Computer 精简指令集计算机)
- CISC ( Complex Instruction Set Computer 复杂指令集计算机)
- 指令级的使用遵循80-20规律
- 当使用CISC时会出现的问题
- 典型程序中80%的语句仅仅使用处理机中20%的指令
- 执行频度高的简单指令,因复杂指令的存在,执行速度无法提高
- 能否用20%的简单指令组合不常用的80%的指令功能?
RISC的主要特征
- 选用使用频度较高的一些简单指令,复杂指令的功能由简单指令来组合
- 指令长度固定、指令格式种类少、寻址方式少
- 只有LOAD/ STORE指令访存
- CPU 中有多个通用寄存器
- 采用流水技术一个时钟周期内完成一条指令
- 采用组合逻辑实现控制器
CISC的主要特征
- 系统指令复杂庞大,各种指令使用频度相差大
- 指令长度不固定、指令格式种类多、寻址方式多
- 访存指令不受限制
- CPU 中设有专用寄存器
- 大多数指令需要多个时钟周期执行完毕
- 采用微程序控制器
RISC和CISC的比较
- RISC更能充分利用VLSI芯片的面积
- RISC更能提高计算机运算速度,指令数、指令格式、寻址方式少,通用寄存器多,采用组合逻辑,便于实现指令流水
- RISC便于设计,可降低成本,提高可靠性
- RISC不易实现指令系统兼容
CPU的结构和功能
CPU的结构
CPU的功能
- 控制器的功能
- 指令控制==取指令
- 操作控制==分析指令
- 时间控制==执行指令,发出各种操作命令
- 处理中断==控制程序输入及结果的输出,总线管理,处理异常情况和特殊请求
- 运算器的功能:实现算术运算和逻辑运算。数据加工
CPU的结构框图
- IR(Instruction Register 指令寄存器)
CPU的寄存器
- 用户可见寄存器
- 通用寄存器:存放操作数,可作某种寻址方式所需的专用寄存器(例如上文讲的通用基址寻址)
- 数据寄存器:存放操作数(满足各种数据类型),两个寄存器拼接存放双倍字长数据(乘法运算中的ACC和MQ寄存器)
- 地址寄存器:存放地址,其位数应满足最大的地址范围。用于特殊的寻址方式,段基值,栈指针等等
- 条件码寄存器存放条件码,可作程序分支的依据,如正、负、零、溢出、进位等
- 控制和状态寄存器
- 控制寄存器:PC→MAR→M→MDR→IR,控制CPU操作
其中MAR、MDR、IR用户不可见,PC用户可见 - 状态寄存器:
状态寄存器:存放条件码.
PSW寄存器:存放程序状态字
- 控制寄存器:PC→MAR→M→MDR→IR,控制CPU操作
控制单元CU和中断系统
- CU产生全部指令的微操作命令序列,序列包括产生操作命令和产生操作的执行顺序。
组合逻辑设计:硬连线逻辑(硬件实现,一般是RISC)
微程序设计:存储逻辑(内存实现,一般是CISC) - 中断系统
- ALU见第六章
指令周期
指令周期的基本概念
- 指令周期:取出并执行一条指令所需的全部时间,完成一条指令包括两部分。
- 取指周期:包括取值和分析两步
- 执行周期:执行
- 不同种类的指令取指周期是不同的
- 指令周期=取指周期,例如NOP指令。NOP表示什么都不做,因此仅仅把NOP取出就可以了。
- 指令周期=取指周期+执行周期。取指周期≈执行周期。例如ADD mem,表示从内存(mem)中取出操作数和ACC寄存器相加,结果保存到ACC中。取指周期中进行一次访存操作,取得在内存中的指令。执行周期中进行一次访存操作,取得内存中的操作数。因为访存次数是一样的,因此所需要的时间也是相似的。
- 指令周期=取指周期+执行周期。取指周期<执行周期例如。例如MUL mem,表示从内存(mem)中取出操作数和ACC寄存器相乘,结果保存到ACC和MQ中。因为乘法所需要的时钟周期数较多,因此执行周期大于取指周期。
- 具有间接寻址的指令周期需要加上间接寻址的周期
- 带有中断周期的指令周期需要在中断周期到来时,执行一系列操作,进入间址周期、执行周期,然后再进入中断周期。(保存程序断点、形成终端服务程序的入口地址、硬件关中断)
- 指令周期的流程:
- 进入取指周期,访问主存得到指令。
- 分析指令有间接寻址吗,如果有,进入间接寻址,如果没有进入指令执行周期。
- 是否进入中断,如果进入中断则进入中断周期,如果不进入中断,则进入下一个指令周期。
- CPU工作周期的性质,是和上面的指令周期挂钩的,每个阶段有不透的访存性质。
- 取指令::取指周期
- 取地址:间址周期
- 存取操作数或结果:执行周期
- 存程序断点:中断周期。
指令周期的数据流
- 指令周期内不同周期的数据流是不同的。
- 取址周期的数据流:(初态,指令地址再PC中保存)
- PC将指令地址传输到MAR。
- MAR将指令地址通过地址总线传输到存储器中。
- CU发出取指令命令,将控制信号通过控制总线上发送给存储器
- 存储器接收到控制信号后,将根据指令地址取到的指令通过数据总线传输给MDR中。
- MDR将指令传送到IR中。
- CU控制PC加一,进入下一个指令周期。
- 间址周期的数据流:(初态,间接地址保存在MDR中)
- MDR将操作数的形式地址传送给MAR中。
- MAR通过地址总线将地址传输给存储器
- CU发出取操作数命令,将控制信号通过控制总线上发送给存储器
- 存储器接收到控制信号后,将根据间接地址取到的操作数通过数据总线传输给MDR中。
- 执行周期的数据流在后续的内容进行介绍
- 中断周期的数据流,一般来讲中断周期包括三个阶段:保存程序断点、形成终端服务程序的入口地址、硬件关中断。这里仅介绍前两个中断,最后一个阶段在后面讲解。
- 第一阶段:保存断点。保护断点是写操作,因为PC中包含了当前执行周期正在执行的操作。因此,保存断点就是保存当前PC的值。
- 第二阶段:形成中断服务程序的入口地址。 中断服务程序的入口地址由CU给出的,因此给出中断服务程序的入口地址就是将CU中的地址传递给PC。
- 初态:CU确定内存哪块单元保存PC中的点程序。
- CU确定主存中用于断点的地址,传输给MAR中。
- MAR通过地址总线将地址传输给存储器
- CU发出写操作数命令,将控制信号通过控制总线上发送给存储器
- PC将当前的指令传递给MDR
- MDR通过数据总线将指令数据传输给存储器,存储器存储到CU指定的位置。
- CU给出中断服务程序入口地址,并传送给PC。
指令流水
如何提高机器速度
- 提高访存速度(存储器是限制CPU速度的最大原因):高速芯片、Cache、多体并行
- 提高I/O和主机之间的传送速度:中断方式、DMA方式、通道、I/O处理机(将I/O尽量交给I/O自己去处理)、多总线。
- 提高运算器速度:高速芯片、改进算法、快速进位链
- 提高整机处理能力:使用高速器件、改进系统结构,开发系统的并行性。
并行的概念
- 并行的概念分为两种
- 并发:两个或两个以上事件在同一时间段发生。两个事件是不会在同一时刻同时发生的,会在一个时间段内的不同时间片发生。
- 同时:两个或两个以上事件在同一时刻发生。发生的多个事件在时间上相互重叠。流水线方式是同时方式的一种。
- 并行性的等级
- 过程级(程序、进程):粗粒度、软件实现。感觉类似于操作系统内的不同端口之间的并行。
- 指令级(指令之间):细粒度、硬件实现(指令内部)。感觉类似于程序内的多线程。
指令流水原理
- 指令的串行执行,在取指令之后再进行执行指令。一般来说,取指令和执行指令是由不同的部件完成的,当进行取指令时,执行部件就会空闲。当进行执行指令时,取部件就会空闲。会造成浪费。
- 指令的二级流水为例,取指令和执行指令并行执行,再执行指令1时,去取指令2,使得取指时间和执行时间有重叠,提高了速度。
影响指令流水效率加倍的因素
- 执行时间大于取指时间:解决方法,增加一个指令部件的缓冲区,可以把取的指令但是还不能执行的指令进行存储。
- 条件转移指令对指令流水的影响:对于条件转移指令,一定要在程序运行到条件生成后才能判断转移到哪一个指令去执行。解决方法包括预测分支法,把各种分支进行预测,如果在这种条件下的话,就直接进入该分支,从而节省条件生成以后的执行时间。
- 指令的六级流水,下图表示有九条指令,每个指令包括6个阶段。FI(fetch instruct):取指令;DI(decode instruct):指令译码;CO(conform operation)形成操作数的地址;FO(fetch operation)取操作数;EI(execute instruct)执行;WO(write operation)结果的写回。
- 从下图可知,单独完成一个指令要6个时间单位,串行执行要6*9=54个时间单位,六级流水要(9-1)+6 = 14个时间单位。
- 从下图可知,单独完成一个指令要6个时间单位,串行执行要6*9=54个时间单位,六级流水要(9-1)+6 = 14个时间单位。
影响指令流水线性能的因素
- 结构相关:如图所示,FO、FI、WO都需要执行访存操作,因此在同时访存时会有一定的冲突。
- 解决方法:
- 停顿:当发生冲突时,取址的指令向后推,等待不冲突时再进行执行。
- 指令存储器和数据存储器分开:两个分开可以使得FI和FO、WO不再冲突。
- 指令预取技术(适用于访存周期短的情况):可以在空闲时间将多余的指令从内存中取出,放置到指令缓冲队列中,这样后面就不需要FI阶段了。
- 数据相关:不同指令因重叠操作,可能改变操作数的读/写访问顺序。
- 写后读相关(RAW Read After Write):ADD中的操作需要使用R1寄存器中的数值,但是R1寄存器中的数值需要讲过减法操作才能得出,因此,如果改变了操作的顺序,就改变了结果造成错误。
- 读后写相关(WAR Write After Read):先将R2中的数据存储到存储器中,然后再执行ADD操作,得到的数字存放到R2中。如果改变了操作的顺序,就改变了主存中的数值导致错误。
- 写后写相关(WAW Write After Write):先执行MUL,将结果存放到R2中,再执行加法,将结果存放到R2中。因此,如果改变了操作的顺序,R2寄存器中存放的数值就错误了。
- 解决办法:
- 后推法:后面的指令等待前面的指令结束再进行执行。
- 采用旁路技术:以RAW为例,再执行了SUB操作之后,会先产生结果再把结果放到R1中。构建一个旁路,直接将数值结果传递到ADD的运算器的输入中而不需要经过R1寄存器中转
- 控制相关:条件转移指令是判断条件是否达成再进行跳转,因此必须要等到指令结束了在判断是否有转移的条件。
- 解决方法这里没有讲解:应该包括分支预测法等等。
- 这里就是假设指令3是是条件转移指令,在执行到DI时无法判断是不是要跳转,一次指令4、5、6、7进入流水线,当执行到EI时才发现需要转移到第15条指令。根据指令的执行逻辑,4、5、6、7是不应该执行的,因此进入流水线的4、5、6、7都作废,因此造成了转移损失。
流水线性能
- 吞吐率:单位时间内流水线所完成指令或输出结果的数量,设m段的流水线各段时间为△t.
- 其计算方法和计算机网络中的分组交换的时间计算类似。
- 加速比Sp: m段的流水线的速度与等功能的非流水线的速度之比。设流水线各段时间为△t。
- 效率:流水线中各功能段的利用率。由于流水线有建立时间和排空时间,因此各功能段的设备不可能一直处于工作状态。
- 下图中的效率就是流水线的时空区(平行四边形的面积/矩形的面积)
流水线的多发技术
- 超标量技术:每个时钟周期内可并发多条独立指令,配置多个功能部件。
- 如图有三个流水线,每个流水线可以同时并行三个指令。这三个指令是三个可以并行的指令。彼此之间的顺序不受限制。
- 不能调整指令的执行顺序,通过编译优化技术,把可并行执行的指令搭配起来,搭配好的命令放到同一时间段的流水线中进行并行执行。
- IF(取指令)ID(取操作数)EX(执行指令)WR(结果写回)
- 超流水线技术:在一个时钟周期内再分段(3段),在一个时钟周期内一个功能部件使用多次(3次)。将一个时钟周期再进行细分,将一个时钟周期也分成三段流水线。
- 不能调整指令的执行顺序,靠编译程序解决优化问题.
- 超流水线技术:由编译程序,挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位)。
- 这个操作的目的在于减少访存的次数,仅仅一次访存就可以,就可以得到多个指令所需要的地址,数据等,同时,指令并行执行也加快了机器速度。相当于一个超长指令可以当作三个普通指令。
- 需要采用多个处理部件
流水线的结构
- 指令流水线结构在每次进行完以后都需要一个锁存器,将结果进行锁存,因此需要5个锁存器。
- 运算流水线,在计算浮点数时会比计算小数和整数都要复杂,而且需要三个步骤:对阶,尾数求和、规格化。因此将运算过程进行进行分段处理,每一段的最后都使用锁存器,锁存结果。
- 尽量将分段的时间长度保持一致,因为流水线的时长和最长的时间有关。
中断系统
概述
- 引起中断的各种因素
- 人为设置的中断:如转管指令,使用转移管理指令,将程序通过中断的方式转移到指定的程序中。
- 程序性事故:溢出、 操作码不能识别、除法非法
- 硬件故障
- I/O设备
- 外部事件:用键盘中断现行程序
- 引起中断的各种因素(一般通过硬件+软件的方式解决问题,以下问题将在一个部分全部解决)
- 各中断源如何向CPU提出请求?
- 各中断源同时提出请求怎么办?
- CPU什么条件、什么时间、以什么方式响应中断?
- 如何保护现场?
- 如何寻找入口地址?
- 如何恢复现场,如何返回?
- 处理中断的过程中又出现新的中断怎么办?
中断请求标记和中断判优逻辑
中断请求标记(各中断源如何向CPU提出请求?)
-
中断请求标记:INTR触发器
-
一个请求源:一个INTR中断请求标记触发器。当多个INTR组合在一起时,组成中断请求标记寄存器。用来记录中断请求。
-
INTR触发器有两种分布方式:分散在各个中断源的接口电路中,集中在CPU的中断系统内。
中断判优逻辑(各中断源同时提出请求怎么办?)
- 硬件实现(排队器)
-
分散在各个中断源的接口电路中,链式排队器(详见第五章排队器,这个图中的INTR反就是从各个接口电路中得到的信号。)
-
集中在CPU内(INTR、INTR2、INTR3、INTR, 优先级按降序排列)
-
- 软件实现(程序查询,下图中中断的优先级:A>B>C,程序根据优先级依次进行查询,查询到就转移到目标的入口地址。)
中断服务程序入口地址的寻找(如何寻找入口地址?)
- 硬件向量法,通过向量地址形成部件(上文提到的设备译码器),生成中断向量地址,图中的12H、13H、14H就是中断地址。
- 硬件向量法中有两种方式找到入口地址:
- 跳转指令方式,通过跳转指令,在找到中断入口程序服务地址后,直接跳转到中断服务入口地址
- 存储入口地址方式,将入口地址从主存中取出来m,送到PC中,PC来进入中断程序,执行中断程序
- 硬件向量法速度快 ,但是不灵活
- 软件查询法,依旧是根据中断的优先级进行一次询问,如果D=0则跳过下一个指令,如果不为0,则执行下一个命令。其中中断程序的入口地址就存储在1#SR、2#SR之中。
- SKP DZ = skip D 等于 zero 如果D=0则跳过下一条指令。
中断响应(CPU什么条件、什么时间、以什么方式响应中断?)
- 响应中断的条件:允许中断触发器EINT= 1。只有CPU的EINT为1时,CPU才能响应中断。EINT = Enable INTerrupt
- 响应中断的时间:指令执行周期结束时刻由CPU发查询信号。
- 中断隐指令,响应中断,要去执行中断服务程序,为将来的中断返回做准备(1)保护程序断点(2)保护程序运行的软硬件状态
- 包括三个部分
- 保护程序断点:将断点保存在特定的地址中(0号地址)内,通过断点进栈的方式保存断点地址。
- 寻找服务程序入口:通过向量地址法,转到PC上(硬件查询法);中断识别程序(依次查询的方法)(从主存转到PC上)软件查询法。
- 硬件关中断:包括三个部分,INT中断标记,EINT允许中断,R-S触发器。大致流程就是EINT可以响应中断,EINT的Q输出为1,排队器中有至少有一个想要触发中断,输出为1,INT得到信号后,S端将EINT通过R端将Q端输出置为0,关闭中断。同时通过向量地址形成部件的得到中断向量的地址,给到PC,执行中断操作。
- 三个指令是由硬件自动执行的,不经过软件或程序,因此称为中断隐指令。
保护现场和恢复现场(如何保护现场,如何恢复现场,如何返回?)
- 保护现场需要的操作包括保护断点和数据,将目前尚未完成的程序保存到栈中,将原程序需要操作的数据,从寄存器中保存起来。
- 保护断点:中断隐指令完成.
- 保护数据(寄存器内容):中断服务程序完成.
- 恢复现场:中断服务程序完成
多重中断(处理中断的过程中又出现新的中断怎么办?)
- 当目前在执行一个中断时,有一个其他的中断想要请求,如果新的中断优先级较高,就再次中断,如果低,就不执行中断,等待该中断完成,再执行新的中断。
实现多重中断的条件
- 提前设置开中断指令.(CPU的EINT要开启)
- 优先级别高的中断源有权中断优先级别低的中断源。(A中断了D的中断。)
屏蔽技术
- 屏蔽触发器的作用,就算D触发器出发了,但是如果MASK(屏蔽触发器Q反输出0,则还是无法触发中断。)
- MASK输出为0,Q反输出为1,表示该中断没有被屏蔽,INTR可以置1。
- MASK输出为1,Q反输出为0,表示该中断被屏蔽,INTR不能置1。
- INTR是D触发器,D触发器为1,则可以先触发INTR置为1,可以从排队器中进行排队,因为排队器的输入就是INTR。
- 屏蔽字:根据上述原理,当该中断的MASK的为1时,是被屏蔽的,中断时不被优先处理的。当该中断的MASK的为0时,是不被屏蔽的,中断时被优先处理的。因此可以通过设置屏蔽字,来调节中断的处理优先级。
- 屏蔽技术可改变处理优先等级:仅仅可以改变响应优先级,不能改变处理优先级。处理优先级是由排队器,或程序查询得出的,是不易改变的。
- 响应优先级:不可改变。处理优先级:可改变(通过重新设置屏蔽字)
- 假定:响应优先级A→B→C→D降序排列,处理优先级A→D→C→B降序排列。
- 当四个中断同时请求时,原屏蔽字的中断处理顺序
- 当四个中断同时请求时,后屏蔽字的中断处理顺序:首先根据行营优先级,中断的响应式A>B>C>D。但是在处理时A>D>C>,因此在B程序响应时,在B中断中,执行了C中断,在C中断中,执行了D中断,当D中断结束时B优先相应,但是处理响应在后面,D相当于中断套中断。
- 设置中断屏蔽字可以人为的屏蔽某的中断源的请求。
- 新屏蔽字的设置:重点,要在开中断之前设置屏蔽字,中断之后设置屏蔽字就没有意义了。
- 提前开中断,只有提前开中断才能进行多重中断。在恢复现场的时候要关闭中断使得恢复现场不被打断。
- 多重中断的断点保护
- 断点进栈:中断隐指令完成
- 断点存入“0”地址:中断隐指令完成
- 中断周期:
- "0"地址的内容→MAR
- 命令存储器写入地址
- PC→MDR将断点的数据存入MDR中
- (MDR)→存入存储器
- 三次中断,三个断点都存入“0”地址,如何保证"0"地址中的地址不被覆盖,保证断点不丢失?
- 程序断点存入"0"地址的断点保护,将原来的0地址的内容转存难道return地址上
- 流程
- 首先保存程序地址到"0"地址.
- 跳转到中断向量地址(SERVE)
- 保护原有的现场,数据等到(SAVE)。
- 在开启中断前,将"0"地址中的数据存到ACC中,并将ACC中的数据转存到新的地址中(RETURN)。
- 开启中断
- 执行其他中断服务内容
- 将SAVE中的数据装载回ACC中
- 通过间址的方式找到RETURN的地址,返回原来的中断。
控制单元(CU)
微操作命令分析
- 微操作命令:在指令解释过程中由CU发出的指令,这些命令和整个的操作指令相比要小得多。
- 完成一条指令分4个工作周期:取指周期、间址周期、执行周期、中断周期
取指周期
- 流程(前文已经讲过了,这里再说一下):
- PC将地址传送给MAR中,MAR将地址通过地址总线传送给存储器
- CU发出读指令®,通过控制总线传送给存储器
- 存储器(M)将MAR指定地址中的内容传递到MDR中。
- MDR将数据传递给IR中,OP(operation 操作)
- CU控制PC地址+1,转移到下一个PC位置
间址周期
- 流程(前文已经讲过了,这里再说一下):
- IR中存有间接地址,将间接地址传递到MAR中,MAR将地址通过地址总线传送给存储器
- CU发出读指令®,通过控制总线传送给存储器
- 存储器(M)将MAR指定地址中的内容传递到MDR中。
- MDR将数据传递给IR中,AD(Address 地址),这里是要请求的真实地址。
执行周期
- 执行周期比较复杂,这里也是体现出指令执行的复杂性,这里将其分成了三种:非访存指令、访存指令、转移指令。
非访存指令
- 这里的指令都是不需要访问内存的,只需要对寄存器等进行操作就可以了。这里举了5个例子。
- CLA 清空寄存器ACC 将ACC中的所有的位都置为0
- COM 取反 将ACC中的所有的位都按位取反
- SHR 算术右移 将ACC中的所有的位都向右平移一位,同时原来ACC0位的值给自己复制一份。
- CSL 循环左移 将ACC中的所有的位都向左平移一位,同时原来ACC0位的值赋值给ACC的第n位。
- STP 停机 将停机标志G置为0
- 算术右移就是把ACC寄存器中的数字右移一位,包括符号这里应该是指补码,原码应该是负数也要高位放0的。
访存指令
- 加法指令:ADD X
- 将地址AD从IR中传给MAR中,MAR将地址通过地址总线传送给存储器
- CU发出读指令®,通过控制总线传送给存储器
- 存储器(M)将MAR指定地址中的内容传递到MDR中。
- ACC中的内容和MDR中的内容相加赋值到ACC中
- 存数指令:STA X
- 将地址AD从IR中传给MAR中,MAR将地址通过地址总线传送给存储器
- ACC中的内容传送到MDR中
- CU发出写指令(W),通过控制总线传送给存储器
- 存储器(M)保存MDR中的数据,到MAR指定的地址中
- 取数指令:LDA X
- 将地址AD从IR中传给MAR中,MAR将地址通过地址总线传送给存储器
- CU发出读指令®,通过控制总线传送给存储器
- 存储器(M)将MAR指定地址中的内容传递到MDR中。
- MDR中的内容传给ACC中
转移指令
- 转移指令分为两种;无条件跳转指令,条件跳转指令。
- 无条件跳转指令: JMP X。X在IR中已经解析好了,直接将地址值赋值给PC中,执行跳转。
- 条件跳转指令:条件转移指令,需要根据前面的情况来判断是否转移。BAN X。 表示如果ACC中的数值是负数就跳转,否则不跳转。(B~ ACC is Negative)。对于ACC判断正负仅仅需要有ACC中的第0位的正负就可以判断了。第0位是0,则表示正数不跳转,第0位是1,则表示负数跳转到X。
- 下面的式子,意义是当A0为负数为1则式子等于1 * Ad(IR)+0 * (PC) = Ad(IR) ->PC.将AD值传递给PC,如果为正数为0,0 * Ad(IR)+1 *(PC) = (PC) ->PC则将PC的值传送到PC中,即不跳转。
三类指令的指令周期
- 直接访存中的地址是真实地址,在真实地址就可以直接继续执行周期,不需要再找地址了。
中断周期
- 中断周期包括两种,将程序断点存入"0"地址中,或将程序断点进栈。如下图所示。两个差不多(1-4是保存程序断点,5是寻找中断服务程序入口、6是关中断)
- 流程:
- 将地址存到MAR中
- CU发出写指令(W),通过控制总线传送给存储器
- PC中的内容传送到MDR中
- 存储器(M)保存MDR中的数据,到MAR指定的地址中
- 形成的中断向量地址传递给PC(软件则是中断识别程序入口地址直接传递到PC中)
- 关中断0->EINT
控制单元的功能
控制单元的外特性
- 输入信号
- 时钟:CU受时钟控制,一个时钟脉冲,发一个操作命令或一组需同时执行的操作命令
- 指令寄存器:OP(IR )→CU,控制信号与操作码有关
- 标志:CU受标志控制
- 外来信号:如INTR:中断请求;HRQ:总线请求;
- 输出信号
- CPU内的各种控制信号:Ri→ Rj(从一个寄存器到另一个寄存器);(PC)+1→PC;ALU +,-,与,或(数值操作与逻辑操作)。
- 送至控制总线的信号
MREQ反:访存控制信号
IO反/M:访IQ/存储器的控制信号
RD反:读命令
WR反:写命令
INTA:中断响应信号
HLDA:总线响应信号
不采用CPU内部总线的方式(下图中的C1到C7都是CU发出的控制信号)
- 取指周期:流程和前面的差不多,这里再将CU的控制信号放进来。
- CU将控制信号C0给出,将PC和MAR的电路打通。PC将地址传送给MAR中。
- CU将控制信号C1给出,MAR将地址通过地址总线传送给存储器
- CU发出读指令( R ),通过控制总线传送给存储器
- CU将控制信号C2给出,存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号C3给出,将MDR和IR的电路打通。MDR将数据传递给IR中,OP(operation 操作)
- CU将控制信号C4给出,将IR中的数据给CU进行译码。
- CU控制PC地址+1,转移到下一个PC指令。
- 间址周期周期:(在开始时,IR和MDR中都有形式地址数据,这里是从MDR中拿数据给MAR,也有的模型机将IR的数据给MAR)
- CU将控制信号C5给出,将MDR和MAR的电路打通。MDR将地址传送给MAR中。
- CU将控制信号C1给出,MAR将地址通过地址总线传送给存储器
- CU发出读指令( R ),通过控制总线传送给存储器
- CU将控制信号C2给出,存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号C3给出,将MDR和IR的电路打通。黄色的是是加法指令操作数的地址,蓝色部分是原操作码部分。
- 执行周期周期:(在开始时,IR和MDR中都有形式地址数据,这里是从MDR中拿数据给MAR,也有的模型机将IR的数据给MAR)
- CU将控制信号C5给出,将MDR和MAR的电路打通。MDR将地址传送给MAR中。
- CU将控制信号C1给出,MAR将地址通过地址总线传送给存储器
- CU发出读指令( R ),通过控制总线传送给存储器
- CU将控制信号C2给出,存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号C6和C7给出,将ACC和MDR中的数据传给ALU进行运算。
- CU将控制信号C8给出,将ALU的运算结果传递给ACC中。
采用CPU内部总线的方式(下图中的具有向下箭头的信号都是CU发出的控制信号)
- 这里的Y寄存器就是临时存储MDR中的数据用的,Z寄存器是临时存放结果的寄存器,最后要转存到ACC中。
- 取指周期:(这里的o表示output输出,i表示input输入)
- CU将控制信号PCo给出。PC通过CPU内部总线,将地址传送给MAR中。
- CU将控制信号MARi给出,MAR通过CPU内部总线将地址存到MAR中。同时MAR将地址通过地址总线传送给存储器。
- CU发出读指令( R ),通过控制总线传送给存储器。存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号MDRo给出,MDR将寄存器中的数据通过CPU内部总线传递到IR中。
- CU将控制信号IRi给出,IR接收MDR传递来的数据。
- IR的数据给CU进行译码。将
- CU控制PC地址+1,转移到下一个PC指令。
- 间址周期周期:(在开始时,IR和MDR中都有形式地址数据,这里是从MDR中拿数据给MAR,也有的模型机将IR的数据给MAR)
- CU将控制信号MDRo给出。MDR将地址通过CPU内部总线,传送给总线中。
- CU将控制信号MARi给出,MAR接收MDR送过来的地址,同时将地址通过地址总线传送给存储器
- CU发出读指令( R ),通过控制总线传送给存储器,存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号MDRo给出,MDR将地址通过CPU内部总线传送给IR中。
- CU将控制信号IRi给出,IR接收从MDR传送的数据
- 执行周期周期:(在开始时,IR和MDR中都有形式地址数据,这里是从MDR中拿数据给MAR,也有的模型机将IR的数据给MAR)
- CU将控制信号MDRo给出。MDR将地址通过CPU内部总线,传送给总线中。
- CU将控制信号MARi给出,MAR接收MDR送过来的地址,同时将地址通过地址总线传送给存储器
- CU发出读指令( R ),通过控制总线传送给存储器,存储器(M)将MAR指定地址中的内容传递到MDR中。
- CU将控制信号MDRo给出,MDR将地址通过CPU内部总线传送给Y中。
- CU将控制信号Yi给出,Y接收从MDR传送的数据
- CU将控制信号ACo给出,MDR将数据通过CPU内部总线传送给ALU中。
- CU将控制信号ALUi给出,ALU接收第二个参数,进行于运算将结果输出到Z。
- CU将控制信号Zo给出,Z将数据通过CPU内部总线传送给ACC中。
- CU将控制信号ACCi给出,接收Z寄存器中的数据。
多级时序系统
- 机器周期:机器周期只是一个概念周期,并不是一个实际的时间,是人为规定的。
- 机器周期的概念:所有指令执行过程中的一个基准时间。
- 确定机器周期需考虑的因素:每条指令的执行步骤,每一步骤所需的时间
- 基准时间的确定:以完成最复杂指令功能的时间为准,一般以访问一次存储器的时间为基准。若指令字长=存储字长,取指周期=机器周期
- 时钟周期(节拍,状态)
- 一个机器周期内可完成若千个微操作,每个微操作需一定的时间,将一个机器周期分成若干个时间相等的时间段(节拍、状态、时钟周期)。
- 时钟周期是控制计算机操作的最小单位时间,用时钟周期控制产生一个或几个微操作命令。
- 时钟周期比机器周期要小,一般的微操作命令都是以时钟周期进行计算的。
- 多级时序系统
- 机器周期、节拍(状态)组成多级时序系统
- 一个指令周期包含若干个机器周期
- 一个机器周期包含若干个时钟周期
- 一个指令周期中每个机器周期中的时钟周期可以相同,可以不同。
- 上边的部分就是三个的机器周期,三个机器周期中每个时钟周期数目是相同的
- 上边的部分就是2个的机器周期,2个机器周期中每个时钟周期数目是不同的。
- 机器速度和机器主频之间的关系
- 机器的主频f越快机器的速度也越快,在机器周期所含时钟周期数相同的前提下,两机平均指令执行速度之比等于两机主频之比:
- 机器速度不仅与主频有关,还与机器周期中所含时钟周期(主频的倒数)数,以及指令周期中所含的机器周期数有关。
控制方式
- 控制方式:产生不同为操作序列所使用的时序控制方式。
- 同步控制方式:任一微操作均由统一基准时标的时序信号控制
- 采用定长的机器周期:以最长的微操作序列和最复杂的微操作作为标准机器周期内节拍数相同。这会导致很严重的浪费,因为在指令很快的时候,用长时间的机器周期会使多余的时间空闲。
- 采用定长的机器周期:机器周期节拍数不等。
- 采用中央控制和局部控制相结合的方法。局部控制的节拍宽度与中央控制的节拍宽度是一致的,即两种控制的节拍是一样长的。下图就是中央控制4个节拍,在执行周期中局部控制增加了一些节拍来增加执行周期的时间。
- 采用定长的机器周期:以最长的微操作序列和最复杂的微操作作为标准机器周期内节拍数相同。这会导致很严重的浪费,因为在指令很快的时候,用长时间的机器周期会使多余的时间空闲。
异步控制方式
- 无基准时标信号
- 无固定的周期节拍和严格的时钟同步
- 主要采用应答方式,先请求,得到应答后再控制。和I/O中的总线应答方式等很相似。
联合控制方式
- 同步与异步相结合
人工控制方式.
- Reset
- 连续和单条指令执行转换开关
- 符合停机开关
控制单元的设计
组合逻辑设计
CU的外特性
- 通过CLK时钟周期生成节拍信号,微操作根据节拍信号执行微操作。
微操作的节拍安排
- 采用同步控制方式,这里以,一个机器周期内有3个节拍(时钟周期)为例,CPU内部结构采用非总线方式。
-安排微操作的时序的原则- 原则一:微操作的先后顺序不得随意更改。(对于一个机器周期来说,其每个微指令的顺序基本上都是固定的,不能随便修改)
- 原则二:被控对象不同的微操作,尽量安排在一个节拍内完成。(可以并行的微操作尽量在一个节拍完成,也就是在操作不同的对象时,尽量在一个节拍内完成。)
- 原则三:占用时间较短的微操作,尽量安排在一个节拍内完成,并允许有先后顺序。(虽然操作的是一个对象,但是操作时间很短,因此可以通过一个节拍内的两个不同升变沿进行操作,即一个在上升沿,一个在下降沿,例如下图中的取指周期的T2节拍)
- 取指周期的节拍安排:
- T0:将PC地址存到MAR,CU给出读指令到M中;因为这两个微操作不是一个对象,根据原则2,合并到T0中。
- T1:将M中的数据存到MDR中,PC+1;因为这两个微操作不是一个对象,根据原则2,合并到T1中。(这里说一下一般PC在取走到MAR以后,就可以执行PC自增操作了。)
- T2:将MDR中的数据保存到IR中,IR中的个操作传递到ID中进行译码;虽然操作的对象都包含了IR,但是由于都是寄存器之间的操作,不涉及到内存,因此速度较快。根据原则三,利用节拍的上升下降沿,放到到了T3中。
- 间址周期的节拍安排:前文已经提过了。MDR和IR中都保存着形式地址,间址周期从IR开始还是MDR开始取决于模型机。
- T0:将IR中的(Ad地址)存到MAR,CU给出读指令到M中;因为这两个微操作不是一个对象,根据原则2,合并到T0中。
- T1:将M中的数据存到MDR中;
- T2:将MDR中的数据保存到IR中;
- 执行周期的节拍安排:执行周期的节拍安排和操作的指令有关,有的操作指令需要很多微操作,有的就不需要。如下表所示,表格空白就表示没有微指令进行操作。(有的指令过于简单,仅需要一个节拍就可以操作完成,这里约定他们在T2节拍进行微指令操作。)
T0 | T1 | T2 | |
---|---|---|---|
CLA(ACC清零) | 0→AC | ||
COM(ACC按位取反) | A C ‾ \overline{AC} AC→AC | ||
SHR(算术右移) | L(AC)→R(AC) AC0→AC0 | ||
CSL(循环左移) | R(AC)→L(AC) AC0→ACn | ||
STP(停机操作) | 0→G | ||
ADD X(ACC加X地址中的内容) | Ad(IR) →MAR 1→R | M(MAR)→MDR | (AC)+(MDR)→AC |
STA X(ACC的内容存到X的地址中) | Ad(IR) →MAR 1→W | ACC→MDR | MDR→M(MAR) |
LDA X(X的内容装载到ACC) | Ad(IR) →MAR 1→R | M(MAR)→MDR | MDR→AC |
JMP X(跳转到X位置,这里的X一般是PC的地址不是M的地址) | Ad(IR) →PC | ||
BAN X(如果是负数就跳转,否则不跳转) | A0.Ad( IR)+ A 0 ‾ \overline{A0} A0.PC-→ PC |
- BAN X,中的PC没有加一,是因为在取址阶段已经进行了加一,不需要再次加一。
- 中断周期微操作的节拍安排(保护断点、关中断、寻找中断向量入口地址)这这些操作都是由中断隐指令完成的。
组合逻辑的设计步骤
- IND 间址周期的标志,为正则表示由间址周期,为非则表示没有间址周期。
- 下表以六个指令为例,进行表述。六个指令中CLA和COM是没有间址周期的。剩下四个都是由间址周期的。
- 取指周期:
- 间址周期:间址周期中如果存在多层间址,则可能再多几个间址周期,而不会像这里一样直接跳转到执行周期。
- 执行周期:JMP是直接将IR中的地址传到PC中,和M无关联。
- 写出表达式
- 画出逻辑图
- RISC(精简指令集计算机一般这种硬件直连的方式进行设计,速度快,但是很庞大,修改等都具有一定的困难。)
微程序设计
- 将多个微操作命令,组合起来能够做成一个大的操作,这个大的操作就是微指令,将多个微指令组合起来就是微程序。
- 微程序存储在只读存储器中(ROM中)
- 一条机器指令对应一个微程序,其内部存储的是逻辑,即微指令的执行逻辑。
- 一条机器指令就是一个微程序,取指周期,间址周期,中断周期的动作都差不多,因此把他们三个分别做成一个微程序,执行周期中,不同的微操作被封装到不同的微程序中,保存到ROM中。
- 控制存储器中的微指令包括操作控制和顺序控制两部分,顺序控制控制下一个微指令的地址,因此需要顺序逻辑来判断是使用哪个地址,这就是顺序逻辑的存在意义。
- 流程:(CMAR 控制内存地址寄存器,CMDR 控制内存数据寄存器)
- IR中将操作码中的微地址给到微地址形成部件(其功能和中断向量形成部件相似)
- 微地址形成部件生成对应微程序所在的ROM地址,传给顺序逻辑判断,判断取哪一个ROM地址。
- 将判断好的ROM地址传递到CMAR
- CMAR将ROM地址传给地址译码器进行译码
- 译码后的地址传递给控制存储器
- 控制存储器找到响应的微指令,传递给CMDR,其中操作控制部分发送到CPU内部或系统总线的控制信号;顺序控制部分给出下一个微操作的地址发送给顺序逻辑。
- 顺序逻辑判断是使用下一个地址还是使用微地址形成部件生成的地址。进入下一个周期。
为程序控制单元框图及工作原理
- 下图为例,假设取指周期的开始地址在M,包括三个微指令。LDA的执行周期的开始地址在P,包括三个微指令。STA的执行周期的开始地址在K,包括三个微指令。
- 因为取指周期以后,需要的为程序入口地址与操作数有关,具体的地址需要在操作数译码以后才能得到,这里的XXX表示跳转的位置看后续操作数的地址。
- 执行操作在结束以后会直接跳转到取指周期中,执行下一个机器指令。
工作原理
-
这里贴了组合逻辑电路的流程图,方便理解流程。
-
取指阶段
- 控制存储器中的取指周期的开始M地址传递给CMAR中
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将PC中的地址传递给MAR中,同时发出内存读命令。地址部分表示跳转到M+1的控制存储器的地址,因为取指周期还没完。
- 将CMDR中的地址部分传递给顺序逻辑后传递发给CMAR中。
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将内存中MAR地址的内容传递给MDR,同时PC+1。地址部分表示跳转到M+2的控制存储器的地址,因为取指周期还没完。
- 将CMDR中的地址部分传递给顺序逻辑后传递发给CMAR中。
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将MDR地址的内容传递给IR。地址部分用XXX表示控制存储器的地址不能确定,需要得知操作数以后再确定。
-
执行阶段(以LDA X 为例)
- IR将操作码译码后,将得到的结果传递给为地址形成部件,生成微地址,传送到CMAR中,寻找执行阶段的开始地址,例如上文说的P或K。
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将IR中的地址传递给MAR。地址部分表示跳转到P+1的控制存储器的地址,因为执行周期还没完。
- 将CMDR中的地址部分传递给顺序逻辑后传递发给CMAR中。
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将内存中MAR地址的内容传递给MDR。地址部分表示跳转到P+2的控制存储器的地址,因为取指周期还没完。
- 将CMDR中的地址部分传递给顺序逻辑后传递发给CMAR中。
- CMAR通过地址译码传递给CMDR
- CMDR发出指令:执行部分将MDR地址的内容传递给AC。地址部分用M表示执行阶段已经结束,可以跳回取指阶段了。
-
取指阶段和上述相同,全部的位置都存储在控制存储器中,程序执行时只需要读出就行了。
微指令的编码方式(控制方式)
- 直接编码方式:控制信号操作部分每一个位都代表一个微操作命令。不需要译码,因此速度较快。
- 字段直接编码方式(显式编码):将微指令的控制字段分成若干个段,每一段都需要译码生成控制信号。译码以后的输出只有一个1,输出的所有电路中是不可以并行的。但是不同段之间是可以并行的。每个字段中的命令是互斥的,缩短了为指令的字长,增加了译码的时间,速度相对直接编码较慢。
- 字段间接编码方式(隐式编码):将微指令的控制字段分成若干个段,每一段除了译码以外,还需要其他信号辅助译码,来生成控制信号。其余和字段直接编码相似。
- 混合编码:直接编码和字段拜年吗混合使用
- 其他
微指令序列地址的形成
- 微指令的下地址字段指出:CM给出
- 根据机器指令的操作码形成:IR给出
- 增量计数器 :CMAR给出
- 分支转移:由分支控制逻辑给出。通过配合配合微指令的转移方式。
- 通过测试网络:低位地址通过测试网络,得到新的低位地址,高位地址和低位地址重新组合,得到新的微程序地址。
- 由硬件产生微程序入口地址:(由硬件给出)
第一条微指令地址,中断周期由硬件产生中断周期微程序首地址,间址阶段也是硬件产生
- 后续微指令地址形成方式原理图
微指令格式
- 水平型微指令:一次能定义并执行多个并行操作。如:直接编码、字段直接编码、字段间接编码、直接和字段混合编码。
类似于多个小指令。 - 垂直型微指令:类似机器指令操作码的方式,由微操作码字段规定微指令的功能。相当于一个庞大的指令,里面包含了多个微指令。
静态微程序设计和动态微程序设计
- 静态微程序设计,微程序无须改变,采用ROM。
- 动态微程序设计,通过改变微指令和微程序改变机器指令,有利于仿真,采用EPROM。
毫微程序设计
- 毫微程序设计的基本概念:
微程序设计,用微程序解释机器指令
毫微程序设计,用毫微程序解释微指令
毫微指令与微指令的关系好比微指令与机器指令。
毫微程序控制存储器的基本组成
- CMAR1中存有地址以后,将地址给入微程序控制存储器;微程序控制存储器给出垂直型微指令,一条垂直型微指令是一条很庞大的微指令,包含了很多小的微指令。垂直型微指令进入CMAR2,通过毫微程序控制存储器,将垂直型微指令转化成多个可以并行的小的水平型微指令,来控制相应的硬件。
串行微程序控制和并行微程序控制
微程序设计举例
- 写出对应机器指令的微操作及节拍安排,假设CPU结构与组合逻辑相同,重点就是在控制指令完成后要加上后续微指令的地址。
- 取指阶段
节拍 | 控制指令 | 形成后续微指令的地址 |
---|---|---|
T0 | PC→MAR 1→R | |
T1 | Ad(CMDR)→CMAR | |
T2 | M( MAR)→MDR ( PC)+1→PC | |
T3 | Ad(CMDR)→CMAR | |
T4 | MDR→IR OP( IR)→微地址形成部件 | |
T5 | OP(IR)→微地址形成部件→CMAR |
- 执行阶段,考虑到要形成后续微指令的地址
- 对于非访存指令,在T0时刻进行操作,T1时刻形成下个时刻的微地址就可以了。
- 访存指令(ADD 指令)
节拍 | 控制指令 | 形成后续微指令的地址 |
---|---|---|
T0 | Ad(IR)→MAR 1→R | |
T1 | Ad(CMDR)→CMAR | |
T2 | M( MAR)→MDR | |
T3 | Ad(CMDR)→CMAR | |
T4 | (MDR)+(ACC)→ACC | |
T5 | Ad(CMDR)→CMAR(将取指阶段入口地址给CMAR) |
- 访存指令(LDA 指令)
节拍 | 控制指令 | 形成后续微指令的地址 |
---|---|---|
T0 | Ad(IR)→MAR 1→R | |
T1 | Ad(CMDR)→CMAR | |
T2 | M(MAR)→MDR | |
T3 | Ad(CMDR)→CMAR | |
T4 | (MDR)→ACC | |
T5 | Ad(CMDR)→CMAR(将取指阶段入口地址给CMAR) |
-
转移指令 这里就是完成转移控制操作以后,给出下一个微指令的地址就可以了。
-
确定微指令格式
- 微指令的编码方式:采用直接控制
- 后续微指令的地址形成方式:由机器指令的操作码通过微地址形成部件形成、由微指令的下地址字段直接给出
- 微指令字长:有20个微操作确定操作控制字段最少20位
有38条微指令确定微指令的下地址字段为6位
微指令字长可取20+6= 26位
-
微指令控制中也要有CMDR->CMAR的控制,后面省去了CMAR,又节省了微指令的条数。
-
这里的微程序地址是8进制,因此10 代表二进制的 001 000 = 8(十进制)