54 5/

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

### 54 5/
54
busA
Rw Ra Rb
Overflow
32
32.32-bit
ALU
Result
Registers
busB
32
32
图5.9 支持 R-型指令功能的数据通路
了能写入正确的稳定结果,ALU 操作控制信号必须稳定一段时间保持不变。
4.立即数运算指令的数据通路
I-型带立即数的运算类指令都涉及对16位立即数进行符号扩展或零扩展,然后和 Rs
的内容进行运算,最终把ALU的运算结果送目的寄存器 Rt。
11条目标指令中ori指令和addiu是1-型带立即数的运算类指令,涉及的操作有or和
addu。图5.10是在图5.9的基础上增加了I型立即数运算类指令功能而得到的数据通路示
意图,因此,它同时也能完成R-型指令的执行。
RegWr!
Rd
Rt
RegDst
ALUctr;
0MUXI
or/addu
Rs
,Rt
5
54
54
busA
Rw Ra Rb
Overflow
busW
32
### 32 32-bit
ALU
Result
32
Registers
busB
CLK
32
0
32
MUX
扩展器
imm16-
32
16
ALUSre
|ExtOp
图5.10 支持1型带立即数运算指令功能的数据通路
与图 5.9相比,有以下3处变动。
(1)因为R-型指令和I型指令的目的寄存器不同,所以在寄存器堆的写地址端Rw处,
增加了一个多路选择器,由控制信号RegDst控制选择 Rd为目的寄存器还是Rt 为目的寄
存器。
(2)因为I型指令的立即数只有16位,需要对其扩展为32位才能送到32位 ALU 运
算。对于按位逻辑运算,应采用零扩展,对于算术运算,应采用符号扩展。因此,在数据通路
中应增加一个扩展器,由控制信号ExtOp控制进行符号扩展还是零扩展,其输入端连到指
第5章
139
令中的 imm16。


<!-- page: 157 -->

计算机组成与系统结构(第3版)
140
(3)因为R-型指令和I型指令在ALU的B口的操作数来源不同,所以,在 ALU的B
输入端增加了一个多路选择器,由控制信号ALUSrc控制选择 busB还是扩展器输出作为
ALU的B口操作数。
5.load/store 指令的数据通路
lw/sw指令是I-型指令,lw指令的功能为R[Rt]-M[R[Rs]+SEXT(imm16)];sw
指令的功能为M[R[Rs]+SEXT(imm16)]-R[Rt]。load指令和 store指令的地址计算
过程一样,都要先对立即数imm16进行符号扩展,然后和寄存器Rs的内容相加,得到访存
地址。load指令从该地址中读取一个32位数,送到寄存器 Rt中;store指令则相反。
图5.11是在图5.10的基础上增加了load/store指令功能而得到的数据通路示意图,因
此,它同时也能完成 R-型和I-型运算类指令的执行。
RegWr!
Rd
Rt
RegDst
0MUXI
ALUctr:
addu
Rs Rt
### 54 54
54
busA
Rw Ra Rb
Overflow
busW
32
### 32 32-bit
ALU
32
Registers
oMUX
busB
CLK
32
0
32
MUX
MemWr
32
扩展器
WrEn Adr
imm16-
32
Dataln
16
数据
32
MemtoReg
存储器
ALUSre
CLK
}ExtOp
图5.11支持load/store 指令功能的数据通路
与图5.10相比,有以下两处变动。
(1)因为运算类指令和load指令写入目的寄存器的结果的来源不同,所以在寄存器堆
的写数据端 busW处增加了一个多路选择器,由控制信号 MemtoReg 控制选择将 ALU 结
果还是存储器读出数据写入目的寄存器。
(2)因为load/store指令需要读写数据存储器,故增加了数据存储器。访存地址在
ALU中计算,因此数据存储器的地址端Adr连到ALU的输出。store指令将Rt内容送存
储器,所以直接将busB连到数据存储器的Dataln输入端,而将输出端连到 busW 端的多路
选择器上。控制信号 MemWr用作“写使能”信号。load/store指令的地址运算对立即数
imm16进行符号扩展,ALUctr 输入端的操作类型是不判溢出的加法 addu。
6.分支指令的数据通路
分支指令也是I-型指令,能根据不同的条件选择是否跳转执行。例如,相等转移指令
beq的功能为if(R[Rs]=R[Rt])PC-PC+4+(SEXT(imm?6)×4)else PC-PC+4。
图5.12是在图5.11基础上增加beq指令功能而得到的数据通路。与图5.11相比,主要增加
了取指令部件,转移目标地址的计算在下地址逻辑中实现,在ALU 中执行的是不判溢出的
减法操作 subu。


<!-- page: 158 -->

中央处理器
Branch
CLK
PC
RegWr!
Rd
Rt
RegDst
imm16
下地址
### 0 MUXl
ALUctr:
逻辑
16
subu
Rs
Rt
54
5
54
指令存储器
busA
Rw Ra Rb
Overflow
指令
busW
32
### 32 32-bit
ALU
Zero
32
Registers
OMUX
CLK
busB
32
OMUX
32
Mem Wr
32
扩展器
WrEn Adr
imml6-
32
Dataln
16
数据
32
MemtoReg
ALUSre
存储器
CLK
|ExtOp
图5.12 支持分支指令功能的数据通路
下地址逻辑的输出是下条指令地址,4个输入是 PC、Zero标志、立即数imm16和控制
信号 Branch。在ALU中对 R[Rs]和R[Rt]做减法得到一个 Zero标志,根据Zero标志可
判断是否转移。对于转移目标地址的计算,需要先对立即数imm16进行符号扩展再乘4,
然后和基准地址 PC+4相加。所以,ALU 的输出 Zero 标志需送到下地址逻辑,立即数
imm16和PC也要送到下地址逻辑,控制信号 Branch表示当前指令是否是分支指令,也应
送到下地址逻辑,以决定是否按分支指令方式计算下条指令地址。
因为指令长度为32位,主存按字节编址,所以指令地址总是4的倍数,即最后两位总是
00,因此,PC中只需存放前30位地址,即PC<31:2>。这样,下条指令地址的计算方法如下。
顺序执行时:PC<31:2>-PC<31;:2>+1。
跳转执行时:PC<31:2>-PC<31:2>+1+SEXT[imm16]。
取指令时:指令地址=PC<31:2>1100。
图5.13 是下地址计算逻辑,从图中可看出,每来一个时钟 CLK,当前PC作为指令地址
被送到指令存储器去取指令的同时,下地址逻辑计算下条指令地址并送PC的输人端,在下
个时钟到来后写入PC。
### 30 8
CLK
imm16-
30
1
16
30
00
Adder
0
30
MUX
Adder 30
SEXT
30
下地址逻辑
Branchi Zerg
Addr<31:2>
Addr<1:0>
指令存储器
指令[
32
第5章
141
图5.13 分支指令的下地址逻辑设计


<!-- page: 159 -->

计算机组成与系统结构(第3版)
142
7.无条件转移指令的数据通路
无条件转移指令是J-型指令,指令中给出了26位目标地址,其功能是无条件将目标地
址设置到 PC中。跳转目标地址的具体计算方法为PC<31:2>-PC<31:28>||target
<25:0>。图5.14给出了在图5.13的基础上加上无条件转移指令功能的完整的取指令部
件示意图。下地址逻辑中增加了跳转目标地址的计算功能,并通过控制信号Jump来选择
作为下条指令的PC 值。
Jump
### 30 8
CLK
imm16-
PC<31:28>
Target<25:0>
30
Adder
16
SEXT 30
30
26
30
Adder
30/
30
0
MUX
MUX
0
下地址逻辑
Branchi
|Zero
00
Addr<31:2>
Addr<1:0>
指令存储器
32
指令
图5.14 完整的取指令部件
取指令阶段开始时,新指令还未被取出和译码,因此取指令部件中的控制信号(Branch、
Jump)的值还是上条指令产生的旧值,此外,新指令还未被执行,因而标志(Zero)也为旧值。
不过,由这些旧控制信号值确定的地址只被送到PC输入端,并不会写入PC,因此不会影响
取指令功能。只要保证在下个时钟 CLK到来之前能产生正确的下条指令地址即可。单周
期方式下,所有指令都在单个时钟周期内完成执行,因而下个时钟会在足够长的时间(最长
的指令周期)后到来,此时,控制信号早就是新取出的当前指令对应的控制信号了,因而,取
指令部件能得到正确的下条指令地址,并在下个时钟到来前被送到 PC的输入端,一旦下个
时钟到来后,该地址开始写入PC,并作为下一条新指令的地址从指令存储器中取出新的
指令。
取指令部件的输出是指令,输入有3个:标志Zero、控制信号Branch和Jump。下地址
逻辑中的立即数imm16和目标地址 target<25:0>都直接来自取出的指令。因此,取指令
部件的外部结构如图5.15 所示。
Instruction<31:0>
Branch--
取指令
22:31>
<21:25>
<16:20>
<11:15>
<0:15>
Jump--
部件
CLK-
OP Rs
Rt
Rd imm16
Zerol
图5.15 取指令部件的外部结构


<!-- page: 160 -->

中央处理器
8.综合11条指令的完整数据通路
综合考虑上述所有数据通路的结构,可得到如图5.16 所示的完整单周期数据通路。图
中所有加下画线的都是控制信号,用虚线表示。指令执行结果总是在下个时钟到来时开始
保存在寄存器、数据存储器或PC中。
RegWr!
Instruction<31:0>
Branch-·
Rd
Rt
取指令
<26:31>
21:25>
<16:20>
<0:15>
Jump--
部件
RegDst
CLK—
1MUX0
Rs
Rt
OP Rs
Rt Rd imm16
54
5/
54
busA
Zero
Rw Ra Rbl
busW
32
### 32 32-bit
ALU Overflow
32
Registers
owUX
busB
CLK
32
0
32
MUX
MemWr
32
WrEn Adr
扩展器
Dataln
32
imm16-
数据
32
16
存储器
CLK
MemtoReg
ALUSre
I ExtOp
ALUctr
图5.16 完整的单周期数据通路
至此,已完成了所有11条指令所用到的数据通路,包括所用元件及其互连,并给出了控
制信号。下一步应考虑如何产生控制信号,这就是控制逻辑单元的设计问题。
5.2.3控制器的设计
控制器(控制单元)主要包含指令译码器,其输入的是指令操作码 OP(R-型指令还包括
功能码 func),输出的是控制信号。控制单元设计过程如下。
(1)根据每条指令的功能,分析控制信号的取值,并在表中列出。
(2)根据列出的指令和控制信号的关系,写出每个控制信号的逻辑表达式。
1.控制信号取值分析
根据对取指令阶段执行情况的分析可知,CLK信号到来后,经锁存延迟(Clk-to-Q)时
间,PC的值作为访存地址被送到指令存储器,经过“取数时间”后,指令被取出,后送控制单
元,经指令译码器译码,送出控制信号。随后,每条指令便在控制信号的控制下,完成相应的
功能。
以下分析每条指令执行阶段控制信号的取值情况。
1)R-型指令执行阶段
图5,17是R-型指令执行过程示意图,其中的粗线描述了R-型指令的数据在数据通路
中的执行路径:Register File(Rs,Rt)→busA,busB→ALU→Register File(Rd)。
控制信号的取值分析如下。
Branch=Jump=0:因为不是分支指令和无条件跳转指令。
RegDst=1:因为R-型指令的目的寄存器为Rd。
ALUSrc=0:保证选择busB作为ALU的B口操作数。
第5章
143


<!-- page: 161 -->

计算机组成与系统结构(第3版)
144
RegWr=I
Instruction<31:0>
Branch=0-
Rd
Rt
取指令
22:31
<21:2:
<16:2
<0:15>
Jump=0-
RegDst=I
部件
CLK-
MUX0
,Rs
Rt
OP Rs
Rt
Rd imm16
51
54
51
Zero
busA
Rw Ra Rb
busW
32
### 32 32-bit
ALU Overflow
32
Registers
MUX
busB
CLK
0
32
32
MUX
4MemWr=0
32
WrEn Adr
扩展器
Dataln 32
imm16-
数据
32
16
存储器
CLK
MemtoReg=0
ALUSrc=0
ExtOp=x
ALUctr=add/sub/subu/slt/sltu
图5.17
R-型指令执行过程
ALUctr=add/sub/subu/slt/sltu:5条R-型指令的操作各不相同,因而对应5种类型。
MemtoReg=0:保证选择ALU 输出送到目的寄存器。
RegWr=1:保证在下个时钟到来时,在不发生溢出的情况下结果被写到目的寄存器。
MemWr=0:保证在下个时钟到来时,不会有信息写到数据存储器。
ExtOp=x:因为ALUSre=0,所以扩展器的输出不会影响执行结果,故 ExtOp取0或
1都无所谓。
图5.18给出了R-型指令的操作定时过程。从图中可以看出,下条指令地址 PC+4将
在下个 CLK到来时开始写入PC,指令执行结果(ALU输出)也将在下个 CLK 到来时开始
写入目的寄存器Rd。
CLK
PC
Rs, Rt,Rd,
OP, fune
ALUctr
旧值
Clk-to-Q
新值
旧值
取指令时间
新值
PC+4→PC
旧值
控制单元延迟
新值
RegWr
busA, B
busW
旧值
新值
旧值
寄存器取数时间
新值
ALU 延迟
旧值
新值
写目的寄存器
图5.18 R-型指令的操作定时
PC+4


<!-- page: 162 -->

中央处理器
2)I-型运算指令执行阶段
图5.19 中的粗线给出了1-型运算指令的执行过程,从图中可以看出其数据在数据通路
中的执行路径为:Register File(Rs)→busA,扩展器(imm16)→ALU→Register File(Rt)。
RegWr=1
Instruction<31:0>
Branch=0-
Rd
Rt
取指令
<22:31>
<16:20
<21:25>
<11:15
<0:15>
Jump-0
RegDst=0
部件
CLK—
MUx 0
,Rs Rt
OP Rs
Rt
Rdimm16
54
5
5
busA
Zero
Rw RaRb
32
busW
32.32-bit
ALU Overflow
32
Registers
0
busB
CLK
oMUX
32
MUX
32
4Mem Wr=01
32
WrEn Adr
扩展器
Dataln 32
imm16-
数据
32
16
存储器
K
MemtoReg-0
CL
ALUSre=1
ExtOp-0/1
ALUctr-or/addu
图5.19 1型运算指令执行过程
对于目标指令中的I-型运算指令ori和addiu,不难看出各控制信号的取值如下。
Branch=Jump=0,RegDst=0,ALUSre=1.ALUctr=or/addu(ori指令为or,addiu指
令为 addu),MemtoReg=0,RegWr=1,MemWr=0,ExtOp=0/1(ori指令为0,addiu指令
为1)。
3)load/store 指令执行阶段
图5.20中的粗线给出了load指令的执行过程,从图中可以看出其数据在数据通路中的
执行路径为:Register File(Rs)→busA,扩展器(imm16)→ALU(addu)→数据存储器→
Register File(Rt).
RegWr=1!
Instruction<31:0>
Branch=0-
Rd
Rt
取指令
<22:31>
21:25
<16:20>
<1:15>
0:15>
Jump=0-
RegDst=0
部件
CLK-
MUX?
Rs Rt
OP Rs
Rt
Rdimm16
54
5/
5
Zero
busA
RwRaRb
busW
32
### 32 32-bit
ALU Overflow
32
Registers
OMUX
CLK
busB
OMUX
32
32
Mem!Wr=0
32
WrEn Adr
扩展器
32
Dataln
imm16-
数据
32
16
存储器
CLK
MemtoReg=|
ALUSrc=1
ExtOp=1
ALUctr=addu
第5章
145
图 5.20 load 指令的执行过程


<!-- page: 163 -->

计算机组成与系统结构(第3版)
146
load指令各控制信号的取值如下:Branch=Jump=0,RegDst=0,ALUSre=1,
ALUctr=addu,MemtoReg=1,RegWr=1,MemWr=0,ExtOp=1(符号扩展)。
图5.21是store指令的执行过程示意图。从图中可看出,其数据在数据通路中的执行
路径为:Register File(Rs,Rt)→busA,扩展器(imm16),busB→ALU(addu),busB→数据
存储器。
RegWr=0|
Instruction<31:0>
Branch-0.
Rd
Rt
取指令
<22:31:
<21:25:
<16:20>
<1:15>
Jump=0.
0:15>
RegDst=x
部件
CLK
1MUX?
,Rs Rt
OP Rs
Rt
Rd imm16
5/
51
busA
Zero
Rw Ra Rb
busW
32
### 32 32-bit
ALU Overflow
32
Registers
0
busB
CLK
32
MUX.
32
MUX
MemWr=J
32
扩展器
WrEn Adr
32
Dataln
imm16
数据
32
16
存储器
CLK
MemtoReg=x
ALUSrc=I
ExtOp=1
ALUctr=addu
图 5.21 store 指令的执行过程
store指令各控制信号的取值如下:Branch=Jump=0,RegDst=x,ALUSrc=1,
ALUctr=addu,MemtoReg=x,RegWr=0,MemWr=1,ExtOp=1(符号扩展)。
4)分支指令执行阶段
分支指令beq通过做减法来得到 Zero标志,然后将 Zero标志送到取指令部件,和控制
信号 Branch一起进行“与”操作,以控制下条指令地址的计算。因此,其数据在数据通路中
的执行路径为:Register File(Rs,Rt)→busA,busB→ALU(subu)→Zero 标志→取指令部
件。在取指令部件(参见图5.14)中,若Zero=0,则执行PC<31:2>-PC<31:2>+1;若
Zero=1,则执行PC<31:2>-PC<31:2>+1+SEXT[imm16]。
beq指令各控制信号的取值如下:Branch=1,Jump=0,RegDst=x,ALUSrc=0,
ALUctr=subu,MemtoReg=x,RegWr=0,MemWr=0,ExtOp=x。
5)无条件转移指令执行阶段
在11条指令中,无条件跳转指令最简单,除了改变PC的值外,不做任何其他工作。因
此,只在取指令部件中由控制信号Jump控制下条指令地址的计算,其控制信号取值只要保
证:①Branch=0,Jump=1,以使取指令部件能正确得到下条指令地址;②RegWr=0,
MemWr=0,以使寄存器堆和数据存储器在本指令执行时不被写入任何结果。其他控制信
号的取值任意。
综上所述,得到各指令的控制信号取值,如表5.4所示。
2.控制单元设计
在分析每条指令中控制信号取值的基础上,可以设计控制单元。从表5.4可看出,除了
ALUctr外,其他都是单值控制信号;而且,对于所有R-型指令,除了ALUctr信号以外,其


<!-- page: 164 -->

中央处理器
表5.4 各指令控制信号取值
(a)指令操作码及功能码
指令
add
sub
subu
slt
sltu
ori
addiu
lw
sw
beq
jump
OP
### 000000 000000 000000 000000 000000 001101 001001 100011 101011 000100 000010
func
### 100000 100010 100011 101010 101011
(与 func 取值无关)
(b)指令的控制信号取值
控制信号
add
sub
subu
slt
sltu
ori
addiu
lw
sw
beq
jump
Branch
0
0
0
0
0
0
0
0
0
1
0
Jump
0
0
0
0
0
0
0
0
0
0
1
RegDst
1
1
1
1
1
0
0
0
×
×
×
ALUsre
0
0
0
0
0
1
1
1
1
0
×
AL.Uctr
add
sub
subu
slt
sltu
or
addu
addu
addu
subu
×
MemtoReg
0
0
0
0
0
0
0
1
×
×
×
RegWr
1
1
1
1
1
1
1
1
0
0
0
MemWr
0
0
0
0
0
0
0
0
1
0
0
ExtOp
×
×
×
×
×
0
1
1
1
×
×
余控制信号的取值都相等,R-型指令的 ALUctr信号的取值由其func字段决定。因此,可
以考虑单独用一个局部的 ALU控制器来对 R-型指令进行译码,译码输出为ALUctr 信号。
如图5.22所示,控制器分成主控制器和局部ALU 控制器两部分。主控制器的输入为
指令操作码 OP,输出各种控制信号,并根据指令所涉及的ALU运算类型产生ALUop。同
时,生成一个R-型指令的控制信号R-type,用它来控制选择将ALUop输出作为ALUctr 信
号,还是根据R-型指令中的func字段来产生 ALUetr 信号。因此,R-型指令时 R-type=1;
非 R-型指令时 R-type=0。
func
ALU
6
Branch
控制器
(局部)
OP
主控制器
6
ALUor
3
R-type
XUM
ALUctr
3
0
ALU
图 5.22 控制器的设计
ALUop 的取值如下。
(1)R-型指令:由局部 ALU控制器根据func字段来确定ALUctr,故ALUop=任意。
(2)1-型ori指令:ALUop=ALUctr=or。
(3)1-型 addiu指令:ALUop=ALUctr=addu。
(4)I-型lw/sw指令:ALUop=ALUctr=addu。
(5)I-型beq指令:ALUop=ALUctr=subu。
第5章
147


<!-- page: 165 -->

计算机组成与系统结构(第3版)
148
(6)J-型指令:ALUop=ALUctr=任意。
根据表5.3中对 ALUctr的编码定义,得到 ALUop的编码方案,如表 5.5所示。
表5.5 ALUop 的编码分配
ALU 操作(ALUetr)
R-型指令
add/sub/subu/slt/sltu
ori
or
addiu
addu
lw/sw
addu
beq
subu
jump
任意
ALUop<2:0>
Xxx
010
000
000
100
XXX
1)主控制器的设计
根据表5.4和表5.5,可写出主控制器的各控制信号的逻辑表达式。假定操作码OP各
位分别表示为op<5>、op<4>、op<3>、op<2>、op<1>、op<0>,则Branch、RegWr
和 ALUop的逻辑表达式如下:
Branch=beq=!op<5>6!op<4>6!op<3>6op<2>6!op<1>6!op<0>
RegWr-R-type+ori+addiu+lw
-!op<5>6!op<4>6!op<3>6!op<2>6!op<1>6!op<0>
(R-type)
+!op<5>6!op<4>6op<3>6op<2>&!op<1>6op<0>
(ori)
+!op<5>6!op<4>6op<3>6!op<2>6!op<1>6op<0>
(addiu)
+op<5>6!op<4>6!op<3>6!op<2>6op<1>6op<0>
(1w)
ALUop<2>=beq=!op<5>8!op<4>6!op<3>6op<2>6!op<1>6!op<0>
ALUop<1>=ori=!op<5>s!op<4>6op<3>6op<2>6!op<l>6op<0>
ALUop<0>=R-type=!op<5>6!op<4>6!op<3>6!op<2>6!op<1>6!op<0>
或
ALUop<0>=jump=!op<5>&!op<4>6!op<3>6!op<2>6op<1>∈!0p<0>
根据上述各控制信号的逻辑表达式,可方便地画出控制器逻辑电路。如图5.23所示,
主控制器可用一个 PLA电路实现,其中的“与”阵列是指令译码器。
OP
指令译码器
R-type
oni
addiu
lw
sw
beq
jump
RegWr,
ALUSre
RegDst
demtoBc g
MemWr
Branch
Jump
ExtOp
ALUop<0>
ALUop<1>
ALUop-
R-type
图5.23 主控制器逻辑电路


<!-- page: 166 -->

中央处理器
2)ALU 控制器的设计
ALU控制器的输入为func字段,输出为ALU操作控制信号 ALUctr,根据表5.3可得
到本节所要实现的11条目标指令中包含的5条R-型指令的func字段编码分配情况,如
表5.6所示。
表5.6 func字段编码分配表
func<5:0>
MIPS 指令
ALU 操作类型
ALUctr<2:0>