32位MIPS CPU 设计 实验报告详解.docx
- 文档编号:12881695
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:38
- 大小:463.08KB
32位MIPS CPU 设计 实验报告详解.docx
《32位MIPS CPU 设计 实验报告详解.docx》由会员分享,可在线阅读,更多相关《32位MIPS CPU 设计 实验报告详解.docx(38页珍藏版)》请在冰豆网上搜索。
32位MIPSCPU设计实验报告详解
数字逻辑与处理器基础实验
32位MIPSCPU设计
综述:
我们的最后验收结果时钟频率是84.9MHz。
本实验报告主要分为实验设计说明与实验收获总结两个部分。
附件中有CPU工程文档与模块代码。
第一部分实验设计
一、ALU设计
1、设计思路
实现基本的算术、逻辑、关系、位与移位运算,尽量优化以达到最小的面积延时积。
结构图如下:
主要设计思想:
A.加法运算实现可以采用逐次进位、超前进位等结构,减法可以通过加法实现(参见见面理论课讲义或者前面实验);同时输出Z(结果为零)、V(结果溢出)、N(结果为负)等标志位,注意有符号数和无符号数标志产生的不同。
B.比较运算根据减法运算的结果(Z/V/N)产生,自行分析比较操作与算术运算之间的关系。
C.移位运算可以考虑将移位操作拆分为16位移位、8位移位、4位移位、2位移位、1位移位等几个子运算的组合,然后级联形成最后的运算结果。
D.逻辑运算可以根据要求直接产生。
功能表
接口说明
名称
类型
描述
A[31:
0]
输入
操作数1
B[31:
0]
输入
操作数2
ALUFun[5:
0]
输入
功能码
Sign
输入
符号:
有符号1,无符号0
S[31:
0]
输出
结果输出
2、主要模块
a)32bit加法器
采用8个4bit超前进位加法器极连的方式,构成32bit加法器。
对于逸出位v的处理如下:
由有符号数的性质可知,对最高位32和次高位31位取抑或,输出信号则为是否逸出。
对32位运算结果取反后,再对相邻两位反复取与,最终得到结果是否为零的输出z.如果是有符号数,则符号位=n。
由于这一方法部分程度上减弱了高位计算对低位计算的依赖程度,因此可以实现延时的降低。
同时,由于其超前进位网络的大量逻辑运算,较大程度上提升了电路的面积,造成最终的面积延时积特性恶化。
关键代码见附录1
b)32bit减法器
对加法器按位取反,再加一。
关键代码见附录1
c)32bit右移
32bit左移
32bit算术右移
将移位操作拆分为16位移位、8位移位、4位移位、2位移位、1位移位等几个子运算的组合,然后级联得到最后的运算结果。
关键代码见附录1
d)32bit逻辑比较单元
采用行为级语句直实现逻辑比较功能。
关键代码见附录1
e)ALU顶层控制模块
用多路选择器实现对输出结果的控制,采用行为级语句实现设计。
附加说明:
对于无符号运算的结果,由于z,v,n已经将符号的作用考虑进去,因此,对于需要实现的六个指令,仅有A<B需要特殊处理,而其他指令对于无符号数和有符号数的结果一致。
因此,针对A<B指令,添加针对无符号数的专用比较电路,并使用与超前进位加法器类似的方式进行并行加速操作。
关键代码见附录1
二、单周期MIPS处理器设计
流程框图:
1、中间参数说明
1)ILLOP=0x80000004,为发生中断时,中断处理程序的PC地址,处于内核态。
2)XADR=0x80000008,为发生异常时,异常处理程序的PC地址,处于内核态。
3)Xp=26,为ILLOP与XADR中中断/异常处理程序调用,用来存储返回地址,即发生异常/中断的PC值。
4)Ra=31,为返回值存储器,应用于jr,jalr指令,跳转到寄存器中所存的PC地址。
5)Instruction截取部分:
a)寄存器:
Rs=Ins[25:
21];Rt=Ins[20:
16];Rd=Ins[15:
11];
b)Shamt=Ins[10:
6]应用于sll,srl,sra三条指令
c)Imm/Offset=Ins[15:
0]应用于lw,sw,lui,addi,addiu,andi,slti,sltiu,beq,bne,blez,bgtz,bgez这些I型指令
d)JT,应用于j型指令j与jal,JT=Ins[25:
0]<<2(框图中未左移有误),保存跳转地址,由于地址为32位,JT仅28位,由本题地址特殊性高位接4’b0000,表示在外部。
6)ConBA为条件分支跳转地址,ConBA=PC+4+Offset<<2。
2、控制信号说明
1)PCSrc,3位,6种有效取值。
PCSrc
000(缺省)
001
010
011
100
101
PC更新值
PC+4
分支见2
JT
DatabusA
ILLOP
XADR
详细说明:
000时为默认PC更新为PC+4,应用于不需要跳转的各条指令。
001时进入条件分支,满足条件PC=ConBA,不满足时PC=PC+4,应用于各种branch指令。
010时PC更新为无条件跳转地址,PC=JT,应用于j,jal指令。
011时PC更新为寄存器跳转,PC=$Ra,应用于jr,jalr指令。
100,101分别为中断与异常时的跳转地址。
2)ALUout[0],1位信号(是否跳转判断)
Zero
0(缺省)
1
条件分支PC更新
PC+4
ConBA
0时不满足分支条件(branch下ALU输出为0),1时满足分支条件。
3)RegDst信号,控制寄存器堆写入地址
RegDst
00
01
10
11
AddrC
Rd
Rt
Ra
Xp
详细说明:
00时写入Rd,应用于所有R型指令,唯一例外jr指令,R型指令不需要写入,令写入$0即可。
其中jalr与10中一种情况冲突,处理见10中说明。
01时写入Rt,应用于部分需要写入的I型指令(配合RegWr=1)有lw,lui,addi,addiu,andi,slti,sltiu,以及部分不需要写入的I型指令(配合RegWr=0)有sw,beq,bne,blez,bgtz,bgez。
10时写入ra,应用于跳转链接指令jal
11时写入Xp,应用于异常/中断时,写入异常/中断处的最终执行完的下条指令
4)RegWr,1位信号,寄存器堆写入使能信号,1时可写,缺省0不写入
R型指令(jr时配合rd写入到$0不影响),需写入的I型指令lw,lui,addi,addiu,andi,slti,sltiu,需写入的j型指令jal(jalr使用R型指令方法写入)。
5)ALUSrc1,1位信号,ALU第一操作数选择控制信号。
ALUSrc1
0
1
ALU第一操作数
DataBusA
shamt
详细说明:
0时第一操作数来自寄存器应用于所有非偏移操作
1时第一操作数来自R型中shamt部分,应用于偏移操作sll,srl,sra
6)ALUSrc2,1位信号,ALU第二操作数选择控制信号。
ALUSrc2
0
1
ALU第二操作数
DataBusB
Imm/Offset操作结果
详细说明:
0时第二操作数来自寄存器,应用于所有R型指令与J型指令(无效操作)
1时第一操作数来自I型中Imm部分的某种计算结果,应用于I型指令,另有EXTop与LUop两个某种计算的控制信号配合操作。
7)EXTop,扩展方式选择信号
EXTop
0(缺省)
1
扩展方式
无符号扩展
有符号扩展
详细说明:
0时对Imm/Offset无符号扩展,应用于unsigned的I型指令,addiu,sltiu
1时对Imm/Offset有符号扩展,应用于非unsigned的I型指令
8)LUop,Imm计算方式选择控制信号
EXTop
0(缺省)
1
输出结果
用之前扩展结果
取立即数高位
详细说明:
0时将Imm扩展结果作为ALUSrc2选择输入中的一路。
1时取立即数高16位与16位0拼接作为ALUSrc2选择输入中的一路,应用于lui指令。
9)ALUFun,6位控制信号,控制ALU计算功能
类型
功能
ALUFun
描述
算式
ADD
000000
S=A+B
SUB
000001
S=A-B
位运算
AND
011000
S=A&B
OR
011110
S=A|B
XOR
010110
S=A^B
NOR
010001
S=~(A^B)
“A”
011010
S=A
移位运算
SLL
100000
S=B< 0] SRL 100001 S=B>>A[4: 0] SRA 100011 S=B< 0]算术移 关系运算 EQ 110011 If(A==B)S=1elseS=0 NEQ 110001 If(A! =B)S=1elseS=0 LT 1101101 If(A LEZ 111101 If(A<=0)S=1elseS=0 GEZ 111001 If(A>=0)S=1elseS=0 GTZ 111111 If(A>0)S=1elseS=0 10)Sign,ALU运算是否有符号运算控制说明 Sign 0(缺省) 1 计算方式 无符号计算 有符号计算 详细说明: 0时ALU进行无符号计算,应用于unsigned计算addu,subu,addiu,sltiu 1时ALU进行有符号计算,应用于正常有符号运算除了上述4种指令之外的计算指令。 11)MemRd,读取内存控制信号 MemRd 0(缺省) 1 结果 不读取,ReadData输出全0 读取内存,ReadData输出为该地址内容 1时应用于需要读取内存的指令lw 12)MemWr,写入内存控制信号 MemWr 0(缺省) 1 结果 不写入,ReadData输出全0 写入内存,将输入内容写入输入地址 1时应用于需要写入内存的指令sw 13)MemToReg,2位控制信号,3个有效输入 MemToReg 00 01 10 输出 ALUOut ReadData PC+4 详细说明: 00时为应用于R型指令以及不需要读取内存且需要写入内存的I型指令 01时应用于将内存中读取内容写入寄存器的指令lw 10时应用于需要将PC值写入到寄存器的指令jal,jalr,以及中断或异常时将PC写入Xp的操作。 3、编译程序的设计 为了方便地将汇编语言转换成机器语言,进而写入rom模块中变成一条条指令,送至处理器处理,我们利用C++语言编写了一个小程序,用于实现上述的功能。 程序设计的思路就是实现一种解释的功能,能够逐句地按照MIPS指令的格式规则将汇编语言解释成机器语言。 所以,读入指令后,提取出指令里的关键字,按照(见附件,指令集.xlsx)指令集中的规则,对应翻译即可。 程序的核心函数是translation函数,输入是指令字符串,输出是机器码结构体(结构体中是指令的op,rs,rt,rd,shamt,funct,imm,target值)。 该函数首先逐字符地检测指令,将指令名称读出,进而以$为标志,读出对应寄存器名称,对数字进行拼数处理,也存储下来。 接下来根据读出的指令,确定对应的机器码值,分别赋给上述结构体中即可。 另外,程序利用文件处理的方法,输入指令可以复制到input.txt中,输出到output.txt中,方便存储和之后的利用。 为了将转换好的机器语言复制到rom模块中,需要对每一串二进制数进行格式处理,这里有一个小程序用于格式处理。 处理成如下的格式 0: data<=32'b00111100000000011000000000000000;//lui$at,0x8000 程序代码见附件(Assembler.cpp,Try.cpp)。 4、计算最大公约数汇编程序的设计 计算最大公约数,这里采用辗转相减法。 即给定两个数s1和s2,用较大的数减去较小的数得到的结果赋值给之前较大的那个数,重复做这件事,直到s1和s2中至少出现了一个0为止,这样,此时s1和s2的和就是要求的最大公约数。 例如,s1=8,s2=12,第一次相减得到s2=4,s1=8,第二次相减得到s1=4,s2=4,第三次相减得到s1=0,s2=4,发现s1=0,停止做,最大公约数就是s1+s2=4。 利用这种方法也可以计算两个数中有一个数为0的情况。 这里不举例,经过验证是正确的。 为了使处理器工作正常,在执行计算最大公约数程序之前,应该完成必要的前期处理。 具体包括,设置定时器的初始值和相关参数(TH,TL,TCON),设置中断程序的入口和计算最大公约数的入口等。 这样,完成了前期准备就可以计算最大公约数,并且在计算完最大公约数之后继续跳转会计算最大公约数的第一条语句,重复执行,而前期准备的指令不再执行。 这样,等待定时器计数达到要求,中断信号到来,进入中断程序。 中断程序里完成对最大公约数的数码管显示。 这里,显示用软件实现,即将显示的代码提前设计好,写入rom模块中。 将计算的结果和0~15之间的数字依次对比,如果相等,则给数码管赋予相应的值,使其显示。 对于两位数,依次显示数码管的十位和个位,并利用系统时钟的高频性实现数码管的显示。 执行完中断程序之后,继续跳转到之前进入中断时语句的下一条语句,继续计算最大公约数,等待下一次中断的来临。 这样,只要reset信号一直是高电平,就可以根据switch的变化实时地显示出对应的结果,实现自刷新的功能。 具体代码见附件(rom.v) 3、多周期MIPS处理器设计 流程框图(流程图较大,故分模块画) 1、系统综述 流水线分5个阶段完成IF,ID,EX,MEM,WB。 Branch与跳转在EX阶段判断并且执行,并且有必要时清空ID与IF 中断与异常在IF阶段判断 流程说明: 1.reset->0x80000000(控制信号使维持该地址,该地址中存储跳转到0的jalr指令) 2.reset=1之后在clk上升沿 (1)定时器操作,写入TH,TL,TCON (2)读取操作数并且计算最大公约数写入结果寄存器 (3)遇到中断操作: A.TCON&=0xfffffff9停止计数 B.利用七段数码管显示结果 C.TCON|=0x00000002重新开始计数 D.jalrXp 2、中间参数说明 1)ILLOP=0x80000004,为发生中断时,中断处理程序的PC地址,处于内核态。 2)XADR=0x80000008,为发生异常时,异常处理程序的PC地址,处于内核态。 3)Xp=26,为ILLOP与XADR中中断/异常处理程序调用,用来存储返回地址,即发生异常/中断的PC值。 4)Ra=31,为返回值存储器,应用于jr,jalr指令,跳转到寄存器中所存的PC地址。 5)Instruction截取部分: a)寄存器: Rs=Ins[25: 21];Rt=Ins[20: 16];Rd=Ins[15: 11]; b)Shamt=Ins[10: 6]应用于sll,srl,sra三条指令 c)Imm16=Ins[15: 0]应用于lw,sw,lui,addi,addiu,andi,slti,sltiu,beq,bne,blez,bgtz,bgez这些I型指令 d)JT,应用于j型指令j与jal,JT=Ins[25: 0]<<2,保存跳转地址,由于地址为32位,JT仅28位,由本题地址特殊性高位接4’b0000,表示在外部。 6)ConBA为条件分支跳转地址,ConBA=PC+4+Offset<<2。 3、控制信号说明(后缀表示该信号所处的阶段) 1)PCSrc,3位,6种有效取值。 PCSrc 000(缺省) 001 010 011 100 101 PC更新值 PCtemp_IF 分支见2 JT_EX Regjump ILLOP XADR 详细说明: PCSrc生成于冒险控制单元 000时为默认PC更新为PCtemp_IF,即处于IF阶段的PC+4,应用于不需要跳转的各条指令。 001时进入条件分支,满足条件PC=ConBA_EX(在EX阶段计算为 PCtemp_EX<<2+Offset,如果跳转则清除IF,ID),不满足时PC=PCtemp_IF(考虑EX判断branch,ID,IF已经进入下两条指令,所以不跳转是应该进入IF的下一条指令),应用于各种branch指令。 010时PC更新为无条件跳转地址,PC=JT_EX(于EX阶段判断,清除IF,ID阶段指令),应用于j,jal指令。 011时PC更新为寄存器跳转,PC=Regjump(寄存器跳转值,详见冒险控制单元介绍),应用于jr,jalr指令。 (于EX阶段判断) 100,101分别为中断与异常时的跳转地址。 2)ALUout_EX[0],1位信号(是否跳转判断) Zero 0(缺省) 1 条件分支PC更新 PCtemp_IF ConBA ALUout生成于EX阶段(不传递) 0时不满足分支条件(branch下ALU输出为0),1时满足分支条件。 3)RegDst信号,控制寄存器堆写入地址 RegDst 00 01 10 11 AddrC Rd Rt Ra Xp 详细说明: RegDst生成于控制信号产生模块,不传递 RegDst用来生成写入寄存器的地址AddrC,于ID阶段生成传递到WB阶段写入。 00时写入Rd,应用于所有R型指令,唯一例外jr指令,R型指令不需要写入,但是jr指令Rd段为5’b00000,即令写入为$0。 01时写入Rt,应用于部分需要写入的I型指令(配合RegWr=1)有lw,lui,addi,addiu,andi,slti,sltiu,以及部分不需要写入的I型指令(配合RegWr=0)有sw,beq,bne,blez,bgtz,bgez。 10时写入ra,应用于跳转链接指令jal 11时写入Xp,应用于异常/中断时,写入异常/中断处的最终执行完的下条指令 4)RegWr,1位信号,寄存器堆写入使能信号,1时可写,缺省0不写入 RegWr生成于IF的控制信号生成模块,传递到WB阶段 R型指令(jr时配合rd写入到$0不影响),需写入的I型指令lw,lui,addi,addiu,andi,slti,sltiu,需写入的j型指令jal(jalr使用R型指令方法写入)。 5)ALUSrc1,1位信号,ALU第一操作数选择控制信号。 (需在经过冒险控制多路选择器) ALUSrc1 0 1 ALU第一操作数 DataBusA shamt 详细说明: ALUSrc1生成与IF的控制信号生成模块传递至EX阶段 0时第一操作数来自寄存器应用于所有非偏移操作 1时第一操作数来自R型中shamt部分,应用于偏移操作sll,srl,sra 6)ALUSrc2,1位信号,ALU第二操作数选择控制信号。 (需在经过冒险控制多路选择器) ALUSrc2 0 1 ALU第二操作数 DataBusB Imm/Offset操作结果 详细说明: ALUSrc2生成与IF的控制信号生成模块传递至EX阶段 0时第二操作数来自寄存器,应用于所有R型指令与J型指令(无效操作) 1时第二操作数来自I型中Imm部分的某种计算结果,应用于I型指令,另有EXTop与LUop两个某种计算的控制信号配合操作。 7)EXTop,扩展方式选择信号 EXTop 0(缺省) 1 扩展方式 无符号扩展 有符号扩展 详细说明: EXTop生成于IF的控制信号生成模块传递至ID阶段 0时对Imm/Offset无符号扩展,应用于unsigned的I型指令,addiu,sltiu 1时对Imm/Offset有符号扩展,应用于非unsigned的I型指令 8)LUop,Imm计算方式选择控制信号 EXTop 0(缺省) 1 输出结果 用之前扩展结果 取立即数高位 详细说明: LUop生成于IF的控制信号生成模块传递至ID阶段 0时将Imm扩展结果作为ALUSrc2选择输入中的一路。 1时取立即数高16位与16位0拼接作为ALUSrc2选择输入中的一路,应用于lui指令。 9)ALUFun,6位控制信号,控制ALU计算功能 类型 功能 ALUFun 描述 算式 ADD 000000 S=A+B SUB 000001 S=A-B 位运算 AND 011000 S=A&B OR 011110 S=A|B XOR 010110 S=A^B NOR 010001 S=~(A^B) “A” 011010 S=A 移位运算 SLL 100000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 32位MIPS CPU 设计 实验报告详解 32 MIPS 实验 报告 详解