精华内容
下载资源
问答
  • mips微处理器设计
    千次阅读
    2021-05-03 18:57:06

    类MIPS单周期微处理器设计(单周期CPU)

    一、实验目的

    • 熟悉Verilog语言的编写;
    • 掌握单周期CPU的功能实现逻辑并理解过程;
    • 熟练掌握ise和vivado等软件并进行开发并实现逻辑功能。

    二、实验任务与要求

    基本要求:利用Verilog HDL语言,基于Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS指令集的单周期类MIPS处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性;

    • 支持基本的算术逻辑运算如add,sub,and,or,slt, a n d i \textcolor{red}{andi} andi指令;

    • 支持基本的内存操作如lw,sw指令;

    • 支持基本的程序控制如beq,j指令。

    二、实验内容和步骤

    1、设计思路

    1.1 整体设计

    单周期cpu

    ​ 根据单周期mipsCPU的结构分析知,可以将子模块分为数据存储器dram、指令存储器irom、寄存器文件RegFile、主控制译码MainCtr、ALU控制信号译码ALUCtr以及算术逻辑单元ALU,分别实现各个模块的功能;

    ​ 再将控制信号等在mips的顶层模块中使用assign语句进行赋值,同时在顶层模块中进行其余子模块的实例化,使之与控制信号以及32位Instr等进行关联,对于不同的指令都有对应于各自的控制信号;

    1.2 子模块的设计

    • 指令存储器irom

    ​ 使用vivado的IPcore实现指令存储器irom的逻辑功能。在时钟上升沿到来时,读入PC信号的高五位,作为地址,输出相应的32位Instr指令,此处我们在vivado中导入text.coe到irom_IP中,其本质为16进制的32位机器码,机器码对照表如下:
    指令和机器码对照表
    ps:此处的起始地址应该为0x00000000,j指令也应该相应地跳回0x00000000.

    • 数据存储器dram

    ​ 使用vivado的IPcore实现数据存储器dram的逻辑功能。在时钟下降沿到来时,根据写数据的使能信号MenWr决定是否在输入的地址addr处写入输入的数据DataIn,除此之外还会输出存储在输入的地址addr处的数据到DataOut;

    • 寄存器文件RegFile

    ​ 使用Verilog语言编写实现寄存器文件RegFile的逻辑功能。在时钟下降沿到来时,倘若写使能信号RegWr为高电平且复位信号reset为低电平,则将输入的数据DataIn写到地址为输入写地址WrAddr处的寄存器regs[WrAddr];倘若复位信号reset为高电平,则我们将regs的值设定为初始默认值regs[i]=i(按照要求也可将其写为学号的ASCII码)。模块中同时使用assign语句决定RsData和RtData的值是0或者地址为RsAddr或RtAddr的寄存器的值。

    • 主控制译码MainCtr

    ​ 使用Verilog语言编写实现主控制译码MainCtr的逻辑功能。输入Instr的高六位,输出控制信号和ALUOp,根据每个指令调用的模块得到各个控制信号的状态,再将ALUOp输入到ALU控制信号译码ALUCtr中去。

    在这里插入图片描述

    • ALU控制信号译码ALUCtr

    ​ 使用Verilog语言编写实现ALU控制信号译码ALUCtr的逻辑功能。输入ALUOp和Instr的低六位Funct,输出各个指令相应的ALUCtr信号,并且输入到算术逻辑单元ALU中去,其中andi和and的ALUOp和Funct虽然不同,但ALUCtr是一致的。在这里插入图片描述

    • 算术逻辑单元ALU

    ​ 使用Verilog语言编写算术逻辑单元ALU。输入符号数字In1和符号数In2,由输入的ALUCtr信号觉得要做的运算,事实上我们采用的编码让sw和lw在算术逻辑单元ALU中所做的运算为add,andi所做的为and,beq所做的为sub。并且Zero信号默认为0,只有在执行sub运算时有机会为1,当其为1时,BranchZ = B & Zero才有机会为1,让PC跳转到BranchPC = ImmL2 + SquencePC,即左移两位的立即数与PC加4后的和。

    1.3 顶层模块的设计

    ​ 顶层模块的输入信号仅有时钟信号clk和复位信号reset,声明一系列中间信号,使用assign语句和子模块实例化实现指令功能的完成以及控制信号的传递,数据的读写运算等。除此之外,使用always语句实现PC信号的选择和PC的复位。

    2、设计源代码及注释

    ​ 由于不同的指令需求,对于ALUCtr和MainCtr的编码不同,笔者在此处给出部分源码:

    2.1 顶层模块mips

    `timescale 1ns / 1ps
    
    module mips (
        input clk, 
        input reset 
    );
    
        wire [31:0] TempPC, JumpPC, MuxPC, SquencePC, BranchPC, Imm32, ImmL2, regWriteData, RsData, RtData, ALUin2, ALUres, memReadData, Instr;
        wire [4:0] regWriteAddr;
        wire [27:0] PsudeoPC;
        wire [1:0] ALUop;
        wire [3:0] ALUctr;
        wire BranchZ, regDst, ALUsrc, M2R, regWriteEn, zero, memWriteEn, B, J;
        reg [31:0] PC;
    
        assign PsudeoPC = {Instr[25:0], 2'b00};
        assign JumpPC = {SquencePC[31:28], PsudeoPC};
        assign TempPC = J ? JumpPC : MuxPC;
        assign MuxPC = BranchZ ? BranchPC : SquencePC;
        assign BranchPC = ImmL2 + SquencePC;
        assign ImmL2 = {Imm32[29:0], 2'b00};
        assign Imm32 = {Instr[15] ? 16'hffff : 16'h0000, Instr[15:0]};
        assign BranchZ = B & zero;
        assign regWriteAddr = regDst ? Instr[15:11] : Instr[20:16];
        assign ALUin2 = ALUsrc ? Imm32 : RtData;
        assign regWriteData = M2R ? memReadData : ALUres;
        assign SquencePC = PC + 4;
           
        always @(negedge clk) begin
            if(reset)
                PC <= 32'h0;
            else 
                PC <= TempPC;
        end
    
        ALU U0(RsData,ALUin2,ALUctr,ALUres,zero);
        //dram U1(memWriteEn,ALUres[6:2],memReadData,RtData);
        //irom U2(PC[6:2],Instr);
        dram_IP U1(~clk,memWriteEn,ALUres[6:2],RtData,memReadData);
        irom_IP U2(clk,PC[6:2],Instr);
    
        RegFile U3(~clk,reset,regWriteEn,Instr[25:21],Instr[20:16],regWriteAddr,regWriteData,RsData,RtData);
        MainCtr U4(Instr[31:26],regDst,ALUsrc,M2R,regWriteEn,memWriteEn,B,J,ALUop);
        ALUCtr U5(ALUop,Instr[5:0],ALUctr);
        
    endmodule
    

    2.2 算术逻辑单元ALU

    `timescale 1ns / 1ps
    
    module ALU (
        input signed [31:0] In1,
        input signed [31:0] In2,  
        input [3:0] ALUCtr,
        output reg [31:0] Res,
        output reg Zero
    );
    
    always @(In1 or In2 or ALUCtr) begin
        case (ALUCtr)
            4'b0110://sub
            begin
            Res = In1 - In2; 
            Zero = (Res == 0) ? 1 : 0;
            // only sub needs Zero be 1
            end
    
            4'b0010://add
            begin
            Res = In1 + In2; 
            Zero = 0;
            end
    
            4'b0000://and
            begin
            Res = In1 & In2; 
            Zero = 0;
            end
    
            4'b0001://or
            begin
            Res = In1 | In2; 
            Zero = 0;
            end
    
            4'b0111://slt
            begin
            Res = (In1 < In2) ? 1 : 0; 
            Zero = 0;
            end
    
            default: 
            begin
            Res = 0;
            Zero = 0;
            end
        endcase
    end  
    endmodule
    
    

    2.3 寄存器文件RegFile

    `timescale 1ns / 1ps
    
    module RegFile (
        input         clk,
        input         reset,
        input         RegWr,//regWriteEn
        input  [4:0]  RsAddr,
        input  [4:0]  RtAddr,
        input  [4:0]  WrAddr,//regWriteAddr
        input  [31:0] DataIn,//regWriteData
        output [31:0] RsData,
        output [31:0] RtData
    );
    // 32 regs, for each one is 32
    reg [31:0] regs[0:31];
    
    assign RsData = (RsAddr == 5'b0) ? 32'b0 : regs[RsAddr]; 
    assign RtData = (RtAddr == 5'b0) ? 32'b0 : regs[RtAddr]; 
    
    integer i;
    always @(posedge clk) begin
        if(!reset & RegWr) begin
            regs[WrAddr] = DataIn;
        end
    
        else if(reset) begin
            for (i = 0; i < 32; i = i + 1) begin
                regs[i] = i;
            end
        end
    end
    endmodule
    

    2.4 主控制译码MainCtr

    `timescale 1ns / 1ps
    
    module MainCtr (
        input [5:0] OpCode,// Instr[31:26]
        output RegDst,
        output ALUSrc,
        output Mem2Reg,
        output RegWr,
        output MemWr,
        output B,
        output J, 
        output [1:0] ALUOp
    );
        reg [8:0] outputtemp;
    
        assign RegDst = outputtemp[8];
        assign ALUSrc = outputtemp[7];  
        assign Mem2Reg = outputtemp[6];  
        assign RegWr = outputtemp[5];  
        assign MemWr = outputtemp[4];  
        assign B = outputtemp[3];  
        assign J = outputtemp[2];  
        assign ALUOp = outputtemp[1:0];
    
        always @(OpCode) begin
            case (OpCode)
                6'b000010: outputtemp = 9'bxxx0001xx;// j
                6'b000000: outputtemp = 9'b100100010;// R
                6'b100011: outputtemp = 9'b011100000;// lw
                6'b101011: outputtemp = 9'bx1x010000;// sw
                6'b000100: outputtemp = 9'bx0x001001;// beq
                6'b001100: outputtemp = 9'b010100011;// andi
                default:   outputtemp = 9'b000000000;// default
            endcase
        end
    endmodule
    

    2.5 ALU控制信号译码ALUCtr

    `timescale 1ns / 1ps
    
    module ALUCtr (
        input [1:0] ALUOp,
        input [5:0] Funct,
        output reg [3:0] ALUCtr
    );
        always @(ALUOp or Funct) begin
            casex ({ALUOp, Funct})
                8'b00xxxxxx: ALUCtr[3:0] = 4'b0010;// lw, sw
                8'b01xxxxxx: ALUCtr[3:0] = 4'b0110;// beq
                8'b10xx0000: ALUCtr[3:0] = 4'b0010;// add
                8'b10xx0010: ALUCtr[3:0] = 4'b0110;// sub
                8'b10xx0100: ALUCtr[3:0] = 4'b0000;// and 
                8'b10xx0101: ALUCtr[3:0] = 4'b0001;// or
                8'b10xx1010: ALUCtr[3:0] = 4'b0111;// slt
                8'b11xxxxxx: ALUCtr[3:0] = 4'b0000;// andi->and
                default:     ALUCtr[3:0] = 4'b0000;// initial
            endcase
        end
    endmodule
    

    3、 部分模块仿真及波形

    3.1 算术逻辑单元ALU的仿真

    • 仿真sim文件
    `timescale 1ns / 1ps
    
    module ALU_sim(
        output [31:0] Res,
        output Zero
        );
        reg [31:0] In1,In2;
        reg [3:0] ALUCtr;
        
        ALU S1(In1,In2,ALUCtr,Res, Zero);
    
        initial begin
        In1 = 32'hffff0000;
        In2 = 32'h00ffff00;
        ALUCtr=4'h2;
        #10
        ALUCtr=4'h6;
        #10
        ALUCtr=4'h0;
        #10
        ALUCtr=4'h1;
        #10
        ALUCtr=4'h7;
        end 
    endmodule
    
    • 仿真波形在这里插入图片描述

    3.2 寄存器文件RegFile的仿真

    • 仿真sim文件
    `timescale 1ns/1ps
    
    module RegFile_sim (
        output [31:0] RsData,
        output [31:0] RtData
    );
        reg clk;
        reg reset;
        reg regWriteEn;
        reg [4:0] RsAddr;
        reg [4:0] RtAddr;
        reg [4:0] regWriteAddr;
        reg [31:0] regWriteData;
    
        parameter PERIOD = 10;
    
        always begin
            clk = 1'b0;
            #(PERIOD/2) clk = 1'b1;
            #(PERIOD/2) ;  
        end
    
        initial begin
        reset = 1;
        RsAddr = 5'h0;
        RtAddr = 5'h0;
        #15
    
        reset = 0;
        #30
    
        regWriteEn = 1;
        regWriteAddr = 5'h03;
        regWriteData = 32'h5aa5;
        #20
    
        RsAddr = 5'h03;
        RtAddr = 5'h03;
        end
    
        RegFile S2(clk,reset,regWriteEn,RsAddr,RtAddr,regWriteAddr,regWriteData,RsData,RtData);
     
    endmodule
    
    • 仿真波形
      在这里插入图片描述

    3.3 顶层模块mips的仿真

    • 仿真sim文件
    module mips_sim (
    
    );
        reg clk;
        reg reset;
        mips U0(clk, reset);
    
        parameter PERIOD = 10;
    
        always begin
            clk = 1'b0;
            # (PERIOD/2) clk = ~clk;
            # (PERIOD/2)    
        end
    
        initial begin
        reset = 1;
        #20 
    
        reset = 0;
        end
    endmodule
    
    • 仿真波形
      在这里插入图片描述
    更多相关内容
  • 模块类型实验样例(说明:黄色部分为选做内容,其余为必做)模块定义数据存储同步(时钟上升沿)输入\输出数据存储器 DataRAM,容量为 2n*m (示例代码 S
  • 华中科技大学HUST类MIPS单周期微处理器设计实验报告.pdf华中科技大学HUST类MIPS单周期微处理器设计实验报告.pdf华中科技大学HUST类MIPS单周期微处理器设计实验报告.pdf华中科技大学HUST类MIPS单周期微处理器设计实验...
  • 基于VHDL语言的单周期MIPS微处理器设计 MIPS单周期方案是MIPS子集最简单的实现方案,主要设计了12个模块和一个顶层文件,实现的指令包括取字(lw),存字(sw),等值分支(beq),不等值则分支(bne),和算术逻辑指令 add...
  • 32位MIPS微处理器设计与实现.pdf
  • 华中科技大学HUST类MIPS单周期微处理器设计实验报告.docx华中科技大学HUST类MIPS单周期微处理器设计实验报告.docx华中科技大学HUST类MIPS单周期微处理器设计实验报告.docx华中科技大学HUST类MIPS单周期微处理器设计...
  • MIPS单周期微处理器设计实验报告.pdf类MIPS单周期微处理器设计实验报告.pdf类MIPS单周期微处理器设计实验报告.pdf类MIPS单周期微处理器设计实验报告.pdf类MIPS单周期微处理器设计实验报告.pdf类MIPS单周期微处理器...
  • MIPS单周期微处理器设计实验报告.docx类MIPS单周期微处理器设计实验报告.docx类MIPS单周期微处理器设计实验报告.docx类MIPS单周期微处理器设计实验报告.docx类MIPS单周期微处理器设计实验报告.docx类MIPS单周期...
  • 华中科技大学HUST类MIPS单周期微处理器设计实验报告 (2).pdf华中科技大学HUST类MIPS单周期微处理器设计实验报告 (2).pdf华中科技大学HUST类MIPS单周期微处理器设计实验报告 (2).pdf华中科技大学HUST类MIPS单周期...
  • 企业管理-网络科技-32位MIPS微处理器内存管理单元的设计.pdf
  • 64位MIPS微处理器的模块设计和FPGA验证
  • 业界标准处理器架构与数字消费性及商业系统应用核心方案领导供应商 MIPS 科技公司...在 800 MHz 的频率下,这种微处理器非常适合需要高速处理和高质量要求的数码多功能复印机等复杂设计。  MIPS 科技公司营销副总
  • 但是大多数公司和研究机构没有足够的财力与人力开发自己的处理器,所以业界比较流行的做法就是购买微处理器的IP核,例如ARM核或MIPS核,但需要数十万美金的许可证费用的投入。 除了昂贵的ARM核与MIPS核以外,我们...
  • 摘要:本文首先简要介绍了LEON2微处理器,然后论述在Altera的FPGA开发板上建立基于LEON2的SOC原型平台,从硬件设计和软件结构两个方面详细介绍了设计思路。随着IC制造工艺水平的快速发展,片上系统(SOC)在ASIC设计...
  • Project2 VerilogHDL完成MIPS微系统开发(支持设备与中断) 一、设计说明 1.MIPS 微系统应包括:MIPS处理器、系统桥和 1 个定时器,32位输入设备、32 位输出设备。 2.MIPS处理器应实现MIPS-Lite3指令集。 a)MIPS-Lite3...
  • RISC是一种执行较少类型计算机指令的微处理器,起源于80 年代的MIPS主机(即RISC 机),RISC机中采用的微处理器统称RISC处理器。这样一来,它能够以更快的速度执行操作(每秒执行更多百万条指令,即MIPS)。因为...
  • MIPS微程序CPU设计

    2021-12-16 08:51:58
    【设计任务】 掌握多周期MIPS CPU中...掌握多周期MIPS CPU(8条指令和)程序控制器设计的基本原理;能利用相关原理在Logisim平台中设计实现8条指令的多周期程序MIPS CPU,包括程序地址转移电路,程序控制器设...

    【设计任务】

    1. 掌握多周期MIPS CPU中各条指令(8条指令)的数据通路;
    2. 掌握多周期MIPS CPU(8条指令和)微程序控制器设计的基本原理;
    3. 能利用相关原理在Logisim平台中设计实现8条指令的多周期微程序MIPS CPU,包括微程序地址转移电路,微程序控制器设计,微程序代码设计,CPU数据通路电路设计。

    【设计方法和电路工作原理】

    1. 核心指令集8条 (可实现内存区域冒泡排序)
      在这里插入图片描述

    2.指令的划分
    在这里插入图片描述

    3.电路实现指令译码逻辑
    R型指令:ADD、SLT
    I型指令:LW、SW、BEQ、BNE、ADDI
    SysCall指令
    在这里插入图片描述

    1. ALU控制器逻辑
      当AluOP=5时,ALU执行加法;当AluOP=6,ALU执行减法;当AluOP=(0B)H时执行有符号数比较。
      在这里插入图片描述

    2. 构建多周期MIPS CPU数据通路
      在这里插入图片描述

    电路图:
    在MIPS多周期CPU(微程序)子电路中,利用如下组件构建CPU数据通路 PC、MEM、IR、DR、RegFile、ALU、Controller。
    在这里插入图片描述

    1. 实现微程序地址转移逻辑
      在这里插入图片描述

    由指令状态变换图可得
    R_Type的微程序入口地址为7;ADDI的微程序入口地址为11
    LW的微程序入口地址为2;SW的微程序入口地址为5
    BEQ的微程序入口地址为7;BNE的微程序入口地址为10
    SYSCALL的微程序入口地址为13
    利用微程序地址转移逻辑自动生成自动生成逻辑表达式
    在这里插入图片描述

    将表达式输入至组合逻辑电路分析表达式中,即可自动生成微程序地址转移逻辑。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    7.根据状态图构建微程序
    在这里插入图片描述

    1. 多周期MIPS取指令阶段T1
      在这里插入图片描述

    此时,AluSrcB=01,即SrcB=4;IRWrite=1表示写入当前指令,PCWrite=1表示PC更新为PC+4;MemRead表示读取内存,P=0表示下一条指令按下址字段取指令,即下一阶段是译码阶段。译码指令的微指令地址为0001,即下址为0001
    在这里插入图片描述

    所以取指令对应的微指令为(13201)H
    2) 多周期MIPS取指令阶段T2
    在这里插入图片描述

    此时P=1,由于下一条指令由微程序入口决定。
    在这里插入图片描述

    1. R型指令执行状态周期T3~T4
      在这里插入图片描述
      在这里插入图片描述

    R1阶段 AluControl=10即运算方式由Func决定,AluSrcA=1表示ScrA取R1的值。下一微指令是R2,即下址为1000.
    R2阶段写回寄存器RD,RegDst=1写回选中RD,同时RegWrite=1写入寄存器。回到取指令,即下址为0000.

    1. LW指令执行状态周期T3~T5
      在这里插入图片描述

    同理可得
    在这里插入图片描述

    1. Beq指令执行状态周期T3
      在这里插入图片描述

    同理可得

    在这里插入图片描述

    得到总的微指令
    在这里插入图片描述

    将微指令对应的十六进制复制到控制存储器

    在这里插入图片描述

    输入信号
    1.指令字Opcode,Func字段(12位)
    2. 时钟信号、复位信号
    输出信号
    1.多路选择器选择信号
    2.内存访问控制信号
    3.寄存器写使能信号
    4. 运算器控制信号、指令译码信号
    在这里插入图片描述

    构建多周期MIPS CPU
    在这里插入图片描述

    运行程序:
    在这里插入图片描述

    实现冒泡排序

    在这里插入图片描述

    在这里插入图片描述
    总电路图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_45710947/article/details/108326669

    版权声明:本文为CSDN博主「Who_Am_I.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_45710947/article/details/108326669

    展开全文
  • 基于MIPS的CPU设计,在此设计中实现了求平均数的功能,可以通过修改rom中的二进制程序实现其他的功能,单周期微处理器设计实验
  • 本文中将介绍一种新型嵌入式微处理器MCF5282以及由它设计出的嵌人式主模板,能够满足多种通信方式的要求,而且其处理速度和实现多通道交直流采样的精度比起上述三类芯片都要高得多,其实时性也更完美。  1 MCF5282...
  • ![图片说明](https://img-ask.csdn.net/upload/202006/10/1591773638_939050.png)
  • 实验3《单周期微处理器设计》 一、实验目的 掌握:如何采用Verilog设计时序逻辑电路; 掌握:利用Quartus II 设计CPU的基本原理核方法; 掌握:指令系统的设计与实现方法。 二、实验内容   采用Verilog设计一个...

    实验3《单周期微处理器设计》

    一、实验目的
    1. 掌握:如何采用Verilog设计时序逻辑电路;
    2. 掌握:利用Quartus II 设计CPU的基本原理核方法;
    3. 掌握:指令系统的设计与实现方法。
    二、实验内容

      采用Verilog设计一个单周期的MIPS微处理器,其测试程序为:

    # test1.asm
    # 23 October 2005 David Harris David_Harris@hmc.edu
    #
    # Test MIPS instructions.  
    
    #Assembly Code  		              	# Machine Code
    main:	addi $2, $0, 5					# 20020005
    	    addi $7, $0, 3					# 20070003
    		addi $3, $0, 0xc				# 2003000c
    	    or   $4, $7, $2      			# 00e22025
            and  $5, $3, $4     			# 00642824
            add  $5, $5, $4     			# 00a42820
       	    beq  $5, $7, end    			# 10a70008
        	slt  $6, $3, $4     			# 0064302a
            beq  $6, $0, around 			# 10c00001
            addi $5, $0, 10       			# 2005000a
    around: slt  $6, $7, $2     			# 00e2302a
            add  $7, $6, $5     			# 00c53820
            sub  $7, $7, $2     			# 00e23822
            j    end   		        		# 0800000f
            lw   $7, 0($0)      	 		# 8c070000
    end:    sw   $7, 71($2)    				# ac470047
    
    三、实验方法

      利用ModelSim SE 10.1开发工具设计并实现一个单周期的MIPS微处理器。
      参考已有代码及教程完成在本机上测试MIPS微处理器。

    四、实验步骤
    1. 阅读课程参考PPT,了解单周期MIPS处理器内部逻辑设计;
    2. 利用ModelSim进行实验操作;

    2.1 打开ModelSim工具, 选择【File】→【New】→【Project】,新建一个工程,命名simpleMIPS,用于实现程序功能。
    在这里插入图片描述
    在这里插入图片描述
    2.2 创建新工程后添加已经写好的Verilog代码,同时选择将文件复制到当前目录。
    在这里插入图片描述
    在这里插入图片描述
    2.3 将memfile.dat文件复制到当前工作目录下。
    2.4 编译当前所有文件。
    在这里插入图片描述
    在这里插入图片描述
    2.5 选择【Simulate】→【Start Simulation】,开始进行仿真测试。
    在这里插入图片描述
    2.6 选择测试文件testbench,不用选择优化,之后点击ok即可。
    在这里插入图片描述
    在这里插入图片描述
    2.7 添加相关信号,组成波形图。
    在这里插入图片描述
    2.8 将时间周期改为1ns。
    在这里插入图片描述
    2.9 点击run,进行结果测试,数据与预期结果符合,无差错。
    在这里插入图片描述

    1. 总结实验过程,完成实验报告。
    五、实验结果

      实验运行结果正确,符合预期效果,能够正常显示MIPS运行效果。
      实验输出数据及结果分析可参考第四点实验步骤内容。

    六、实验结论

      本次实验通过使用ModelSim开发工具和Verilog设计一个单周期的MIPS微处理器,之后对该程序进行测试验证,结果符合预期。

    七、实验思考
    1. 单周期微处理器的特点是什么?如何在单周期处理器中实现流水线?
      单周期微处理器的特点:
      在一个周期中执行一条完整的指令,该结构易于解释且控制单元简单,时钟周期由最慢的指令决定。

      在单周期处理器中实现流水线:
      通过将单周期处理器分解成5个流水线阶段来构成流水线处理器。
      每个阶段只需完成一个慢操作,五个阶段分别为取指令、译码、执行、存储器和写回。在“取指令”阶段,处理器从指令存储器中读取指令。在“译码”阶段,处理器从寄存器文件中读取源操作数并对指令译码以便产生控制信号。在“执行”阶段,处理器使用ALU执行计算。在“存储器”阶段,处理器读或写数据存储器。最后,在“写回”阶段,如果需要,处理器将结果写回到寄存器文件。
      这样,可以在每阶段流水线中同时执行5条指令。由于每阶段仅有整个逻辑的1/5,所以时钟频率几乎可以提高5倍。因此,虽然每条指令的延迟并未改变,但理想情况下吞吐量可以提高5倍。

    八、实验小结

       通过这次实验,我了解了微处理器的基本结构,掌握了计算机工作原理,学会了设计简单的微处理器,同时,了解了软件控制硬件工作的基本原理。
      本次主要是理解相对应的Verilog代码和测试程序,之后熟悉Modelsim工具的使用流程即可。

    展开全文
  • 本文中将介绍一种新型嵌入式微处理器MCF5282以及由它设计出的嵌人式主模板,能够满足多种通信方式的要求,而且其处理速度和实现多通道交直流采样的精度比起上述三类芯片都要高得多,其实时性也更完美。  1 MCF5282...
  • 设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx设计方案(微处理器).docx
  • 设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf设计方案(微处理器).pdf
  • 【计组实验】P4 Verilog多周期处理器系统 MIPS指令集-附件资源
  • 微处理器体系结构》-第六章 第二讲 MIPS指令编程 文章目录 《微处理器体系结构》-第六章 第二讲 MIPS指令编程 前言 一、编程 1.算术/逻辑指令 1.1 逻辑指令 1.2 移位指令 1.3 常数赋值 1.4 乘法和除法指令 2. 分支...

    《微处理器体系结构》-第六章 第二讲 MIPS指令编程



    前言

    本课程是笔者在大三学年所学的专业选修课,以此文章来记录和总结自己学习的过程,仅供诸位参考。本课教材选用美国作家

    戴维•哈里斯的《数字设计和计算机体系结构》

    课程涉及范围为本书6到8章部分内容。


    一、编程

    不必认为汇编语言编程十分困难。相反,我们已熟知的高级语言(C或Java)所涉及的抽象层次更高。本文将讲解如何将高级语言常见的算术和逻辑操作、if/else语句、for和while循环、数组下标和函数调用等常见的软件结构转换为MIPS汇编代码。

    1.算术/逻辑指令

    这类指令是实现高级语言结构的基础,MIPS定义了大量这类指令。

    1.1 逻辑指令

    MIPS逻辑操作包括了与、或、异或、或非(and、or、xor、nor)。这些R指令对两个源寄存器和一个目的寄存器进行按位操作。图中给出实例,指令执行结果存储在目的寄存器rd中。
    在这里插入图片描述

    MIPS不提供NOT指令,但 A NOR 0=NOT A,使用NOR指令代替了NOT指令的功能。
    逻辑运算有着一些其他功能,如and指令可以用于屏蔽某些位,如上例中的s2就被屏蔽了最低两个字节(即最右边的16位二进制数)后,写入了s3中。
    or指令可以用于组合两个寄存器,如0x34A80000 OR 0x00001234 = 0x34A81234,就将两个数据的高4位和低4位组合起来了。

    1.2 移位指令

    MIPS移位操作可以将寄存器中的值左移或者右移最多31位。移位操作指令有:逻辑左移指令sll,逻辑右移指令srl和算术右移指令sra,这些指令可以将操作数乘或除以2的整数次幂。
    在这里插入图片描述
    可见,sll指令是对低位补零,srl则是对高位补零,而sra则是高位补符号位。

    MIPS也提供可变以为指令,即将上述指令中的立即数换为寄存器,格式为:sllv rd,rt,rs。rt中保存待移位的值,rs则给出了位移的位数。可变逻辑指令分别是:sllv,srlv和srav。

    1.3 常数赋值

    我们可以使用addi指令将16位的常数赋值到寄存器内。

    为什么addi只能赋值16位常数?因为I类型指令的imm只有16位

    为了赋值32位常数,可以先使用一条装入高位立即数指令,将16位的立即数装入32位寄存器的高16位中,再使用ori指令将另一个16位立即数合并到该寄存器的低16位中。
    在这里插入图片描述

    1.4 乘法和除法指令

    MIPS体系结构中,两个32位数相乘,会产生一个64位乘积;两个32位数相除,产生一个32位的商和一个32位的余数。为此,MIPS体系结构中有两个用于存放乘除法计算结果的寄存器hi和lo。如 乘法指令mult 执行后,将高32位放入hi寄存器中,而低12位放入lo中; 除法指令div执行 后,将商放在lo中,余数放在hi中。

    2. 分支语句

    分支指令改变程序计数的值,跳过某段代码或返回到执行先前的代码。分支分为条件分支和无条件分支(即跳转指令)。

    2.1 条件分支

    条件分支指令会首先执行一次测试,只有当测试结果为TRUE时才会执行分支语句。MIPS指令集有两个条件分支指令:beq和bne。当两个寄存器中的值相等且使用的是beq指令时,执行分支语句;当寄存器中的值不相等且使用的是bne指令时,执行分支程序;其余情况皆不执行。

    2.2 跳转指令

    程序可以使用三种跳转指令完成无条件分支或跳转,分别是跳转指令(j),跳转和链接指令(jal)以及跳转寄存器指令(jr)。
    在j target指令后,程序会无条件执行标号target处的指令,而在跳转指令和标号之间的所有指令都会被跳过。当汇编语言转为机器语言后,原汇编语言中的标号target会转为指令地址。因此也可以使用jr(跳转寄存器指令),具体过程如示例。
    在这里插入图片描述

    3.条件语句

    if,else是高级语言中常见的条件语句。如:if (i == j) f = g+h。而在汇编语言中,程序会使用bne指令去检测i是否不等于j(与高级语言检测条件相反),这样做的目的是汇编语言是跳过中间代码执行分支而高级语言则是顺序执行。
    在这里插入图片描述

    4.循环

    for与while循环是高级程序语言常用的循环结构,以下会介绍如何将其转变为汇编语言

    4.1 while循环

    高级语言中,while指循环重复的执行一块代码,直到条件不再被满足。而在汇编语言中,while循坏的测试条件与高级语言又双叒叕相反,如果那个相反的条件为true,那么while循环便停止(常见使用beq指令进行判断)。
    在这里插入图片描述

    4.2 for循环

    与while循环类似,for循坏也是循环至某一条件不被满足,它也可以用while循环来实现。
    目前所学的bne和beq指令都是对相等或不相等进行判断,mips也存在量值比较指令slt。它是“小于设置指令”,使用格式为:slt t1,s0,t0 ;先将t1置0,当s0<t0时,slt将t1设置为1,否则t1还为0;再使用beq指令进行0或1判断,即可达到量值比较的目的。
    在这里插入图片描述

    5. 数组

    数组用于大量访问类似的数据。数组按照存储器中顺序数据地址组织,每个数组元素以下标区分。每一个数组元素是一个字,但是存储器是字节寻址,因此从基地址开始,偏移量每次增加4。汇编语言中,使用左移sll两位实现乘以4的操作。再次强调,8位二进制数是一个字节,4个字节为1个字。在这里插入图片描述

    一个完整的字所占用存储空间太大,一个范围在-128到127之间的数完全可以使用单一字节进行存储。我们常用的键盘上的按键就远远小于256,所以英语字符就可以用字节表示并进行存储。
    1963年美国标准委员会发表了用于信息交换的美国标准代码ascll。它采用16进制编码,将每个文本字符确定了唯一的字节值,常见的英文字母大小写之差0x20即32。在这里插入图片描述

    MIPS提供三个指令进行字节数据的操作,分别是装入无符号字节指令lbu,它对存储器中的字节进行0扩展来填充32位的寄存器;装入字节指令lb则是对字节进行符号扩展;存储字节指令sb将数据存储到存储器的最低有效字节中,不同于前两者是将存储器数据装入到寄存器中。
    一个字符序列,如:hello!,称为字符串。在c语言中,空字符0x00意味着字符串的结束。

    6. 函数调用

    高级程序语言经常使用函数,函数的输入和输出分别称为参数和返回值。mips系统调用函数在调用前要将4个参数分别放在a0~a3中,被调用函数在完成前将返回值放在v0~v1中。被调用函数不能影响调用函数的功能,即不能覆盖调用函数使用的体系结构状态和内存。

    6.1函数的调用和返回

    mips使用jal指令调用一个函数,使用jr指令从函数返回。示例展示了main函数如何调用simple函数,可见调用simple函数时没有输入参数,也不曾产生返回值,它仅仅返回到调用函数中。

    当一个函数调用另一个函数时,前者称为调用函数,后者称为被调用函数。 函数必须保存和恢复任何需要使用到受保护寄存器(如:s0 ~
    s7),但是可以随意改变不受保护的寄存器(如;t0 ~ t9)。

    jal指令将下一条指令的地址存储到返回地址寄存器ra中,并跳转到目标指令。

    6.2 输入参数和返回值

    根据MIPS系统惯例,程序使用a0~ a3保存输入参数,使用v0 ~ v1保存返回值;调用函数将程序参数从左到右放入输入寄存器a0~ a3中,被调用程序将返回值存储到返回寄存器v0 ~ v1中

    6.3 栈

    栈是用于存储函数中的局部变量的寄存器 ,栈会随着处理器需求而改变大小。栈是一个后进先出的队列,类似于一叠盘子,放在上面的盘子永远是最后放上去而又最先被拿走使用。需要注意的是,一叠盘子在现实中是向上堆叠的,而MIPS中栈是向下增长的,栈顶是最后分配的空间。指针是内存地址中的新名词,它指向数据,给出此数据的地址;栈指针sp就是一个特定的MIPS寄存器,它指向栈顶。
    在这里插入图片描述
    栈指针开始于一个高内存地址,栈无法访问比它低的内存中的数据。系统通过地址递减来扩展栈空间,图例中栈为了存储数据AABBCCDD和11223344,将sp减8变为0x7FFFFFF4。
    栈的应用就是为了达成之前所说的要求:被调用函数不能影响调用函数的功能,即不能覆盖调用函数使用的体系结构状态和内存。在函数修改寄存器前,它要将寄存器中的值保存在栈中,然后在返回前从栈中恢复这些寄存器。具体步骤如图例:

    在这里插入图片描述
    图例中具体分为以下步骤:
    创建栈空间来存储一个或者多个寄存器的值;将寄存器的值存储在栈中;使用寄存器执行函数;从栈中恢复寄存器的初始值;回收栈空间。
    这样,就使得在使用函数后,不会改变原寄存器中的值,避免了覆盖调用函数使用的体系结构状态和内存。

    二.寻址方式

    MIPS共有5种寻址方式:分别时寄存器寻址,立即数寻址,基地址寻址,pc相对寻址和伪直接寻址。前三种定义读写操作数模式,后两种定义写程序计数器pc的方式。

    1.寄存器寻址

    寄存器寻址使用寄存器存储所有源操作数和目的操作数。例如所有的R型指令都是寄存器寻址。

    2. 立即数寻址

    立即数寻址使用16位立即数作为其中一个源操作数,I型指令中的addi和lui指令都是立即数寻址。

    3. 基地址寻址

    存储器访问指令,如:lw和sw指令都是基地址寻址。操作数的有效地址由寄存器rs中的基地址和立即数表示的偏移量相加得到

    4. PC相对寻址

    MIPS程序中,指令一般从地址0x00400000开始存储,且每次增加4字节(因为MIPS存储器地址是字节寻址)。运行程序时,处理器从存储器中取出指令,将指令的地址放在程序计数器(PC)中,这是一个32位寄存器。
    可见,PC是对指令执行顺序做出影响,因此在条件分支指令进行分支时会使用pc相对寻址来确定新PC中的值。立即数字段中的有符号偏移量与PC值相加得到新的PC值。
    在这里插入图片描述
    beq指令对应机器码中的立即数值就是指代else分支与beq指令之间的指令个数。

    5. 伪直接寻址

    我们都听说过直接寻址,理想情况下,跳转指令j或者jal都应该使用直接寻址的方式来指明跳转目的地址(JTA)。然而目的地址是32位的,而J型指令由于必须存在6位的op,因此最高只能提供26位的立即数来表示32位的目的地址,很明显会出现装不下的情况。
    幸运的是,JTA的最低两位都0,因为MIPS为字节寻址,相邻地址总是以4为最小值进行加减。而JTA的高四位我们选择使用PC+4得到。因此我们舍弃JTA的高4位和低2位,剩下的26位存储在26位的地址字段中。
    所有的J型指令都使用伪地址寻址。


    总结

    以上介绍了如何使用MIPS的三种指令格式完成部分简单的编程操作,并说明了每种指令所属于的寻址方式。

    展开全文
  • Mips和的微处理器开发工具供应商 Lauterbach... Lauterbach的 TRACE32是一套模块化微处理器开发工具,可为嵌入式设计提供整合调试环境。TRACE32现可支持多款 MIPS Release 6 CPU,其中包括新的 M 级 M6250,这是首款
  • 随着数十亿IoT设备的投向市场以及数万亿市场份额的增长,这使得我们在决定边缘节点传感器或者智能节点的结构设计时要经过严格的考虑才能做出正确的选择。这些微型的边缘传感器不仅提供重要的数据而且我们要确保它的...
  • 嵌入式微处理器嵌入式微处理器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,657
精华内容 2,662
关键字:

mips微处理器设计