西安交大计算机组成-实验十cpu_第1页
西安交大计算机组成-实验十cpu_第2页
西安交大计算机组成-实验十cpu_第3页
西安交大计算机组成-实验十cpu_第4页
西安交大计算机组成-实验十cpu_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上计算机组成实验报告计算机66熊鹏飞实验十 基于MIPS指令集的CPU设计一、实验目的1. 综合运用Verilog进行复杂系统设计。2. 深刻理解计算机系统硬件原理。二、实验内容1. 设计一个基于MIPS指令集的CPU。2. CPU需要包含寄存器组、RAM模块、ALU模块、指令译码模块。3. 该CPU能运行基本的汇编指令。4. 实现cache,流水线或其他现代CPU的高级功能(加分项)三、实验要求1. 分析各模块的的程序结构,画出其流程图。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一条指令的执行,即一条指令用一个时钟周期完成。电平从低到高变化的瞬间

2、称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。 CPU在处理指令时,一般需要经过以下几个步骤: (1) 取指令(IF):根据程序计数器PC中的指令地址,从存储器中取出一条指令,同时,PC根据指令字长度自动递增产生下一条指令所需要的指令地址,但遇到“地址转移”指令时,则控制器把“转移地址”送入PC,当然得到的“地址”需要做些变换才送入PC。 (2) 指令译码(ID):对取指令操作中得到的指令进行分析并译码,确定这条指令需要完成的操作,从而产生相应的操作控制信号,用于驱动执行状态中的各种操作。 (3) 指令执行(EXE):根据指令译码得到

3、的操作控制信号,具体地执行指令动作,然后转移到结果写回状态。 (4) 存储器访问(MEM):所有需要访问存储器的操作都将在这个步骤中执行,该步骤给出存储器的数据地址,把数据写入到存储器中数据地址所指定的存储单元或者从存储器中得到数据地址单元中的数据。 (5) 结果写回(WB):指令执行的结果或者访问存储器中得到的数据写回相应的目的寄存器中。 单周期CPU,是在一个时钟周期内完成这五个阶段的处理。2. 画出模块的电路图。3. 分析电路的仿真波形,标出关键的数值。4. 记录设计和调试过程。1. wire和reg是什么意思? 在verilog里面,变量有wire和reg

4、两种类型,wire类型意为线,它不可储存中间结果,通过输入得出输出,类似纯函数,只要输入变化,输出立即变化,如果没有输入,自然就没有输出。reg类型意为寄存器,它可以赋初值,可以储存中间结果,只有当满足某种条件时(比如时钟上升沿),它才会变化,其他时间会一直保持最后一次变化的值。2. 指令怎么来? 在IM组件和RW组件分别开两个寄存器数组,用来模拟指令内存和数据内存,通过文件读取,从test.txt(test文件夹中)读指令到IM的指令内存(从0开始),IM组件通过输入的IAddr(数组地址下标),得到相应的指令。3. 指令怎么变化? 在PC端,有两个外部输入:CLK和Reset。其中PC内部

5、有指令寄存器,每次CLK上升沿触发后,会改成新的指令,同时,当Reset=1时,指令寄存器也会置0。4. 模块和模块间怎么连接? 此时,需要一个顶层模块,相当于main函数,它会根据数据通路图,将一些下层模块的输出,连接到另一些下层模块的输入中。5. 写好的cpu怎么运行? 需要在顶层模块再添加一个测试文件,测试文件提供外部输入(CLK和Reset),然后模块就会自动运行得到相应的仿真结果。四、实验代码及结果1. PC:CLK上升沿触发,更改指令地址timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 23:43:40 05/02

6、/2017 / Design Name: / Module Name: PC / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module PC( input CLK, / 时钟 input Reset, / 重置信号 input PCWre, / PC是否更改,如果为0,PC不更改 input 31:0 newAddress, / 新指令 outp

7、ut reg31:0 currentAddress / 当前指令 ); initial begin currentAddress <= 0; / 非阻塞赋值 end always(posedge CLK or posedge Reset) begin if (Reset = 1) currentAddress <= 0; / 如果重置,赋值为0 else begin if (PCWre) currentAddress <= newAddress; else currentAddress <= currentAddress; end endendmodule输入:CLK,

8、Reset,PCWre,newAddress 输出:currentAddress 解释:由于指令地址存储在寄存器里,一开始需要赋currentAddress为0。Reset是重置信号,当为1时,指令寄存器地址重置。PCWre的作用为保留现场,如果PCWre为0,指令地址不变。2. InstructionMemory:储存指令,分割指令timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 00:10:27 05/03/2017 / Design Name: / Module Name: IM / Project

9、Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module InstructionMemory( input InsMemRW, / 读写控制信号,1为写,0位读 input 31:0 IAddr, / 指令地址输入入口 /input IDataIn, / 没用到 output 5:0 op, output 4:0 rs, output 4:0 rt, output

10、4:0 rd, output 15:0 immediate / 指令代码分时段输出 ); reg7:0 mem0:63; / 新建一个32位的数组用于储存指令 initial begin $readmemb("test/test.txt", mem); /读取测试文档中的指令 end / 从地址取值,然后输出 assign op = memIAddr7:2; assign rs4:3 = memIAddr1:0; assign rs2:0 = memIAddr + 17:5; assign rt = memIAddr + 14:0; assign rd = memIAddr

11、 + 27:3; assign immediate15:8 = memIAddr + 2; assign immediate7:0 = memIAddr + 3;endmodule输入:InsMenRW,IAddr 输出:op,rs,rt,rd,immediate 解释:该部分为指令寄存器,通过一个64大小的8位寄存器数组来保存从文件输入的全部指令。然后通过输入的地址,找到相应的指令,并分割成op,rs,rt,rd,immediate输出。(由于寄存器地址+4,所以不用右移变换成真正的地址)3.RegisterFile:储存寄存器组,并根据地址对寄存器组进行读写timesc

12、ale 1ns / 1ps/ Company: / Engineer: / / Create Date: 01:07:13 05/03/2017 / Design Name: / Module Name: RF / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module RegisterFile( input CLK, / 时钟 input Reg

13、Wre, / 写使能信号,为1时,在时钟上升沿写入 input 4:0 rs, / rs寄存器地址输入端口 input 4:0 rt, / rt寄存器地址输入端口 input 4:0 WriteReg, / 将数据写入的寄存器端口,其地址来源rt或rd字段 input 31:0 WriteData, / 写入寄存器的数据输入端口 output 31:0 ReadData1, / rs寄存器数据输出端口 output 31:0 ReadData2 / rt寄存器数据输出端口 ); reg 31:0 register0:15; / 新建16个寄存器,用于操作 / 初始时,将32个寄存器全部赋值为0

14、 integer i; initial begin for(i = 0; i < 16; i = i + 1) registeri <= 0; end / 读寄存器 assign ReadData1 = registerrs; assign ReadData2 = registerrt; / 写寄存器 always(negedge CLK) begin / 如果寄存器不为0,并且RegWre为真,写入数据 if (RegWre && WriteReg != 0) registerWriteReg = WriteData; end endmodule输入:CLK,Re

15、gWre,rs,rt,WriteReg,WriteData 输出:ReadData1,ReadData2 解释:该部分为寄存器读写单元,RegWre的作用是控制寄存器是否写入。同上,通过一个16大小的32位寄存器数组来模拟寄存器,开始时全部置0。通过访问寄存器的地址,来获取寄存器里面的值,并进行操作。(PS:由于$0恒为0,所以写入寄存器的地址不能为0)4.ALU(算术逻辑单元):用于逻辑指令计算和跳转指令比较timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 01:54:18 05/03/2017 / De

16、sign Name: / Module Name: ALU / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module ALU( input 2:0 ALUOp, / ALU操作控制 input 31:0 A, / 输入1 input 31:0 B, / 输入2 output reg zero, / 运算结果result的标志,result为0输出

17、1,否则输出0 output reg 31:0 result / ALU运算结果 ); / 进行ALU计算 always(*) begin / 进行运算 case (ALUOp) 3'b000 : result = A + B; / 加法 3'b001 : result = A - B; / 减法 3'b010 : result = B - A; / 减法 3'b011 : result = A | B; / 或 3'b100 : result = A & B; / 与 3'b101 : result = A & B; / A非与

18、B 3'b110 : result = A B; / 异或 3'b111 : result = A B; / 同或 default : result = 0; endcase / 设置zero if (result) zero = 0; else zero = 1; endendmodule输入:ALUOp,A,B 输出:zero,result 解释:ALUOp用于控制算数的类型,AB为输入数,result为运算结果,zero主要用于beq和bne指令的判断。5.SignZeroExtend:用于immediate的扩展timescale 1ns / 1ps

19、/ Company: / Engineer: / / Create Date: 00:58:20 05/03/2017 / Design Name: / Module Name: EX / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module SignZeroExtend( input ExtSel, / 控制补位,如果为1,进行符号扩展,如果为

20、0,全补0 input 15:0 immediate, / 16位立即数 output 31:0 extendImmediate / 输出的32位立即数 ); / 进行扩展 assign extendImmediate15:0 = immediate; assign extendImmediate31:16 = ExtSel ? (immediate15 ? 16'hffff : 16'h0000) : 16'h0000;endmodule输入:ExtSel,immediate 输出:extendImmediate 解释:比较简单的一个模块。ExtS

21、el为控制补位信号。判断后,将extendImmediate的前16位全补1或0即可。6.DataMemory:用于内存存储,内存读写timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 01:37:40 05/03/2017 / Design Name: / Module Name: DM / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Crea

22、ted/ Additional Comments: /module DataMemory( input DataMemRW, / 数据存储器读写控制信号,为1写,为0读 input 31:0 DAddr, / 数据存储器地址输入端口 input 31:0 DataIn, / 数据存储器数据输入端口 output reg 31:0 DataOut / 数据存储器数据输出端口 ); / 模拟内存,以8位为一字节存储,共64字节 reg 7:0 memory0:63; / 初始赋值 integer i; initial begin for (i = 0; i < 64; i = i + 1)

23、memoryi <= 0; end / 读写内存 always(DAddr) begin end always(DAddr or DataIn) begin / 写内存 if (DataMemRW) begin memoryDAddr <= DataIn31:24; memoryDAddr + 1 <= DataIn23:16; memoryDAddr + 2 <= DataIn15:8; memoryDAddr + 3 <= DataIn7:0; end / 读内存 else begin DataOut31:24 <= memoryDAddr; DataO

24、ut23:16 <= memoryDAddr + 1; DataOut15:8 <= memoryDAddr + 2; DataOut7:0 <= memoryDAddr + 3; end endendmodule输入:DataMenRW,DAddr,DataIn 输出:DataOut 解释:该部分控制内存存储。同上,用64大小的8位寄存器数组模拟内存(内存小主要是因为编译快),内存部分采用小端模式。DataMenRW控制内存读写。由于指令为真实地址,所以不需要*4。7.Multiplexer:5线和32线二路选择器 module Multiplexer5

25、( input control, input 4:0 in1, input 4:0 in0, output 4:0 out ); / 5线多路选择器 assign out = control ? in1 : in0;Endmodulemodule Multiplexer32( input control, input 31:0 in1, input 31:0 in0, output 31:0 out ); / 32线多路选择器 assign out = control ? in1 : in0;endmodule输入:control,in1,in0 输出:out 解释:多路选

26、择器,不用过多解释。8.最重要的ControlUnit:控制信号模块,通过解析op得到该指令的各种控制信号首先,需要得到控制信号表: 通过信号控制表,可以很轻松的写控制模块。timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 02:11:08 05/03/2017 / Design Name: / Module Name: CU / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: /

27、Revision 0.01 - File Created/ Additional Comments: /module ControlUnit( input 5:0 op, / op操作符 input zero, / ALU的zero输出 / 一堆控制信号 output reg PCSrc, / 多路选择器 output reg PCWre, / (PC)PC是否更改,如果为0,PC不更改 output reg ALUSrcB, / 多路选择器 output reg ALUM2Reg, / 多路选择器 output reg RegWre, / (RF)写使能信号,为1时,在时钟上升沿写入 out

28、put reg InsMemRW, / (IM)读写控制信号,1为写,0位读 output reg DataMemRW, / (DM)数据存储器读写控制信号,为1写,为0读 output reg ExtSel, / (EXT)控制补位,如果为1,进行符号扩展,如果为0,全补0 output reg RegOut, / 多路选择器 output reg 2:0 ALUOp / (ALU)ALU操作控制 ); / 进行各种赋值 initial begin ExtSel = 0; PCWre = 1; InsMemRW = 1; RegOut = 1; RegWre = 0; ALUOp = 0;

29、PCSrc = 0; ALUSrcB = 0; DataMemRW = 0; ALUM2Reg = 0; end always(op or zero) begin case(op) / add 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 1; ALUOp = 000; end / addi 6'b: begin /以下都是控制单元产生的控制信号 P

30、CWre = 1; ALUSrcB = 1; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 1; PCSrc = 0; RegOut = 0; ALUOp = 000; end / sub 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 1; ALUOp = 001; end /

31、 ori 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 1; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 0; ALUOp = 011; end / and 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 0; PCS

32、rc = 0; RegOut = 1; ALUOp = 100; end / or 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 1; ALUOp = 011; end / move 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 1; InsMem

33、RW = 1; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 1; ALUOp = 000; end / sw 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB = 1; ALUM2Reg = 0; RegWre = 0; InsMemRW = 1; DataMemRW = 1; ExtSel = 1; PCSrc = 0; RegOut = 0; ALUOp = 000; end / lw 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 1; ALUSrcB =

34、 1; ALUM2Reg = 1; RegWre = 1; InsMemRW = 1; DataMemRW = 0; ExtSel = 1; PCSrc = 0; RegOut = 0; ALUOp = 000; end / beq 6'b: begin /以下都是控制单元产生的控制信号 if (zero) begin PCSrc = 1; end else begin PCSrc = 0; end ALUM2Reg = 0; PCWre = 1; ALUSrcB = 0; RegWre = 0; InsMemRW = 1; DataMemRW = 0; ExtSel = 1; Reg

35、Out = 0; ALUOp = 001; end / halt 6'b: begin /以下都是控制单元产生的控制信号 PCWre = 0; ALUSrcB = 0; ALUM2Reg = 0; RegWre = 0; InsMemRW = 0; DataMemRW = 0; ExtSel = 0; PCSrc = 0; RegOut = 0; ALUOp = 000; end endcase endendmodule输入:op,zero 输出:各类控制信号 解释:通过上表,可以将每个指令case到相应的控制信号上。然后,通过顶层模块,调用下层模块并将它们输入输出

36、连在一起:SingleCPU:顶层连接模块timescale 1ns / 1ps/ Company: / Engineer: / / Create Date: 23:43:17 05/02/2017 / Design Name: / Module Name: SingleCPU / Project Name: / Target Devices: / Tool versions: / Description: / Dependencies: / Revision: / Revision 0.01 - File Created/ Additional Comments: /module Singl

37、eCPU( input CLK, input Reset, output 5:0 op, output 4:0 rs, output 4:0 rt, output 4:0 rd, output 15:0 immediate, output 31:0 ReadData1, output 31:0 ReadData2, output 31:0 WriteData, output 31:0 DataOut, output 31:0 currentAddress, output 31:0 result ); / 各种临时变量 wire 2:0 ALUOp; wire 31:0 B, newAddres

38、s; wire 31:0 currentAddress_4, extendImmediate, currentAddress_immediate; wire 4:0 WriteReg; wire zero, PCSrc, PCWre, ALUSrcB, ALUM2Reg, RegWre, InsMemRW, DataMemRW, ExtSel, RegOut; /*module ControlUnit( input 5:0 op, / op操作符 input zero, / ALU的zero输出 / 一堆控制信号 output PCSrc, / 多路选择器 output PCWre, / (P

39、C)PC是否更改,如果为0,PC不更改 output ALUSrcB, / 多路选择器 output ALUM2Reg, / 多路选择器 output RegWre, / (RF)写使能信号,为1时,在时钟上升沿写入 output InsMemRW, / (IM)读写控制信号,1为写,0位读 output DataMemRW, / (DM)数据存储器读写控制信号,为1写,为0读 output ExtSel, / (EXT)控制补位,如果为1,进行符号扩展,如果为0,全补0 output RegOut, / 多路选择器 output 2:0 ALUOp / (ALU)ALU操作控制 );*/ ControlUnit cu(op, zero, PCSrc, PCWre, ALUSrcB, ALUM2Reg, RegWre, InsMemRW, DataMemRW, ExtSel, RegOut, ALUOp); /*m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论