第七章(多周期CPU)27

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

selpc
aluc alusrcb
we rna qa rnb wn d qb Regfile
jal
0 1 2 3
A
0 1
0 1 imm addr e
B <<
4
0 1 2 3
a aluc z ALU b
C
>> 图 立即数类型指令的执行周期EXE
• 符号扩展后的立即数连接到ALU左边的4选1 多路器的输入端。 • 这些指令完成的操作如下:
• 电路如下图。
pcsource
wpc
wir op func
Control Unit sext
aluc wreg
selpc
0 1
alusrcb
P C
a do Mem
I R
rs rt
f 0 1 imm addr e
we rna qa rnb wn d qb Regfile
<< >>
jal
0 1 2 3
– 判断结束由z给出,控制部件使用它来产生wpc 信号:
• 如果条件满足,修改PC,即wpc=beq z+ bne z#, pcsource=1(选择寄存器C的内容)。
• 寄存器类型的算术逻辑类型指令(add、sub、and、 or和xor)所需电路与转移指令相同,只是控制信号 不同。 • 这些指令完成的操作:
– ARegisterFile[rs]; //读数据 – BRegisterFile[rt]; //读数据 – CPC+sign_extend(offset)<<2;
//计算转移地址
• 电路如下图。
pcsource
wpc
wir op sext func
Control Unit alusrcb selpc we rna qa rnb wn d qb Regfile e << A 0 1 0 1 2 3
第 7 章
多周期CPU及其Verilog HDL实现
学习指南
• 把一条指令的执行分成若干个周期
– – – – – 取指令周期IF 指令译码周期ID 指令执行周期EXE 存储器访问周期MEM 结果写回周期WB
• 多周期CPU的总体电路及Verilog HDL代码
– 多周期CPU的总体电路 – 多周期CPU的Verilog HDL代码
– wir=1(写IR) – wpc=1(写PC) – selpc=1(选择PC) – alusrcb=1(选择4) – aluc=x000(ALU做加法) – pcsource=0(选择PC+4)
7.1.2 指令译码周期ID
• 除了j,jal和jr指令之外,其他指令在指令译 码(Instrument Decode)周期完成下面三个工 作:
• 执行sw指令时,把寄存器B的内容写入存储器。
– 由于B没有写使能端,即每个周期都更新B,所以要保 证在EXE周期向B中写入的是所希望的数据,即: BRegister[rt]。 – 由于在ID周期结束时并没有向IR寄存器写入新的指令, 所以在EXE周期向寄存器写入的仍然是Register[rt]。
op0 1 2 3源自I RA sa B <<
0 1
0 1 0 1 2 3
4
a aluc z ALU b
C
imm addr
• 用了一个2选1多路器,选择信号为shift, 为1时选择指令中的sa。 • 这些指令完成的操作如下:
– sll: CB<<sa; – srl: CB>>sa; – sra: Csigned(B)>>sa;
7.1 把一条指令的执行分成若干个周期
• 在实现的20条指令中,最复杂的指令就是 lw rt,offset(指令中的偏移量)(rs)。 • 它需要5 个周期,其整个执行过程为:
– 根据PC取指令,并把PC+”1”。 – 对指令译码并读出rs寄存器的内容。 – 计算存储器地址:由rs寄存器的内容与指令中 的偏移量offset相加得到。 – 使用计算好的地址访问存储器,从中读出一个 32位的数据。 – 最后把该数据写入寄存器堆中的rt寄存器。
• 指令j,jal和jr在本周期完成最后的操作是无 条件转移。具体如下:
– j: PC{PC[31:28],address,00}; – jal: RegisterFile[31]PC; PC{PC[31:28],address,00}; – jr: PC RegisterFile[rs];
寄存器加
寄存器减 寄存器与 寄存器或 寄存器异或 左移 逻辑右移
4
4 4 4 4 4 4
7.1.1 取指令周期IF
• 取指令周期IF完成的工作
– 取指令 – PC+“1”
• 电路如下图。
pcsource
wpc
wir op sext func
Control Unit alusrcb selpc we rna qa rnb wn d qb Regfile e << A 0 1 0 1 2 3
寄存器移位类型指令
• 移位指令(sll、srl和sra)所需电路如下图。
pcsource z wpc wir Control Unit wreg sext func P C a do Mem rs rt f 0 1 we rna qa rnb wn d qb Regfile e >> 图 移位类型指令的执行周期EXE jal shift selpc aluc alusrcb
wreg
sext
shift
selpc
rs
rt
f 0 1
we rna qa rnb wn d qb Regfile
jal
0 1 2 3
A sa B <<
0 1
0 1 0 1 2 3
4
a aluc z ALU b
C
e
>>
图 存储器访问周期MEM
• 这里把指令存储器和数据存储器合二为一。 • 由于取指令时使用PC作为存储器地址,而 读取存储器数据时使用ALU计算出的地址, 所以在存储器的地址输入端使用了一个2选 1多路器。 • 2选1多路器的选择信号为iord。执行lw或sw 时,iord=1,选择寄存器中的地址。 • 还使用了一个新的寄存器:DR(Data Register)。从存储器中取出的数据存放在 DR中。
aluc 0 1 2 3
P C
a do Inst Mem
I R
rs rt
B
4
a aluc ALU z b
A
imm
图 指令译码周期ID(不包括j,jal,jr)
• 多周期CPU设计的原则:
– 在每个周期结束时把本周期的结果保存在某个 地方以便下一个周期使用。 – 如设置了一个带有写使能端的指令寄存器IR,这 样,即使PC值改变了,只要IR(Instrument Register)的写使能端wir(Write IR)无效,IR中的指 令就不会改变。
• 由于ALU在该周期无事可做,所以可以完成 PC+”1”的工作,不必再使用一个专门的加法 器。
– 由于不是每个周期PC都加”1”,所以也给PC加了 一个写使能wpc。
• 在ALU前面还加了2个多路器,它们的选择 信号分别为selpc(select PC)和alusrcb(ALU source B)。 • 该周期的控制信号的输出应该为:
• 转移类指令(如beq rs,rt,offset)需要3个周期:
– 根据PC取指令,并把PC+”1”。 – 读出rs和rt寄存器的数据并锁存,同时ALU计算 转移地址并锁存。 – 由ALU比较2个寄存器数据,并决定是否把转移 地址写入PC。
• 多周期CPU与单周期的时序比较如下图。
lw
add
beq
lw 5
add 4
beq 3
j 2
• 注意:多周期忽略了转移类指令的延迟转 移特性。
• 表 每条指令所用的周期数
指令 意义 周期数
add rd,rs,rt
sub rd,rs,rt and rd,rs,rt or rd,rs,rt xor rd,rs,rt sll rd,rt,sa srl rd,rt,sa
aluc 0 1 2 3
P C
a d Mem
I R
rs rt
B
4
a aluc ALU z b
C
imm
图 指令译码周期ID(不包括j,jal,jr)
• 控制信号的输出应该为:
– wir=0(不写IR) – wpc=0(不写PC) – selpc=1(选择PC) – alusrcb=3(选择左移2位后的offset) – sext=1(符号位扩展) – aluc=x000(ALU做加法) – pcsource=x(任意,因为不写PC)
– add/sub/and/or/xor: CA op B;
• 立即数类型的指令(addi、andi、ori、xori、lw、sw 和lui)所需的电路如下图。
pcsource z
wpc
wir op func P C a do Mem I R rs rt f
Control Unit wreg sext
//$signed(B)>>>sa
• 注意:指令中的sa只有5位,送往2选1多路 器时要扩展成32位。实际使用的只有最低5 位。
• 本周期结束时,lw和sw指令将进入存储器 访问周期MEM;其他指令将进入结果写回 周期WB。
7.1.4 存储器访问周期MEM
• 只有lw和sw指令进入存储器访问周期 MEM(Memory Access)。 • 在EXE周期已经计算出了存储地址,放在寄 存器C中。 • lw和sw指令完成的操作如下:
– lw: DRMemory[C]; //从MEM读数 – sw: Memory[C]B; //向MEM写数
• 这2条指令在存储器访问周期所需的电路如 下图。
pcsource wpc iord wmem wir op func P C 0 1 a do Mem di I R D R imm addr Control Unit z aluc alusrcb
• 最简单的指令为j adderess,2个周期即可:
– 根据PC取指令,并把PC+”1”。 – 指令中的address左移2位与PC的高4位拼接起来, 写入PC。
• ALU计算类型的指令需要4个周期:
– 根据PC取指令,并把PC+”1”。 – 读出rs和rt寄存器的内容。 – 由ALU完成对2个寄存器数据(或1个立即数)的计 算。 – 最后把结果写入寄存器堆 中的rd(或rt)寄存器。
func
P C a do Mem I R rs rt f 0 1 imm addr jal
we rna qa rnb wn d qb Regfile
A
0 1
0 1 2 3
B
4
a aluc z ALU b
C
e
<< >>
图 转移指令和寄存器类型的算术逻辑运算指令执行周期EXE
• 电路新加部分:判断是否相等由ALU完成。
A
B
4
0 1 2 3
a aluc ALU z b
C
图 指令译码周期ID(包括j,jal和jr)
7.1.3 指令执行周期EXE
• j,jal和jr在ID周期已经完成了它们的使命, 而其他指令则进入执行(Execution)周期。 • 因不同类型的指令在执行时有不同的要求, 所以要分很多种情况讨论。 • 条件转移指令beq和bne的执行情况
– addi: CA+sign_extend(immediate); – andi/ori/xori: CA op zero_extend(immediate); – lw/sw: CA+sign_extend(offset); – lui: Cimmediate<<16;
• 由于immediate和offset都是16位立即数imm, 执行这些指令时,控制信号alusrcb=2(选择 立即数)。
• 用有限状态机实现多周期CPU的控制部件
– – – – 多周期CPU的控制部件的状态转移图 多周期CPU的控制部件的总体结构 控制信号的产生 控制部件的Verilog HDL代码
• 存储器及测试程序设计
– 存储器设计 – 测试程序代码 – 多周期CPU测试结果
• 单周期CPU用一个时钟周期执行一条指令。 而确定时钟周期的时间长度时要考虑执行 时间最长的指令,以此写出时钟频率。 • 因此不管每条指令的复杂程度如何,单周 期CPU都花费相同的时间去执行每条指令, 造成了时间上的浪费。 • 本章讨论多周期CPU的设计方法并给出 Verilog HDL代码。 • 多周期CPU的思想是把一条指令的执行分成 若干个小周期,根据每条指令的复杂程度, 使用不同数量的小周期(周期)去执行。
– beq: if(A==B) PCC; – bne: if(A!=B) PCC;
• 注意:
– 寄存器C的内容是ID周期计算出来的转移地址。 – 在本周期结束操作。
• 电路如下图。
pcsource z wpc wir op Control Unit wreg sext selpc aluc alusrcb 0 1 2 3
相关文档
最新文档