My title page contents

多周期流水处理器MIPS架构的CPU设计Verilog代码ISE仿真

名称:多周期流水处理器MIPS架构的CPU设计Verilog代码ISE仿真

软件:ISE

语言:Verilog

代码功能:

 1. 设计一个基于MIPS架构的基本CPU,并能下载到FPGA上。利用所设计的CPU能够执行相应的程序,并能返回正确结果。   

2. 扩展完成以下内容:设计深度为5流水线CPU。   5个流水段分别命名为IF(取指),ID(指令译码),EXE(执行),MEM(访存)和WB(回写)。   

 3. 当指令采用流水线技术行执行时候可能会产生相关和冲突。请采取简单方式合理解决冲突。


FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com


演示视频:

设计文档:

MIPS多周期流水化处理器 报告.doc

基于FPGA的MIPS架构的CPU设计    

一、要求:

(1)设计一个基于MIPS架构的基本CPU,并能下载到FPGA上。利用所设计的CPU能够执行相应的程序,并能返回正确结果。

(2)扩展完成以下内容:设计深度为5流水线CPU。5个流水段分别命名为IF(取指),ID(指令译码),EXE(执行),MEM(访存)和WB(回写)。

(3)当指令采用流水线技术行执行时候可能会产生相关和冲突。请采取简单方式合理解决冲突。

二、实验目的:

理解和掌握5级流水线CPU的设计。

三、开发环境与工具:

1、Win 8.1  

2、Xilinx ISE 14.7  

3、FPGA  Anvyl

四、实验过程:

(1)设计原理图:

(2)指令设计:

实验中共涉及三种类型的MIPS指令,分别为R型、I型和J型,三种类型的MIPS指令格式定义如下:

● R(register)类型的指令从寄存器堆中读取两个源操作数,计算结果写回寄存器堆;

● I(immediate)类型的指令使用一个 16位的立即数作为一个源操作数;

● J(jump)类型的指令使用一个 26位立即数作为跳转的目标地址(target address);

                       图:MIPS指令集三种类型

由从MIPS指令集中选择的一些常用指令构成的MIPS-C指令集。MIPS-C可以支持除浮点运算外的绝大多数定点类程序的运行,并且提供了包括CP0、异常处理等指令,可以支持简单的操作系统运行。 MIPS-C指令集共包括55条指令。从更细致的功能角度,MIPS-C被划分为11个子类。

在完成指令设计过程中,参考了MIPS-C指令集,最后选取了35条进行实现,各类均有涉及。

1.Lw:加载字:

2. Addu:无符号加

3.Subu:无符号减

4.and:与

5.or: 或

6.Slt:    小于置1(有符号)

7.Div: 符号除

8.add:符号加

9.sub: 符号减

10.addi:符号加立即数

11.addiu:无符号加立即数

12.    Jump :跳转

13. mulu : 无符号乘

14. divu    :无符号除

15.Mult:符号乘

16.    Sllv:逻辑可变左移

17.Srav: 算数可变右移

18.Xor:异或

19. Ori:或立即数

20.Slti:小于立即数置1(有符号)

21.And: 与立即数

22.Xori: 异或立即数

23. Sltu: 小于置1(无符号)

24. Sltiu:小于立即数置1(无符号)

25.    Sll:逻辑左移

26.Srl:逻辑右移

27.Srlv: 逻辑可变右移

28.Srav : 算数可变右移

29.Sra:算数右移

30.beq: 相等时转移

31.bne : 不等于时转移

32.bgez:大于等于0时转移

33.bgtz: 大于0时转移

34.blez: 小于等于0时转移

35.bltz: 小于0时转移

(3)模块定义(详见代码):

模块设计过程中,

   1)CPU控制器的实现:

       

信号名

方向

描述

OpCode

I

指令31:26位,用于区分指令

Funct

I

指令5:0位,用于区分指令

RegWriteD

O

控制寄存器何时写入

MemtoRegD

O

控制结果来自寄存器还是内存

MemWriteD

O

控制何时写入数据存储器

BranchD

O

控制跳转

ALUControlD

O

判断ALU进行何种运算

ALUSrcD

O

ALU输入选择信号

RegDstD

O

数据存储器数据写回选择信号


   2)ALU的实现:

       

信号名

方向

描述

SrcA

I

ALU输入的数据

SrcB

I

ALU输入的数据

ALUCtr

I

判断ALU进行何种运算

Zero

O

判断ALU计算结果是否为0,进行跳转

ALURes

O

ALU计算结果

   3)Instruction memory的实现

       

信号名

方向

描述

Clk

I

时钟信号

ImemRdAddr

I

所想取指令的地址

Instruction

O

取出的指令

   4)Data Memory的实现

       

信号名

方向

描述

Clk

I

时钟信号

DmemAddr

I

内存地址

DmemWrite

I

控制何时写入内存

DmemWrData

I

想要写入内存的数据

DmemRdData

O

从内存中读出的数据


   5)Register的实现

       

信号名

方向

描述

Clk

I

时钟信号

RegARdAddr

I

想要从寄存器中读出的数据的地址

RegBRdAddr

I

想要从寄存器中读出的数据的地址

RegWrAddr

I

数据写入寄存器的地址

RegWrData

I

想写入寄存器的数据

RegWrite

I

控制寄存器何时写入

RegARdData

O

从寄存器中读出的数据

RegBRdData

O

从寄存器中读出的数据


   6)有符号扩展的实现

       

信号名

方向

描述

inst16

I

想要扩展成32位的16位数据

SignImm

O

扩展结束的32位数据

   7)top文件

   将以上几个模块联系在一起,实现5级流水线CPU。

(4) 冲突解决设计方案:

在ID段进行判断,针对不同指令,判断此时所需数据是否到达,如果有继续执行,否则加入停顿。

五、实验结果:

(1)模拟仿真

(2)下载验证:



部分代码展示:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    16:47:50 07/01/2015 
// Design Name: 
// Module Name:    Ctr 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module Ctr(
    input [5:0] OpCode,
    input [5:0] Funct,
    output reg RegDst,
    output reg ALUSrc,
    output reg RegWrite,
    output reg MemWrite,
    output reg MemRead,
    output reg MemtoReg,
    output reg Branch,
    output reg Jump,
    output reg [3:0] ALUControl
    );
 reg[1:0] ALUOp;
 always @(OpCode) 
 begin
case(OpCode) 
// R-format
6'b000000:
begin
RegDst = 1;
ALUSrc = 0;
MemtoReg = 0;
RegWrite = 1;
MemRead = 0;
MemWrite = 0;
Branch = 0;
ALUOp = 2'b10;
Jump = 0;
end
// lw
6'b100011:
begin
RegDst = 0;
ALUSrc = 1;
MemtoReg = 1;
RegWrite = 1;
MemRead = 1;
MemWrite = 0;
Branch = 0;
ALUOp = 2'b00;
Jump = 0;
end
// sw
6'b101011:
begin
RegDst = 1'bx;
ALUSrc = 1;
MemtoReg = 1'bx;
RegWrite = 0;
MemRead = 0;
MemWrite = 1;
Branch = 0;
ALUOp = 2'b00;
Jump = 0;
end
// beq
6'b000100:
begin
RegDst = 1'bx;
ALUSrc = 0;
MemtoReg = 1'bx;
RegWrite = 0;

代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 多周期流水处理器MIPS架构的CPU设计Verilog代码ISE仿真

发表评论

模板文件不存在: ./template/plugins/comment/pc/index.htm

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员