1、北京工业大学 MIPC-CPU 设计课程第 1 页MIPS-CPU 设计实验报告实验名称:32 位单周期 MIPS-CPU 设计北京工业大学 MIPC-CPU 设计课程第 2 页姓名学号:刘 高 斯 11072205实验日期:2014 年 12 月 19 日目录前言 MIPS 简介 - 3实验目的 - 3第一部分 VERILOG HDL 语言实现部分实验内容 - 4试验环境 - 4模块简介 - 4实验截图 - 5实验感想 - 5北京工业大学 MIPC-CPU 设计课程第 3 页实验代码 - 6第二部分 LOGISIM 语言实现部分实验内容 - 16实验环境 - 16模块设计 - 16试验感想
2、- 23北京工业大学 MIPC-CPU 设计课程第 4 页前言一、MIPS 简介MIPS 是世界上很流行的一种 RISC 处理器。MIPS 的意思“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学 Hennessy教授领导的研究小组研制出来的。MIPS 公司的 R 系列就是在此基础上开发的 RISC 工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。MIPS技术公司是美国著名的芯片
3、设计公司,它采用精简指令系统计算结构(RISC)来设计芯片。和英特尔采用的复杂指令系统计算结构(CISC)相比,RISC 具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS 是出现最早的商业RISC 架构芯片之一,新的架构集成了所有原来 MIPS 指令集,并增加了许多更强大的功能。MIPS 处理器是八十年代中期 RISC CPU 设计的一大热点。MIPS 是卖的最好的 RISC CPU,可以从任何地方,如 Sony, Nintendo 的游戏机,Cisco 的路由器和 SGI 超级计算机,看见 MIPS 产品在销售。目前随着 RISC 体系结构遭到
4、x86芯片的竞争,MIPS 有可能是起初RISC CPU 设计中唯一的一个在本世纪盈利的。和英特尔相比,MIPS 的授权费用比较低,也就为除英特尔外的大多数芯片厂商所采用。MIPS 的系统结构及设计理念比较先进,其指令系统经过通用处理器指令体系 MIPS I、MIPS II、MIPS III、MIPS IV 到 MIPS V,嵌入式指令体系 MIPS16、MIPS32到 MIPS64的发展已经十分成熟。在设计理念上 MIPS 强调软硬件协同提高性能,同时简化硬件设计。2、实验目的我们通过 VERILOG HDL 语言和 LOGISIM 语言分别用语句和图形完成对32位 MIPS-CPU的设计,
5、通过前8周的学习我们基本掌握了 MIPS 的概念和原理,认识到 RISC 架构的特征和优缺点。通过过老师的讲解,了解到每一条语句的从设计到硬件实现的全过程。通过本次实验我们要更加深入的理解硬件组成的结构,语句逻辑实现的原理。掌握硬件编程语言和硬件图形语言编程的方法。透彻的理解 MIPS 的特征和优点。北京工业大学 MIPC-CPU 设计课程第 5 页VERILOG HDL 语言实现部分实验内容利用 VERILOG 设计一种 32 位单周期 MIPS CPU。首先设计各个子模块,并将已做好的各个模块进行模块合并,实现单周期 CPU 的各项指令。实验环境Window Xp Quartus II各个
6、子模块的简单介绍此程序将数据通路(SingleDataLoad)设定为顶层模块,下面的模块包括:算术逻辑运算单元(ALU) 、数据存储器( DataStore) 、数据寄存器( Registers) 、取指令部件(GetCode) 、总控制器( Control) ,通过顶层模块对各个子模块的调用从而实现了整个单周期 CPU。1) 数据通路(SingleDataLoad):进行数据的运算、读取以及存储功能,通过总控制器产生的各个控制信号,进而实现对数据的各项操作。2) 算术逻辑运算单元(ALU):数据通路调用此模块,根据得到的控制信号对输入数据进行处理,处理功能有:addu、add、or、sub
7、u、sub 、sltu 、slt 等。3) 数据存储器(DataStore):当 WrEn 控制信号为 1 时,此时就将输入数据存储到此存储器中,当 WrEn 为 0 时,则根据输入的地址,找到地址对应的单元将单元北京工业大学 MIPC-CPU 设计课程第 6 页中的数据输出。4) 数据寄存器(Registers): 在此程序中功能和实现基本和数据存储器相同,但在实际 CPU 当中使用的逻辑器件及获取数据的方式还是有所区别的。5) 取指令部件(GetCode ): 指根据 PC 所提供的地址从指令寄存器中取出要执行的指令,再根据各控制信号,得出下一次要执行的指令的地址。 (总控制器(Contr
8、ol):总控制器通过从取指令部件获得的指令,进而产生各个控制信号,并将控制信号返回个数据通路,就此实现各项功能。北京工业大学 MIPC-CPU 设计课程第 7 页程序截图及说明上图为执行下列指令产生的图像:Mem0=6b000100,5b00001,5b00010,5b00000,5b00000,6b000001; /beq $1,$2,1Mem4=6b000000,5b00001,5b00010,5b00100,5b00000,6b101011; /sltu $4,$1,$2Mem8=6b000010,5b00000,5b00000,5b00000,5b00000,6b000010; /j
9、2当$1 、$2 所指的寄存器的值相同时,执行上述指令,得到的图如下:可以看出 CPU 跳过了第二条指令,直接执行了第三条,而上图执行了第一条指令后接着执行第二条,最后才执行第三条指令,区别就在于第一幅图表示的是$1、$2 中的值不相等所执行的情况,第二幅图表示的是$1、$2 中的值相等的情况,由此可以得北京工业大学 MIPC-CPU 设计课程第 8 页知测试正确。实验收获及感想VERILOG 语句将二进制元器件的原理整合到类汇编语言上,通过这次实验我从理解上从这语言本身理解到逻辑与函数不分家的道理,每一条连线和与、非、或都是一个个对应的函数。任一个复杂的 CPU 都是从一条条简单的逻辑一条一
10、条实现的。任何一条语句都是通过不同的函数和赋值分分合合直到被执行完毕。实验代码:数据通路(SingleDataLoad)module SingleDataLoad(clk,RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr,ALUctr);input clk;/input31:0 Instruction;output RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr;output2:0 ALUctr;wire RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,
11、MemtoReg,MemWr;wire2:0 ALUctr;wire 31:0 Instruction;wire 4:0 Rd,Rt,Rs;wire 5:0 op,func;wire4:0 Rx;wire P1,P2,Zero,Overflow;北京工业大学 MIPC-CPU 设计课程第 9 页wire 31:0 busW,busA,busB,out1,dataout,busB1,busBo;wire 15:0 imm16;Control con(Instruction,RegWr,ExtOp,ALUSrc,ALUctr,Branch,Jump,RegDst,MemtoReg,MemWr);a
12、ssign op=Instruction31:26;assign func=Instruction5:0;assign Rs=Instruction25:21;assign Rt=Instruction20:16;assign Rd=Instruction15:11;assign imm16=Instruction15:0;assign P1=P2MUX2 mux2(RegDst,Rt,Rd,Rx);assign busB1=16imm1615 MUX2TO1 mux1(ALUSrc,busB,busB1,busBo);Registers Reg(clk,busW,P1,Rx,Rs,Rt,bu
13、sA,busB);ALU alu(busA,busBo,ALUctr,out1,Overflow,Zero);assign P2=!Overflow;DataStore datas(clk,busB,out14:0,MemWr,dataout);MUX2TO1 mux3(MemtoReg,out1,dataout,busW);GetCode get(Branch,Zero,Jump,clk,Instruction);endmodule module MUX2TO1(op,X,Y,Z);input op;input 31:0 X,Y;output31:0 Z;北京工业大学 MIPC-CPU 设计
14、课程第 10 页reg 31:0 Z;always(op)beginif(op=1)Z=Y;elseZ=X;endendmodulemodule MUX2(op,x,y,z);input op;input 4:0 x,y;output4:0 z;reg 4:0 z;always(op)beginif(op=1)z=y;elsez=x;endendmodule算数逻辑运算单元(ALU)module ALU(A,B,ALUctr,Result,Overflow,Zero);北京工业大学 MIPC-CPU 设计课程第 11 页parameter n=32; input n-1:0 A,B;input
15、 2:0 ALUctr;output n-1:0 Result;output Overflow,Zero;wire Zero,Overflow;wire n-1:0 Result;wire SUBctr,OVctr,SIGctr;wire 1:0 OPctr;wire n-1:0 H,M,N,Add_Result;wire K,G,I,Add_Sign,Add_Overflow,Add_carry;assign SUBctr=ALUctr2;assign OVctr=!ALUctr1 assign SIGctr=ALUctr0;assign OPctr1=ALUctr2 assign OPct
16、r0=!ALUctr2 assign H=BnSUBctr;assign M=A|B; Adderk nbit_add(SUBctr,A,H,Add_carry,Add_Sign,Add_Result,Zero); /,Add_Overflowassign Add_Overflow= An-1 assign K=SUBctr Add_carry;assign I=Add_Sign Add_Overflow;assign Overflow=OVctr IMUX2to1 YN(K,I,SIGctr,G);IMUX2to1 yn(0,1,G,N);MUX3to1 nbit_Result(Add_Re
17、sult,M,N,OPctr,Result);endmodulemodule Adderk (Cin, X, Y,Add_carry,Add_sign,Add_result,Zero); /Add_Overflow,parameter k = 32;input k-1:0 X, Y;input Cin;output k-1:0 Add_result;output Add_carry,Add_sign,Zero; /,Add_Overflowreg k-1:0 Add_result;reg Add_carry,Zero,Add_sign; /,Add_Overflowalways(X or Y
18、or Cin)beginAdd_carry, Add_result = X + Y + Cin; if(Add_result=0)Zero=1;elseZero=0;北京工业大学 MIPC-CPU 设计课程第 13 页if(Add_result31=1)Add_sign=1;elseAdd_sign=0;endendmodulemodule MUX3to1 (V,W,U,Selm,F);parameter k = 32;input k-1:0 V,W,U;input 1:0 Selm;output k-1:0 F;reg k-1:0 F;always (V or W or U or Selm)
19、case(Selm)2b00: F = V; 2b01: F = W;2b10: F=U;endcase endmodulemodule IMUX2to1 (V,W,SIGctr,Less);input31:0 V,W;北京工业大学 MIPC-CPU 设计课程第 14 页input SIGctr;output31:0 Less;reg31:0 Less;always (V or W or SIGctr)if (SIGctr = 0) Less = V;else Less = W;Endmodule数据存储器(DataStore):module DataStore(clk,DataIn,Adr,
20、WrEn,Out);input 31:0 DataIn;input 4:0 Adr;input WrEn,clk;output 31:0 Out;reg 31:0 Out;reg 31:0 Store 31:0;always(negedge clk)beginif(WrEn=1)StoreAdr=DataIn;endalways(Adr or WrEn)北京工业大学 MIPC-CPU 设计课程第 15 页if(WrEn=0)Out=StoreAdr;endmodule数据寄存器(Registers):module Registers(clk,busW,wr,Rw,Ra,Rb,busA,busB
21、);input 31:0 busW;input clk,wr;input 4:0 Rw,Ra,Rb;output 31:0 busA,busB;reg 31:0 busA,busB;reg 31:0 Regist 31:0;always(negedge clk)beginRegist1=32d25; Regist2=32d25;if(wr=0)RegistRw=busW;endalways(Ra or Rb or wr)beginif(wr=1)beginbusA=RegistRa;北京工业大学 MIPC-CPU 设计课程第 16 页busB=RegistRb;endendendmodule取
22、指令部件(GetCode ):module GetCode(Branch,Zero,Jump,clk,Instruction);input Zero,Branch,Jump,clk;output31:0 Instruction;reg29:0 PC=25;wire29:0 M,M2;wire 4:0 addmem;wire K;reg reset=1;assign addmem=PC2:0,2b00;wire29:0 O1,O2,O3,O4;wire15:0 imm16;instruct InsMem(addmem,Instruction);always(negedge clk)beginif
23、 (reset=1)beginPC =0;reset=0;end北京工业大学 MIPC-CPU 设计课程第 17 页elsebegin PC = O4;endendassign imm16=Instruction15:0;assign M=PC;assign K=Zero Adder adder1(M,1,O1);assign M1=14imm1615,imm1615:0;Adder adder2(O1,M1,O2);MUX2T1 mux1(K,O1,O2,O3);assign M2=M29:26,Instruction25:0;MUX2T1 mux2(Jump,O3,M2,O4);endmo
24、dulemodule Adder(M,N,O);input29:0 M;input29:0 N;output29:0 O;wire29:0 M,N,O;assign O=M+N;endmodule 北京工业大学 MIPC-CPU 设计课程第 18 页module MUX2T1(op,X,Y,Z);input op;input 29:0 X,Y;output29:0 Z;reg 29:0 Z;always(op)beginif(op=1)Z=Y;elseZ=X;endendmodulemodule instruct(addr,inst);input 4:0 addr;output 31:0 in
25、st;reg 31:0 inst;/ Declare the RAM variablereg 31:0 Mem 31:0;/ write instruction: add 3=(1)+(2),sub 6=(4)-(5),jump 0always (*)begin/Mem0=6b000000,5b00001,5b00010,5b00011,5b00000,6b100000; /add $3,$1,$2北京工业大学 MIPC-CPU 设计课程第 19 页/ Mem4=6b000000,5b00011,5b00001,5b00100,5b00000,6b100010; /sub $4,$3,$1/
26、Mem0=6b000000,5b00001,5b00010,5b00011,5b00000,6b101010; /slt $3,$1,$2/ Mem4=6b000000,5b00011,5b00001,5b00100,5b00000,6b100011; /subu $4,$3,$1/ Mem0=6b000000,5b00001,5b00010,5b00011,5b00000,6b101010; /slt $3,$1,$2/ Mem4=6b000000,5b00001,5b00010,5b00100,5b00000,6b101011; /sltu $4,$1,$2/Mem0=6b001101,5
27、b00001,5b00011,5b10000,5b00000,6b000101; /ori $3,$1,32773/ Mem4=6b001001,5b00010,5b00100,5b00000,5b00000,6b001000; /addiu $4,$2, 8/ Mem4=6b001001,5b00010,5b00100,5b11111,5b11111,6b111000; /addiu $4,$2, -8/ Mem0=6b101011,5b00001,5b00011,5b00000,5b00000,6b000101; /sw $3,$1,5/ Mem4=6b100011,5b00001,5b0
28、0100,5b00000,5b00000,6b000101; /lw $4,$1,5Mem0=6b000100,5b00001,5b00010,5b00000,5b00000,6b000001; /beq $1,$2,1Mem4=6b000000,5b00001,5b00010,5b00100,5b00000,6b101011; /sltu $4,$1,$2Mem8=6b000010,5b00000,5b00000,5b00000,5b00000,6b000010; /j 2end/ readalways (addr)begininst = Memaddr;endendmodule总控制器(C
29、ontrol):module Control(Instruction,RegWr,ExtOp,ALUSrc,ALUctr,Branch,Jump,RegDst,MemtoReg,MemWr);output RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr;input31:0 Instruction;北京工业大学 MIPC-CPU 设计课程第 20 页reg RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,clk,MemtoReg,MemWr;output 2:0 ALUctr;reg 2:0 ALUctr;wi
30、re 5:0 op,func;assign op=Instruction31:26;assign func=Instruction5:0;parameter S0=6b100000,S1=6b100010,S2=6b100011,S3=6b101010,S4=6b101011,S5=6b001101,S6=6b001001,S7=6b100011,S8=6b101011,S9=6b000100,S10=6b000010;always(op or func)beginif(op=6b000000)begincase(func)S0:beginBranch=0;Jump=0;RegDst=1;AL
31、USrc=0;ALUctr=3b001;MemtoReg=0;RegWr=1;MemWr=0;北京工业大学 MIPC-CPU 设计课程第 21 页endS1:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3b101;MemtoReg=0;RegWr=1;MemWr=0;endS2:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3b100;MemtoReg=0;RegWr=1;MemWr=0;endS3:北京工业大学 MIPC-CPU 设计课程第 22 页beginBranch=0;Jump=0;RegD
32、st=1;ALUSrc=0;ALUctr=3b111;MemtoReg=0;RegWr=1;MemWr=0;endS4:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3b110;MemtoReg=0;RegWr=1;MemWr=0;endendcaseendelse北京工业大学 MIPC-CPU 设计课程第 23 页begincase(op)S5:beginBranch=0;Jump=0;RegDst=0;ALUSrc=1;ALUctr=3b010;MemtoReg=0;RegWr=1;MemWr=0;ExtOp=0;endS6:beginBran
33、ch=0;Jump=0;RegDst=0;ALUSrc=1;ALUctr=3b000;MemtoReg=0;RegWr=1;MemWr=0;北京工业大学 MIPC-CPU 设计课程第 24 页ExtOp=1;endS7:beginBranch=0;Jump=0;RegDst=0;ALUSrc=1;ALUctr=3b000;MemtoReg=1;RegWr=1;MemWr=0;ExtOp=1;endS8:beginBranch=0;Jump=0;ALUSrc=1;ALUctr=3b000;RegWr=0;MemWr=1;ExtOp=1;end北京工业大学 MIPC-CPU 设计课程第 25 页S
34、9:beginBranch=1;Jump=0;ALUSrc=0;ALUctr=3b100;RegWr=0;MemWr=0;endS10:beginBranch=0;Jump=1;RegWr=0;MemWr=0;endendcaseendendendmodule北京工业大学 MIPC-CPU 设计课程第 26 页LOGISIM 实现部分实验内容利用 LOGISIM 软件,实现通过图形硬件语言完成对 32 位单周期 MIPS-CPUD 设计工作。利用各种逻辑门完成各个子模块向上构建完成的 CPU试验环境Windows 7 JavaScript Logisim 2.7.1子模块设计1bit-ADDer北京工业大学 MIPC-CPU 设计课程第 27 页Com-1bit-ADDER32bits-ADDer 132bits-ADDer 2 北京工业大学 MIPC-CPU 设计课程第 28 页32bits-ADDer 32bits Subtract 北京工业大学 MIPC-CPU 设计课程第 29 页32bits Ori以上次级子模块构成 ALU北京工业大学 MIPC-CPU 设计课程第 30 页