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
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
ALUFun生成于IF的控制信号生成模块传递至EX阶段
10)Sign,ALU运算是否有符号运算控制说明
Sign
0(缺省)
1
计算方式
无符号计算
有符号计算
详细说明:
Sign生成于IF的控制信号生成模块传递至EX阶段
0时ALU进行无符号计算,应用于unsigned计算addu,subu,addiu,sltiu
1时ALU进行有符号计算,应用于正常有符号运算除了上述4种指令之外的计算指令。
11)MemRd,读取内存控制信号
MemRd
0(缺省)
1
结果
不读取,ReadData输出全0
读取内存,ReadData输出为该地址内容
MemRd生成于IF的控制信号生成模块传递至MEM阶段
1时应用于需要读取内存的指令lw
12)MemWr,写入内存控制信号
MemWr
0(缺省)
1
结果
不写入
写入内存,将输入内容写入输入地址
MemWr生成于IF的控制信号生成模块传递至MEM阶段
1时应用于需要写入内存的指令sw
13)MemToReg,2位控制信号,3个有效输入
MemToReg
00
01
10
输出
ALUOut
ReadData
PCtemp_所处阶段
详细说明:
MemToReg生成于IF的控制信号生成模块传递至WB阶段
00时为应用于R型指令以及不需要读取内存且需要写入内存的I型指令
01时应用于将内存中读取内容写入寄存器的指令lw
10时应用于需要将PC值写入到寄存器的指令jal,jalr,以及中断或异常时将PC写入Xp的操作。
4、冒险控制单元说明
Ø转发
主要判断MEM与WB阶段写入地址AddrC_MEM与AddrC_WB与EX阶段使用寄存器地址是否相同(且是否使用),决定是否转发。
(1)ALU第一操作数的转发,控制信号ForwardA