第七章 微序列控制单元设计
description
Transcript of 第七章 微序列控制单元设计
第七章 微序列控制单元设计
7.1 微序列控制器设计基础
7.2 非常简单微序列控制器的设计和实现
7.3 相对简单微序列控制器的设计和实现
7.4 减少微指令数
7.5 微程序控制和硬布线控制的比较
7.6 实例:一个(大部分是)微代码的CPU
奔腾微处理器
微序列控制器:把控制信号存储在一个查找表
ROM ,即微代码存储器中。按照正确的次序访问
ROM 中的内容,查找表 ROM 就可以以适当的顺
序发出控制信号,从而实现处理器指令集中的指
令。
7.1.1 微序列控制器的操作1 .典型微序列控制器的组成 典型微序列控制器的组成如图。 ▲ 寄存器存储的值与 CPU 状态图中的一个状态相对 应,且当作地址输入到微代码存储器中。 ▲ 存储器的输出是一条微指令,即那个地址对应的 存储单元内容。所有微指令集中组成 CPU 的微代 码或微程序。 ▲ 下址产生模块产生所有可能的下一地址或下址, 然后从中选择一个正确的下址送入寄存器中。
7.1 微序列控制器设计基础
典型微序列控制器的组成
微指令微代码或微程序
2 .微指令的组成
微指令由几个域组成,其 bit 位可分为两组。
◆ 微操作(微序列控制器的微序列部分)
这些信号从微序列控制器输出到 CPU 的其
他部分,它们或者输入到组合逻辑以生成 CPU
的控制信号,或者直接产生控制信号。
◆ 下一个地址(微序列控制器的序列控制部分)
用来产生存储到寄存器中的下一个地址,
这些位连同指令的操作码和标志值一起输入到
组合逻辑以产生下一条微指令的地址。
3 .下址的产生
四种常用方法:
◆ 当前地址加 1 :微代码存储器中的下一地址,即
当前地址加 1 。
微代码程序在微代码存储器中顺序存放。
(提高可读性、微程序易于调试)
◆ 绝对地址:由微代码存储器提供。
◆ 映射逻辑
每个微序列控制器必须能够访问正确的执
行周期,这一功能可用映射逻辑来实现。
▲ 已读取指令的操作码输入到一个映射硬件,此硬件
将该操作码转换或映射成该指令执行周期的第一条
微指令所在的地址;
▲ 把这一地址装载到寄存器,微序列控制器就能转入
到正确的执行过程。
在取指令周期的末端使用一次 。
◆ 微子程序
子程序入口地址:由微代码存储器给出绝对地址。
返回地址(当前地址加 1 ):存储在微子程序寄存器或
硬件堆栈中,此地址用于从微子程序中返回。
7.1.2 微指令的格式 1 .典型的微指令格式
• 选择域:指明下一条微指令地址的来源。
• 地址域:指明一个绝对地址。
• 微操作域:一个或多个。
2 .说明微操作的三种主要方法
◆ 水平微代码
微指令太长,大部分微操作位不是有效的 。
• 列出 CPU 所要执行的每一个微操作
• 将微指令微操作域中的一位分配给每个微操作
例如:一个 CPU 需要执行 50 个微操作,
它的每一条微指令的微操作域将占用 50 位。
例如: 16 个微操作 —— 四位二进制来编码
( 0000 ~ 1111 )
微指令位数少,但需要译码器。
◆ 控制信号的直接生成
微代码将微操作组合在一起,不同的是,它
把控制信号值直接存储在微指令中。
代码的可读性差,调试困难。
◆ 垂直微代码
所有微操作组合成域,域中的每个微操作
被分配一个唯一的编码值。
7.2.1 基本布局 1. 非常简单微序列控制器的基本结构
7.2 非常简单微序列控制器的设计和实现
采用微序列控制器重新设计第六章所讨论的
非常简单 CPU 。
指令集、有限状态机、数据通路和 ALU 单元都
是相同的, CPU 内部的数据流也没有变化,只有控
制 信号的产生方法有所改变。
2. 只用到两种可能的下址方式
为什么可以这样做?
考虑第六章所示的该 CPU 的状态图。
◆ 取指令周期的最后一个状态 FETCH3 可以转到四
个执行周期中的一个,这必须通过映射输入来实现。
◆ 剩余的每一状态都必须转到一个具体的次态,可
以通过绝对跳转来实现。
• 操作码映射
• 绝对跳转
必须确定 CPU 的几件事情:
从微代码存储器输出的绝对地址宽度有几位?
◆ CPU 的状态图中共有九种状态,每种状态
代表一条微指令,从中选择的话最少需要 4 位绝
地地址。既然映射硬件也生成同样宽度的地址,
那么输出的地址就是 4 位宽度。
◆ 多路选择器输出到寄存器的输入、以及寄
存器输出到微代码存储器的输入,也都是 4 位宽
度。
7.2.2 生成正确序列并设计映射逻辑 设计控制有限状态机状态转换的微代码。
一、给有限状态机的每种状态分配一个微代码地址
着重考虑:每一执行周期的第一个状态的地址分配
(它决定了实现映射功能的逻辑)
1.映射函数与映射逻辑
◆ 映射函数: 1IR[1..0]0
状态 ADD1 、 AND1 、 JMP1 和 INC1 →
1000 、 1010 、 1100 和 1110
(即 8 , 10 , 12 和 14 )
◆ 映射逻辑
2.非常简单微序列控制器的状态地址表
二、 生成正确的微代码序列
为了无条件转移到一种具体的状态,微序列
控制器通过地址域和选择域来提供状态的地址。
例如: FETCH1 → FETCH2
0 号单元: SEL=0 ADDR=0001
除了 FETCH3 ,状态图中的每一种状态都可以这么设置。
• 0 号单元对应于状态 FETCH1
• SEL=0 使微序列控制器从地址域得到它的下一地址
• 把地址域置为 0001 ,使它转到状态 FETCH2 所对应
的单元。
FETCH3 必须映射到正确的执行周期,所以要求
SEL=1 ,表示采用映射地址。
7.2.3 用水平微代码生成微操作 1 .非常简单 CPU 的微操作及它们的助记符
九个微操作 —— 9 位来
表 示 ( 每 个 微 操 作 1位)
1 —— 微操作发生
0 —— 不发生
2 .非常简单微序列控制器初步的水平微代码
3 .非常简单微序列控制器优化后的水平微代码
优化微代码。◆ 在所有的状态中, ARDR 和 IRDR 的值是相同
的。用一个输出 AIDR 来驱动这两个微操作。
◆ AIDR 组合了两个微操作 AR←DR[5..0] 和
IR←DR[7..6] 。
4 .产生所需的控制信号
AR←PC ; AR←DR[5..0]
PC←PC + 1 ;PC←DR[5..0]
DR←M
IR←DR[7..6]
AC←AC + DR ;AC←AC DR∧ ;AC←AC+ 1
7.2.4 用垂直微代码生成微操作 一、从垂直微代码中生成微操作的一般情况
在垂直微代码中,所有的微操作被分组到不同的
域中,使得任何状态一个域中最多只有一种微操作是有
效的,然后域中的每个微操作被赋予一个唯一的域值。
例如: 8 种不同的微操作 —— 3 位二进制
(从 000 到 111之间的任何一个值)
微操作域位从微代码存储器输出到一个译码器,译
码器的输出就是在水平微代码中直接产生的微操作。
二、为非常简单 CPU 设计垂直微代码
任务:给各种微操作分配不同的域。
◆ 指导性原则
1.对于同一状态下发生的两个不同的微操作,将它
们分配到不同的域中。每个域在一个周期中只能输出唯
一一个微操作的值,如果两个微操作要同时出现,则它
们不可能在同一个域中。
2.必要的话在每个域中包括一个 NOP 操作。
3.分配剩下的微操作以便充分地利用微操作的域位。
4.把修改相同的寄存器的微操作组合在同一个域中。
◆ 步骤
1.将微操作分组
▲ DRM 和 PCIN 都在 FETCH2 状态下发生,那么这两
种微操作必须被分配到不同的域中。则该 CPU 的微操作
至少需要两个域,我们分别把它标记为 M1 和 M2 ,包括
NOP 操作在内每个域的微操作如下:
M1 M2
NOP NOP
DRM PCIN
( FETCH2: DR←M , PC←PC+ 1 )
▲ PCIN 和 PCDR 都能修改 PC 值,所以我们现在把
PCDR 也加到 M2 中。
▲ 把剩下的微操作任意分配给这两个域,但要注意把
那些改变同一个寄存器值的微操作放到同一个域中。
▲ 产生如下的分配
M1 M2
NOP NOP
DRM PCIN
ACIN PCDR
PLUS ARPC
AND AIDR
AR←PC ;( ARPC )AR←DR[5..0] ( AIDR )
PC←PC + 1 ( PCIN ) PC←DR[5..0] ( PCDR )
DR←M ( DRM )
IR←DR[7..6] ( AIDR )
AC←AC+ DR ( PLUS ) AC←AC DR∧( AND ) AC←AC+1 ( ACIN )
2.每个域有五种微操作,因此每个域需要 3 位,一共 6位。
3.对这种分配进行一些调整,减少总的位数。
▲ 将 AIDR 从 M2移到 M1 。这样, M2 的微操作数从5
变到 4 ,而 M1 的从 5 变到 6 。这时, M1仍需要3 位,
但是 M2 现在只需要 2 位,微代码的宽度就减少了 1
位。
▲ 把 ARPC 和 PCDR 都从 M2移到 M1 ,这样一来 M1
就有 8 种微操作,需要 3 位;而 M2 只有两种微操作,
需要 1 位。对这种配置来说,总共 4 位,可能是最
少的了。
三、生成该 CPU 的最终微代码
四、增加硬件把这些位值转换为所代表的微操作
• M1 :把这个域输入到一个 3-8 译码器中
例如:输出 2 → 微操作 ARPC
• M2 :只有 1 位,不需要用译码器,直接驱动 PCIN 。
实践视角:毫微指令
毫微存储器与毫微指令
用毫微存储器可以减少微序列控制器中存储器的总
的大小。
如果 10 种不同的微指令有完全相同的微操作,那么所
有这些微指令可以指向毫微存储器的同一个单元。
例如:一个有 128 条微指令和 32 个不同微操作的微序
列控制器。
▲ 水平微代码的微序列控制器: 128*32=4,096 位存储器
假设:这 128 条微指令中只有 16 种不同的微操作组合,
在一个 16*32 的毫微存储器中存储这 16 种模式。每条微
指令需要一个 4 位的域来指向毫微存储器中的一个正确的
模式。
▲ 毫微存储器: 16*32=512 位
▲ 微代码存储器:额外的 128*4=512 位的指针
共 512 位+ 512 位 = 1,024 位
7.2.5 从微代码直接产生控制信号 1. 直接输出控制信号
微序列控制器为每个控制信号保留一位,以代替
水平微代码设计中的微操作和垂直微代码设计中的
M1 和 M2 。
对微代码存储器的每个字来说,如果信号有效,
则相应的控制位置 1 ,否则置 0 。
例如, FETCH2 : DR←M 和 PC←PC+1
▲ DR←M
▲ PC←PC+1 :使 PCINC 信号有效。
▲ 微指令的其他信号置 0 。
• 使 READ 信号有效
以便从存储器里输出数据
• 使 MEMBUS 信号有效
使此数据输入到内部系统总线上
• 使 DRLOAD 信号有效
以便把数据从总线上装载到 DR 中
2. 非常简单微序列控制器直接产生控制信号的微代码
FETCH1: AR←PC
FETCH2: DR←M , PC←PC+ 1
FETCH3: IR←DR[7..6] , AR←DR[5..0]
ADD1: DR←M
ADD2: AC←AC+ DR
AND1: DR←M
AND2: AC←AC DR∧ JMP1: PC←DR[5..0]
INC1: AC←AC+ 1
3. 优化直接生成控制信号的微操作
DRLOAD 、 MEMBUS 和 READ 信号总有相同的值,把
这些信号组合起来。用 1 位( DMR )驱动这 3 个信号。
直接产生控制信号与前两种方法相比:
优点:不需要额外的硬件将微代码存储器的输出转
换成控制信号
缺点:可读性差,难于调试。
7.3.1 修改状态图 考虑:条件跳转的取指令周期末尾
▲ 设计两种新的状态: JMPZ1 和 JPNZ1
▲ 使 FETCH3 映射到这两个状态上。
▲ 这两种状态再依据 Z 的值转移到正确的流程上。
7.3 相对简单微序列控制器的设计和实现 设计一个用于相对简单 CPU 的微序列控制单元。
类似非常简单 CPU ,这一设计用到的指令集、数据通
道、以及 ALU 都与硬布线控制设计中的相同。
7.3.2 设计顺序硬件和微代码 1 .增加完成条件分支的能力
新增加的两个状态 JMPZ1 和 JPNZ1 能根据 Z 的值正
确转移到两个下一地址之一:• 条件满足: 转移到 ADDR 域所指的地址
• 条件不满足 : 转移到微代码存储器的下一地址
(当前地址加 1 ) 2 .微序列控制器的基本结构
有三种可能的下一地址。
用一个两输入控制端的多路选择器作出选择。
4
3 .相对简单微序列控制器的状态分配
▲ 映射函数和映射逻辑
状态图有 39 种状态,要一个 6 位的地址。
映射函数: IR[3..0]00
相对简单微序列控制器的状态分配
4 .下址的产生
状态 JMPZ1 和 JPNZ1各自都用到两个下址之一。
分两步实现:
◆ 用一个多路选择器选择所期望的条件
▲ Z 和 Z’ 可能在 JMPZ1 和 JPNZ1 状态下用到,
也可以把一个硬布线的 1 作为无条件跳转的输入,
多路选择器选择其中的一个值作为条件值输出。
▲ 微代码存储器提供条件选择信号用来决定使
用哪个条件 。
条件值
◆ 用组合逻辑将这些条件值,连同微序列控制器提供的
一种分支类型,转换成恰当的选择信号以选择下一地
址的正确源。
▲ 给定分支类型
分支类型的形式:
IF (condition) THEN Next Address = SOURCE1
ELSE Next Address = SOURCE2
或者是
REGARDLESS OF condition Next Address = SOURCE
确定准确的分支类型:
映射和无条件转移的处理很容易,
有条件的跳转就取决于微代码的布局。
JMPZ1 和 JPNZ1会转移到两个地址之一:
一个分支地址、当前地址加 1
一种分支类型:
IF ( condition ) THEN Next Address = ADDR
ELSE Next Address = Current Address + 1
分支类型
▲ 根据分支类型和条件值,为下址多路选择器设计
出产生选择信号的逻辑。
表中列出了期望的值,它导致:
S1=BT , S0=BT’∧(条件值)
5
.实现微代码的顺序部分
7.3.3 用水平微代码完成设计 一、形成微操作表
考察每种状态,列出微操作。
把 22 种微操作合并为微代码的几个域,然后
为这些域赋值。
相对简单微序列控制器的微操作
二、生成CPU
的控制信号
三、相对简单 CPU 的部分控制信号值
介绍两种利用冗余来减少控制单元所需的微指令
数的方法。
7.4 减少微指令数
1. 用微子程序把重复的微操作合并成一个微指令块,
这个微指令块可供两个或更多个执行周期访问。
2. 用微代码的跳转来访问可供两个或多个周期共享
的微指令。
7.4.1 微子程序 微子程序 : 微码中供多个周期执行的一组动作序列。
优点:减少微代码所需的存储单元数量。
缺点:微序列控制器的硬件必须增强以实现微子
程序的调用和返回。
为了说明微子程序是怎样工作的,我们修改相对
简单 CPU 的设计。
1. 把一些状态用微子程序实现
考虑:状态 LDAC1 、 LDAC2 、 LDAC3 分别和状态 STAC1 、
STAC2 、 STAC3 执行相同的微操作。
(从存储器获得一个 16 位的地址,并把它存入 AR 中)
LDAC1 、 STAC1: DR←M , PC←PC+ 1 , AR←AR+ 1
LDAC2 、 STAC2: TR←DR , DR←M , PC←PC+ 1
LDAC3 、 STAC3: AR←DR , TR
◆ 修改最初的设计,把这些状态用一个微子程序实现。
增加两个哑状态: LDAC0 和 STAC0
▲ 当 LDAC 或 STAC 指令译码时, FETCH3 映射到这两
个状态中的一个。
▲ 两个哑状态不执行微操作,只是去调用微子程序。
▲ 当完成时,微子程序返回到下一地址。
(包含 LDAC4 或 STAC4 的地址)
◆ 用微子程序修改 LDAC 和 STAC 指令的执行周期
◆ 相对简单 CPU修改后的状态分配
SUB1 、 SUB2 、 SUB3分
别与 LDAC1 ( STAC1 )、
LDAC2 ( STAC2 )、
LDAC3 ( STAC3 )执行
同样的微操作。
2. 修改微序列控制器
微子程序的地址由微代码存储器的地址域 ADDR
输出提供。
微序列控制器必须将返回地址存储起来,一旦微
子程序结束,它才能继续执行。
进行如下修改:
◆ 增加一个微子程序寄存器以保存返回地址
(当前地址加 1 )
◆ 修改下一地址生成硬件,把微子程序寄存器包括
进去,作为产生下一地址的一个可能的源。
◆ 修改下一地址多路选择器的选择逻辑,使之能够
考虑可能的返回地址。这个逻辑也必须产生一个控
制微子程序寄存器的装载信号。
◆ 必须扩充分支转移类型的列表,使之包括微子程
序调用和返回的类型。
◆ 必须修改微代码,使之能够正确的访问微子程序。
修改后的微序列控制器硬件
3 .修改分支转移类型
修改后有四种分支转移类型:• 条件转移
• 无条件映射
• 微子程序调用
• 微子程序返回◆ 把 BT扩充为两位,以便于在四种类型中进行选择。
相对简单微序列控制器修改后的分支类型
◆ 产生下一地址多路选择器的控制信号 S1 和 S0 以及微
子程序寄存器的装载信号 L :
S1= BT0 S2= BT1 (BT∨ 0’∧条件值 )
L= BT1 BT∧ 0’
4. 修改执行周期微代码
相对简单微序列控制器修改后的微指令
7.4.2 微代码跳转 1. 修改状态图
无条件转移和条件转移指令有几个状态执行同
样的微操作。
修改状态图使这些指令可以直接访问相同的状
态。一个状态集将执行跳转,而另一个状态集将处
理不发生跳转的条件转移,于是这些周期将会转移
到正确的状态。
JUMP 、 JMPZ 和 JPNZ 指令修改后的状态图
2. 相对简单微序列控制器进一步修改后的微代码
7.5.1 指令集的复杂性 1. 随着指令条数的增加,产生控制信号的硬件复
杂性也随之增加。
例如:越来越多的指令会导致越来越多的发出累加
器装载信号的微操作,于是就增加了产生这一控制信号
需要的逻辑。
◆ 对硬布线控制来说
有更多状态要发出这些微操作,会导致用
7.5 微程序控制和硬布线控制的比较
来生成寄存器装载、加 1 以及清除信号所需的组
合逻辑的增加。
◆ 对水平型的微序列控制器来说
每个微操作对应一位微代码。使同一个微操
作更加频繁地发出,这不会改变产生实际控制信号
的组合逻辑的复杂性,因为对每个状态来说只需检
查同一位。然而,拥有更多的导致同一个寄存器装
载的不同微操作,将会增加逻辑的复杂性,因为会
有更多的微代码位需要检查。
◆ 垂直型微序列控制器控制逻辑的复杂性也会增加。
使同一寄存器装载的数目增多的微操作,导致的
是组合起来以产生装载信号的微代码位数的增加。微
操作的个数越多,需要的译码器的个数或位数就越多,
因为译码器要把这些微操作域转变成相应的微操作。
◆ 对于直接生成控制信号的微序列控制器来说
增加的微操作并不需要增加硬件。不管多少微操
作要生成该信号,每个控制信号只对应微代码中的一
位。
7.5.2 修改的容易度 修改的容易度:指 CPU 设计的可扩展性。
◆ 硬布线控制单元需要修改硬件来扩充 CPU
◆ 微代码控制单元常常只需改变微程序
修改微代码比重新设计硬件要容易的多。
7.5.3 时钟速度 硬布线 CPU运行的速度通常比微代码控制 CPU
的要快。
Intel公司的奔腾微处理器(大部分)使用的是微代
码控制。
1. 内部组成
7.6 实例:一个(大部分是)微代码的 CPU
奔腾微处理器
2. 内部存储器
• 8 个整数寄存器
• 8 个独用于浮点操作的额外寄存器
• 一个 32K 的 Cache 存储器3. 特殊目的的功能单元
• 浮点单元:负责处理所有的浮点指令,它包括专门
设计用来处理浮点数的硬件。
• MMX 单元:处理为多媒体应用而设计的指令。
4. 控制单元• 控制单元
• 指令译码
• 控制 ROM
5. 两个指令流水线
能同时完成两个整数操作。
它们的一部分采用特殊的、硬布线控制逻辑来控制。