MIPS单周期CPU实验报告.docx
《MIPS单周期CPU实验报告.docx》由会员分享,可在线阅读,更多相关《MIPS单周期CPU实验报告.docx(37页珍藏版)》请在冰豆网上搜索。
MIPS单周期CPU实验报告
《计算机组成原理实验》
实验报告
(实验二)
学院名称
:
专业(班级)
学生
学号
时间
2017
年
11
月
25
日
成绩
:
实验二
单周期CPU设计与实现
一.实验目的
(1)掌握单周期CPU数据通路图的构成、原理及其设计方法;
(2)掌握单周期CPU的实现方法,代码实现方法;
(3)认识和掌握指令与CPU的关系;
(4)掌握测试单周期CPU的方法;
(5)掌握单周期CPU的实现方法。
二.实验容
设计一个单周期的MIPSCPU,使其能实现下列指令:
==>算术运算指令
(1)addrd,rs,rt(说明:
以助记符表示,是汇编指令;以代码表示,是机器指令)
000000
rs(5位)
rt(5位)
rd(5位)
reserved
功能:
rd←rs+rt。
reserved为预留部分,即未用,一般填“0”。
(2)addirt,rs,immediate
000001
immediate(16位)
rt←rs+(sign-extend)immediate;immediate符号扩展再参加“加”运算。
(3)subrd,rs,rt
000010
rd←rs-rt
==>逻辑运算指令
(4)orirt,rs,immediate
010000
rt←rs|(zero-extend)immediate;immediate做“0”扩展再参加“或”运算。
(5)andrd,rs,rt
010001
rd←rs&rt;逻辑与运算。
(6)orrd,rs,rt
010010
rd←rs|rt;逻辑或运算。
==>移位指令
(7)sllrd,rt,sa
011000
未用
sa
rd<-rt<<(zero-extend)sa,左移sa位,(zero-extend)sa
==>比较指令
(8)sltrd,rs,rt带符号数
011100
if(rs==>存储器读/写指令(9)swrt,immediate(rs)写存储器100110rs(5位)rt(5位)immediate(16位)功能:memory[rs+(sign-extend)immediate]←rt;immediate符号扩展再相加。即将rt寄存器的容保存到rs寄存器容和立即数符号扩展后的数相加作为地址的存单元中。(10)lwrt,immediate(rs)读存储器100111rs(5位)rt(5位)immediate(16位)功能:rt←memory[rs+(sign-extend)immediate];immediate符号扩展再相加。即读取rs寄存器容和立即数符号扩展后的数相加作为地址的存单元中的数,然后保存到rt寄存器中。==>分支指令(11)beqrs,rt,immediate110000rs(5位)rt(5位)immediate(16位)功能:if(rs=rt)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4特别说明:immediate是从PC+4地址开始和转移到的指令之间指令条数。immediate符号扩展之后左移2位再相加。为什么要左移2位?由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。12)bners,rt,immediate110001rs(5位)rt(5位)immediate功能:if(rs!=rt)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4特别说明:与beq不同点是,不等时转移,相等时顺序执行。(13)bgtzrs,immediate110010rs(5位)00000immediate功能:if(rs>0)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4==>跳转指令(14)jaddr111000addr[27..2]==>停机指令(15)halt11111100000000000000000000000000(26位)功能:停机;不改变PC的值,PC保持不变。 三.实验原理1.时间周期:单周期CPU指的是一条指令的执行在一个时钟周期完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。时钟周期一般也称振荡周期(如果晶振的输出没有经过分频就直接作为CPU的工作时钟,则时钟周期就等于振荡周期。若振荡周期经二分频后形成时钟脉冲信号作为CPU的工作时钟,这样,时钟周期就是振荡周期的两倍。)CPU在处理指令时,一般需要经过以下几个步骤:(1)取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。(2)指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。(3)指令执行(EXE):根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。(4)存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。(5)结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。单周期CPU,是在一个时钟周期完成这五个阶段的处理。对于不同的指令,需要执行的步骤是不同的,其中取字指令(lw)需要执行全部五个步骤。因此,CPU的时间周期由取字指令决定。2.指令类型:MIPS的三种指令类型:其中,op:为操作码;rs:只读。为第1个源操作数寄存器,寄存器地址(编号)是00000~11111,00~1F;rt:可读可写。为第2个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上);rd:只写。为目的操作数寄存器,寄存器地址(同上);sa:为位移量(shiftamt),移位指令用于指定移多少位;funct:为功能码,在寄存器类型指令中(R类型)用来指定指令的功能与操作码配合使用;immediate:为16位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据加载(Load)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数器(PC)的有符号偏移量;address:为地址。在本CPU设计中,由于指令的类型较少,所以所有指令均由操作码(op)确定。在R型指令中,功能码(funct)为000000。3.控制线路图与数据通路:上图为CPU的数据通路和必要的控制线路图,其中Ins.Mem为指令存储器,Data.Mem为数据存储器。访问存储器时,先给出存地址,然后由读或写信号控制操作。对于寄存器组,先给出寄存器地址,读操作时,输出端就直接输出相应数据;而在写操作时,在WE使能信号为1,在时钟边沿触发将数据写入寄存器。4.控制信号:控制信号的作用控制信号名状态“0”状态“1”Reset初始化PC为0PC接收新地址PCWrePC不更改,相关指令:haltPC更改,相关指令:除指令halt外ALUSrcA来自寄存器堆data1输出,相关指令:add、sub、addi、or、and、ori、beq、bne、bgtz、slt、sw、lw来自移位数sa,同时,进行(zero-extend)sa,即{{27{0}},sa},相关指令:sllALUSrcB来自寄存器堆data2输出,相关指令:add、sub、or、and、sll、slt、beq、bne、bgtz来自sign或zero扩展的立即数,相关指令:addi、ori、sw、lwDBDataSrc来自ALU运算结果的输出,相关指令:add、addi、sub、ori、or、and、slt、sll来自数据存储器(DataMEM)的输出,相关指令:lwRegWre无写寄存器组寄存器,相关指令:beq、bne、bgtz、sw、halt、j寄存器组写使能,相关指令:add、addi、sub、ori、or、and、slt、sll、lwInsMemRW写指令存储器读指令存储器(Ins.Data)/RD读数据存储器,相关指令:lw输出高阻态/WR写数据存储器,相关指令:sw无操作RegDst写寄存器组寄存器的地址,来自rt字段,相关指令:addi、ori、lw写寄存器组寄存器的地址,来自rd字段,相关指令:add、sub、and、or、slt、sllExtSel(zero-extend)immediate(0扩展),相关指令:ori(sign-extend)immediate(符号扩展),相关指令:addi、sw、lw、bne、bne、bgtzPCSrc[1..0]00:pc<-pc+4,相关指令:add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1);01:pc<-pc+4+(sign-extend)immediate,相关指令:beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0);10:pc<-{(pc+4)[31..28],addr[27..2],0,0},相关指令:j;11:未用ALUOp[2..0]ALU8种运算功能选择(000-111),看功能表ALU功能表ALUOp[2..0]功能描述000Y=A+B加001Y=A–B减010Y=B<B左移A位011Y=A∨B或100Y=A∧B与101Y=(A1:0比较A与B不带符号110if(AY=1;elseif(A[31]&&!B[31)Y=1;elseY=0;比较A与B带符号111Y=AB异或附:本CPU的指令集并未用到ALU的全部功能。5.主要模块接口说明:InstructionMemory:指令存储器,address,指令存储器地址输入端口DataIn,指令存储器数据输入端口(指令代码输入端口)DataOut,指令存储器数据输出端口(指令代码输出端口)InsMemRW,指令存储器读写控制信号,为0写,为1读DataMemory:数据存储器,address,数据存储器地址输入端口DataOut,数据存储器数据输出端口/RD,数据存储器读控制信号,为0读/WR,数据存储器写控制信号,为0写RegisterFile:寄存器组ReadReg1,rs寄存器地址输入端口ReadReg2,rt寄存器地址输入端口WriteReg,将数据写入的寄存器端口,其地址来源rt或rd字段WriteData,写入寄存器的数据输入端口ReadData1,rs寄存器数据输出端口ReadData2,rt寄存器数据输出端口WE,写使能信号,为1时,在时钟边沿触发写入RST,寄存器清零信号,为0时寄存器清零ALU:算术逻辑单元result,ALU运算结果zero,运算结果标志,结果为0,则zero=1;否则zero=0sign,运算结果标志,结果最高位为0,则sign=0,正数;否则,sign=1,负数四.实验器材电脑一台,XilinxVivado软件一套,Basys3板一块。五.实验过程与结果1.各个指令对应的控制信号指令PCWreALUSrcAALUSrcBDBDataSrcRegWreInsMemRWRDWRRegDstExtSelAdd100011111XAddi1010111101Sub100011111XOri1010111100And100011111XOr100011111XSll110011111XSlt100011111XSw101X0110X1Lw1011110101Beq100X0111X1Bne100X0111X1Bgtz100X0111X1J1XXX0111XXHalt0XXX0111XX控制信号ALUOpAdd000Addi000Sub001Ori011And100Or011Sll010Slt110Sw000Lw000Beq001Bne001Bgtz101J010HaltXXX除异或运算(111)外,ALU所有功能均被使用。PCSrc指令00add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1)01beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0)10j2.主要模块代码及仿真(1)控制单元(controlunit)Verilog代码:1.module controlUnit( 2. input [5:0] opcode, 3. input zero, 4. input sign, 5. output reg PCWre, 6. output reg ALUSrcA, 7. output reg ALUSrcB, 8. output reg DBDataSrc, 9. output reg RegWre, 10. output reg InsMemRW, 11. output reg RD, 12. output reg WR, 13. output reg RegDst, 14. output reg ExtSel, 15. output reg [1:0] PCSrc, 16. output reg [2:0] ALUOp 17.); 18. initial begin 19. RD = 1; 20. WR = 1; 21. RegWre = 0; 22. InsMemRW = 0; 23. end 24. always (opcode) begin 25. case(opcode) 26. 6'b000000:begin // add 27. PCWre = 1; 28. ALUSrcA = 0; 29. ALUSrcB = 0; 30. DBDataSrc = 0; 31. RegWre = 1; 32. InsMemRW = 1; 33. RD = 1; 34. WR = 1; 35. RegDst = 1; 36. ALUOp = 3'b000; 37. end 38. 6'b000001:begin //addi 39. PCWre = 1; 40. ALUSrcA = 0; 41. ALUSrcB = 1; 42. DBDataSrc = 0; 43. RegWre = 1; 44. InsMemRW = 1; 45. RD = 1; 46. WR = 1; 47. RegDst = 0; 48. ExtSel = 1; 49. ALUOp = 3'b000; 50. end 51. 6'b000010:begin //sub 52. PCWre = 1; 53. ALUSrcA = 0; 54. ALUSrcB = 0; 55. DBDataSrc = 0; 56. RegWre = 1; 57. InsMemRW = 1; 58. RD = 1; 59. WR = 1; 60. RegDst = 1; 61. ALUOp = 3'b001; 62. end 63. 6'b010000:begin // ori 64. PCWre = 1; 65. ALUSrcA = 0; 66. ALUSrcB = 1; 67. DBDataSrc = 0; 68. RegWre = 1; 69. InsMemRW = 1; 70. RD = 1; 71. WR = 1; 72. RegDst = 0; 73. ExtSel = 0; 74. ALUOp = 3'b011; 75. end 76. 6'b010001:begin //and 77. PCWre = 1; 78. ALUSrcA = 0; 79. ALUSrcB = 0; 80. DBDataSrc = 0; 81. RegWre = 1; 82. InsMemRW = 1; 83. RD = 1; 84. WR = 1; 85. RegDst = 1; 86. ALUOp = 3'b100; 87. end 88. 6'b010010:begin // or 89. PCWre = 1; 90. ALUSrcA = 0; 91. ALUSrcB = 0; 92. DBDataSrc = 0; 93. RegWre
==>存储器读/写指令
(9)swrt,immediate(rs)写存储器
100110
memory[rs+(sign-extend)immediate]←rt;immediate符号扩展再相加。
即将rt寄存器的容保存到rs寄存器容和立即数符号扩展后的数相加作为地址的存单元中。
(10)lwrt,immediate(rs)读存储器
100111
rt←memory[rs+(sign-extend)immediate];immediate符号扩展再相加。
即读取rs寄存器容和立即数符号扩展后的数相加作为地址的存单元中的数,然后保存到rt寄存器中。
==>分支指令
(11)beqrs,rt,immediate
110000
if(rs=rt)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4
特别说明:
immediate是从PC+4地址开始和转移到的指令之间指令条数。
immediate符号扩展之后左移2位再相加。
为什么要左移2位?
由于跳转到的指令地址肯定是4的倍数(每条指令占4个字节),最低两位是“00”,因此将immediate放进指令码中的时候,是右移了2位的,也就是以上说的“指令之间指令条数”。
12)bners,rt,immediate
110001
immediate
if(rs!
=rt)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4
与beq不同点是,不等时转移,相等时顺序执行。
(13)bgtzrs,immediate
110010
00000
if(rs>0)pc←pc+4+(sign-extend)immediate<<2elsepc←pc+4
==>跳转指令
(14)jaddr
111000
addr[27..2]
==>停机指令
(15)halt
111111
00000000000000000000000000(26位)
停机;不改变PC的值,PC保持不变。
三.实验原理
1.时间周期:
单周期CPU指的是一条指令的执行在一个时钟周期完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。
电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。
时钟周期一般也称振荡周期(如果晶振的输出没有经过分频就直接作为CPU的工作时钟,则时钟周期就等于振荡周期。
若振荡周期经二分频后形成时钟脉冲信号作为CPU的工作时钟,这样,时钟周期就是振荡周期的两倍。
)
CPU在处理指令时,一般需要经过以下几个步骤:
(1)取指令(IF):
根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。
(2)指令译码(ID):
对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。
(3)指令执行(EXE):
根据指令译码得到的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。
(4)存储器访问(MEM):
所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。
(5)结果写回(WB):
指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。
单周期CPU,是在一个时钟周期完成这五个阶段的处理。
对于不同的指令,需要执行的步骤是不同的,其中取字指令(lw)需要执行全部五个步骤。
因此,CPU的时间周期由取字指令决定。
2.指令类型:
MIPS的三种指令类型:
其中,
op:
为操作码;
rs:
只读。
为第1个源操作数寄存器,寄存器地址(编号)是00000~11111,00~1F;
rt:
可读可写。
为第2个源操作数寄存器,或目的操作数寄存器,寄存器地址(同上);
rd:
只写。
为目的操作数寄存器,寄存器地址(同上);
sa:
为位移量(shiftamt),移位指令用于指定移多少位;
funct:
为功能码,在寄存器类型指令中(R类型)用来指定指令的功能与操作码配合使用;
immediate:
为16位立即数,用作无符号的逻辑操作数、有符号的算术操作数、数据加载(Load)/数据保存(Store)指令的数据地址字节偏移量和分支指令中相对程序计数器(PC)的有符号偏移量;
address:
为地址。
在本CPU设计中,由于指令的类型较少,所以所有指令均由操作码(op)确定。
在R型指令中,功能码(funct)为000000。
3.控制线路图与数据通路:
上图为CPU的数据通路和必要的控制线路图,其中Ins.Mem为指令存储器,Data.Mem为数据存储器。
访问存储器时,先给出存地址,然后由读或写信号控制操作。
对于寄存器组,先给出寄存器地址,读操作时,输出端就直接输出相应数据;而在写操作时,在WE使能信号为1,在时钟边沿触发将数据写入寄存器。
4.控制信号:
控制信号的作用
控制信号名
状态“0”
状态“1”
Reset
初始化PC为0
PC接收新地址
PCWre
PC不更改,相关指令:
halt
PC更改,相关指令:
除指令halt外
ALUSrcA
来自寄存器堆data1输出,相关指令:
add、sub、addi、or、and、ori、beq、bne、bgtz、slt、sw、lw
来自移位数sa,同时,进行(zero-extend)sa,即{{27{0}},sa},相关指令:
sll
ALUSrcB
来自寄存器堆data2输出,相关指令:
add、sub、or、and、sll、slt、beq、bne、bgtz
来自sign或zero扩展的立即数,相关指令:
addi、ori、sw、lw
DBDataSrc
来自ALU运算结果的输出,相关指令:
add、addi、sub、ori、or、and、slt、sll
来自数据存储器(DataMEM)的输出,相关指令:
lw
RegWre
无写寄存器组寄存器,相关指令:
beq、bne、bgtz、sw、halt、j
寄存器组写使能,相关指令:
add、addi、sub、ori、or、and、slt、sll、lw
InsMemRW
写指令存储器
读指令存储器(Ins.Data)
/RD
读数据存储器,相关指令:
输出高阻态
/WR
写数据存储器,相关指令:
sw
无操作
RegDst
写寄存器组寄存器的地址,来自rt字段,相关指令:
addi、ori、lw
写寄存器组寄存器的地址,来自rd字段,相关指令:
add、sub、and、or、slt、sll
ExtSel
(zero-extend)immediate(0扩展),相关指令:
ori
(sign-extend)immediate(符号扩展)
,相关指令:
addi、sw、lw、bne、bne、bgtz
PCSrc[1..0]
00:
pc<-pc+4,相关指令:
add、addi、sub、or、ori、and、slt、
sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1);
01:
pc<-pc+4+(sign-extend)immediate,相关指令:
beq(zero=1)、
bne(zero=0)、bgtz(sign=0,zero=0);
10:
pc<-{(pc+4)[31..28],addr[27..2],0,0},相关指令:
j;
11:
ALUOp[2..0]
ALU8种运算功能选择(000-111),看功能表
ALU功能表
功能
描述
000
Y=A+B
加
001
Y=A–B
减
010
Y=B<B左移A位011Y=A∨B或100Y=A∧B与101Y=(A1:0比较A与B不带符号110if(AY=1;elseif(A[31]&&!B[31)Y=1;elseY=0;比较A与B带符号111Y=AB异或附:本CPU的指令集并未用到ALU的全部功能。5.主要模块接口说明:InstructionMemory:指令存储器,address,指令存储器地址输入端口DataIn,指令存储器数据输入端口(指令代码输入端口)DataOut,指令存储器数据输出端口(指令代码输出端口)InsMemRW,指令存储器读写控制信号,为0写,为1读DataMemory:数据存储器,address,数据存储器地址输入端口DataOut,数据存储器数据输出端口/RD,数据存储器读控制信号,为0读/WR,数据存储器写控制信号,为0写RegisterFile:寄存器组ReadReg1,rs寄存器地址输入端口ReadReg2,rt寄存器地址输入端口WriteReg,将数据写入的寄存器端口,其地址来源rt或rd字段WriteData,写入寄存器的数据输入端口ReadData1,rs寄存器数据输出端口ReadData2,rt寄存器数据输出端口WE,写使能信号,为1时,在时钟边沿触发写入RST,寄存器清零信号,为0时寄存器清零ALU:算术逻辑单元result,ALU运算结果zero,运算结果标志,结果为0,则zero=1;否则zero=0sign,运算结果标志,结果最高位为0,则sign=0,正数;否则,sign=1,负数四.实验器材电脑一台,XilinxVivado软件一套,Basys3板一块。五.实验过程与结果1.各个指令对应的控制信号指令PCWreALUSrcAALUSrcBDBDataSrcRegWreInsMemRWRDWRRegDstExtSelAdd100011111XAddi1010111101Sub100011111XOri1010111100And100011111XOr100011111XSll110011111XSlt100011111XSw101X0110X1Lw1011110101Beq100X0111X1Bne100X0111X1Bgtz100X0111X1J1XXX0111XXHalt0XXX0111XX控制信号ALUOpAdd000Addi000Sub001Ori011And100Or011Sll010Slt110Sw000Lw000Beq001Bne001Bgtz101J010HaltXXX除异或运算(111)外,ALU所有功能均被使用。PCSrc指令00add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1)01beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0)10j2.主要模块代码及仿真(1)控制单元(controlunit)Verilog代码:1.module controlUnit( 2. input [5:0] opcode, 3. input zero, 4. input sign, 5. output reg PCWre, 6. output reg ALUSrcA, 7. output reg ALUSrcB, 8. output reg DBDataSrc, 9. output reg RegWre, 10. output reg InsMemRW, 11. output reg RD, 12. output reg WR, 13. output reg RegDst, 14. output reg ExtSel, 15. output reg [1:0] PCSrc, 16. output reg [2:0] ALUOp 17.); 18. initial begin 19. RD = 1; 20. WR = 1; 21. RegWre = 0; 22. InsMemRW = 0; 23. end 24. always (opcode) begin 25. case(opcode) 26. 6'b000000:begin // add 27. PCWre = 1; 28. ALUSrcA = 0; 29. ALUSrcB = 0; 30. DBDataSrc = 0; 31. RegWre = 1; 32. InsMemRW = 1; 33. RD = 1; 34. WR = 1; 35. RegDst = 1; 36. ALUOp = 3'b000; 37. end 38. 6'b000001:begin //addi 39. PCWre = 1; 40. ALUSrcA = 0; 41. ALUSrcB = 1; 42. DBDataSrc = 0; 43. RegWre = 1; 44. InsMemRW = 1; 45. RD = 1; 46. WR = 1; 47. RegDst = 0; 48. ExtSel = 1; 49. ALUOp = 3'b000; 50. end 51. 6'b000010:begin //sub 52. PCWre = 1; 53. ALUSrcA = 0; 54. ALUSrcB = 0; 55. DBDataSrc = 0; 56. RegWre = 1; 57. InsMemRW = 1; 58. RD = 1; 59. WR = 1; 60. RegDst = 1; 61. ALUOp = 3'b001; 62. end 63. 6'b010000:begin // ori 64. PCWre = 1; 65. ALUSrcA = 0; 66. ALUSrcB = 1; 67. DBDataSrc = 0; 68. RegWre = 1; 69. InsMemRW = 1; 70. RD = 1; 71. WR = 1; 72. RegDst = 0; 73. ExtSel = 0; 74. ALUOp = 3'b011; 75. end 76. 6'b010001:begin //and 77. PCWre = 1; 78. ALUSrcA = 0; 79. ALUSrcB = 0; 80. DBDataSrc = 0; 81. RegWre = 1; 82. InsMemRW = 1; 83. RD = 1; 84. WR = 1; 85. RegDst = 1; 86. ALUOp = 3'b100; 87. end 88. 6'b010010:begin // or 89. PCWre = 1; 90. ALUSrcA = 0; 91. ALUSrcB = 0; 92. DBDataSrc = 0; 93. RegWre
B左移A位
011
Y=A∨B
或
100
Y=A∧B
与
101
Y=(A
1:
0
比较A与B
不带符号
110
if(A
Y=1;
elseif(A[31]&&!
B[31)Y=1;
elseY=0;
带符号
111
Y=AB
异或
附:
本CPU的指令集并未用到ALU的全部功能。
5.主要模块接口说明:
InstructionMemory:
指令存储器,
address,指令存储器地址输入端口
DataIn,指令存储器数据输入端口(指令代码输入端口)
DataOut,指令存储器数据输出端口(指令代码输出端口)
InsMemRW,指令存储器读写控制信号,为0写,为1读
DataMemory:
数据存储器,
address,数据存储器地址输入端口
DataOut,数据存储器数据输出端口
/RD,数据存储器读控制信号,为0读
/WR,数据存储器写控制信号,为0写
RegisterFile:
寄存器组
ReadReg1,rs寄存器地址输入端口
ReadReg2,rt寄存器地址输入端口
WriteReg,将数据写入的寄存器端口,其地址来源rt或rd字段
WriteData,写入寄存器的数据输入端口
ReadData1,rs寄存器数据输出端口
ReadData2,rt寄存器数据输出端口
WE,写使能信号,为1时,在时钟边沿触发写入
RST,寄存器清零信号,为0时寄存器清零
ALU:
算术逻辑单元
result,ALU运算结果
zero,运算结果标志,结果为0,则zero=1;否则zero=0
sign,运算结果标志,结果最高位为0,则sign=0,正数;否则,sign=1,负数
四.实验器材
电脑一台,XilinxVivado软件一套,Basys3板一块。
五.实验过程与结果
1.各个指令对应的控制信号
指令
RD
WR
Add
1
X
Addi
Sub
Ori
And
Or
Sll
Slt
Sw
Lw
Beq
Bne
Bgtz
J
Halt
控制信号
ALUOp
XXX
除异或运算(111)外,ALU所有功能均被使用。
PCSrc
00
add、addi、sub、or、ori、and、slt、sll、sw、lw、beq(zero=0)、bne(zero=1)、bgtz(sign=1,或zero=1)
01
beq(zero=1)、bne(zero=0)、bgtz(sign=0,zero=0)
10
j
2.主要模块代码及仿真
(1)控制单元(controlunit)
Verilog代码:
1.module controlUnit(
2. input [5:
0] opcode,
3. input zero,
4. input sign,
5. output reg PCWre,
6. output reg ALUSrcA,
7. output reg ALUSrcB,
8. output reg DBDataSrc,
9. output reg RegWre,
10. output reg InsMemRW,
11. output reg RD,
12. output reg WR,
13. output reg RegDst,
14. output reg ExtSel,
15. output reg [1:
0] PCSrc,
16. output reg [2:
0] ALUOp
17.);
18. initial begin
19. RD = 1;
20. WR = 1;
21. RegWre = 0;
22. InsMemRW = 0;
23. end
24. always (opcode) begin
25. case(opcode)
26. 6'b000000:
begin // add
27. PCWre = 1;
28. ALUSrcA = 0;
29. ALUSrcB = 0;
30. DBDataSrc = 0;
31. RegWre = 1;
32. InsMemRW = 1;
33. RD = 1;
34. WR = 1;
35. RegDst = 1;
36. ALUOp = 3'b000;
37. end
38. 6'b000001:
begin //addi
39. PCWre = 1;
40. ALUSrcA = 0;
41. ALUSrcB = 1;
42. DBDataSrc = 0;
43. RegWre = 1;
44. InsMemRW = 1;
45. RD = 1;
46. WR = 1;
47. RegDst = 0;
48. ExtSel = 1;
49. ALUOp = 3'b000;
50. end
51. 6'b000010:
begin //sub
52. PCWre = 1;
53. ALUSrcA = 0;
54. ALUSrcB = 0;
55. DBDataSrc = 0;
56. RegWre = 1;
57. InsMemRW = 1;
58. RD = 1;
59. WR = 1;
60. RegDst = 1;
61. ALUOp = 3'b001;
62. end
63. 6'b010000:
begin // ori
64. PCWre = 1;
65. ALUSrcA = 0;
66. ALUSrcB = 1;
67. DBDataSrc = 0;
68. RegWre = 1;
69. InsMemRW = 1;
70. RD = 1;
71. WR = 1;
72. RegDst = 0;
73. ExtSel = 0;
74. ALUOp = 3'b011;
75. end
76. 6'b010001:
begin //and
77. PCWre = 1;
78. ALUSrcA = 0;
79. ALUSrcB = 0;
80. DBDataSrc = 0;
81. RegWre = 1;
82. InsMemRW = 1;
83. RD = 1;
84. WR = 1;
85. RegDst = 1;
86. ALUOp = 3'b100;
87. end
88. 6'b010010:
begin // or
89. PCWre = 1;
90. ALUSrcA = 0;
91. ALUSrcB = 0;
92. DBDataSrc = 0;
93. RegWre
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1