首页 > 其他分享 >MIPS寄存器堆

MIPS寄存器堆

时间:2023-09-03 14:55:17浏览次数:45  
标签:ADDR WIDTH 寄存器 MIPS BIT DATA REG

实验目的

  • 熟悉并掌握 MIPS 计算机中寄存器堆的原理和设计方法
  • 理解源操作数/目的操作数的概念

实验环境

  • Vivado 集成开发环境

MIPS寄存器

  • 寄存器R0的值恒为0

模块接口设计

1个写端口和2个读端口

名称 宽度 方向 描述
clk 1 IN 时钟信号
raddr1 5 IN 寄存器堆读地址1
rdata1 32 OUT 寄存器堆返回数据1
raddr2 5 IN 寄存器堆读地址2
rdata2 32 OUT 寄存器堆返回数据2
we 1 IN 寄存器堆写使能
waddr 5 IN 寄存器堆写地址
wdata 32 IN 寄存器堆写数据

寄存器堆(regfile)实现了32个32位通用寄存器。

  • 可以同时进行两个寄存器的读操作和一个寄存器的写操作。
  • 写:写使能信号(we)为1时写有效,为0时无效。(write enable
  • 读:读操作可以同时读两个寄存器。
  • 同时对同一个寄存器进行读写时,读的数据为旧的数据。
  • 读写均为同步。
  • 0号寄存器恒为0。

设计代码

`define REG_DATA_WIDTH 31:0
`define REG_NUM 31:0
`define REG_ADDR_WIDTH 4:0
`define REG_ADDR_BIT 5 // 地址线宽
`define REG_DATA_BIT 32 // 数据线宽
module regfile(
    input clk,
    input [`REG_ADDR_WIDTH] raddr1,
    input [`REG_ADDR_WIDTH] raddr2,
    input we, // 写使能
    input [`REG_ADDR_WIDTH] waddr, // 写地址
    input [`REG_DATA_WIDTH] wdata, // 写数据
    output reg [`REG_DATA_WIDTH] rdata1,
    output reg [`REG_DATA_WIDTH] rdata2
    );
    
    // 数组表示寄存器堆
    reg [`REG_DATA_WIDTH] mips_regfile [`REG_NUM];
    
    // 读1
    always @(posedge clk) begin
        if (raddr1 == {`REG_ADDR_BIT{1'b0}}) begin
            rdata1 <= {`REG_DATA_BIT{1'b0}};
        end
        else begin
            rdata1 <= mips_regfile[raddr1];
        end
    end
    // 读2
    always @(posedge clk) begin
        if (raddr2 == {`REG_ADDR_BIT{1'b0}}) begin
            rdata2 <= {`REG_DATA_BIT{1'b0}};
        end
        else begin
            rdata2 <= mips_regfile[raddr2];
        end
    end
    // 写
    always @(posedge clk) begin
        if (we == 1'b1 ) begin
            if (waddr == {`REG_ADDR_BIT{1'b0}}) begin
                mips_regfile[0] <= {`REG_DATA_BIT{1'b0}};
            end
            else begin
                mips_regfile[waddr] <= wdata;       
            end
        end
        else begin
            mips_regfile[0] <= {`REG_DATA_BIT{1'b0}};
        end
    end
    
endmodule

测试

测试代码

`timescale 1ns / 1ps

`define REG_DATA_WIDTH 31:0
`define REG_NUM 31:0
`define REG_ADDR_WIDTH 4:0
`define REG_ADDR_BIT 5
`define REG_DATA_BIT 32
module sim();
    reg clk;
    reg [`REG_ADDR_WIDTH] raddr1;
    reg [`REG_ADDR_WIDTH] raddr2;
    reg we; // 写使能
    reg [`REG_ADDR_WIDTH] waddr; // 写地址
    reg [`REG_DATA_WIDTH] wdata; // 写数据
    wire [`REG_DATA_WIDTH] rdata1;
    wire [`REG_DATA_WIDTH] rdata2;
    
    integer i;
    regfile u0 (
        .clk(clk),
        .raddr1(raddr1),
        .raddr2(raddr2),
        .we(we),
        .waddr(waddr),
        .wdata(wdata),
        .rdata1(rdata1),
        .rdata2(rdata2)
    );
    initial begin
        clk = 1;
        forever begin
            #10 clk = ~clk;
        end
    end
    
    initial begin
        raddr1 = `REG_ADDR_BIT'd0;
        raddr2 = `REG_ADDR_BIT'd0;
        we = 1'b0;
        waddr = `REG_ADDR_BIT'd0;
        wdata = `REG_DATA_BIT'd0;
        
        // 写数据
        #100 
        we = 1'b1;
        wdata = `REG_DATA_BIT'hFF;
        for (i = 0; i < `REG_DATA_BIT; i = i + 1) begin
            waddr = i;
            wdata = wdata + `REG_DATA_BIT'h100;
            #20;
        end
        // 读数据
        we = 1'b0;
        
        for (i = 0; i < `REG_DATA_BIT; i = i + 1) begin
            raddr1 = i;
            raddr2 = `REG_DATA_BIT - raddr1 - 1;
            #20;
        end
        
        // 读写相同
        // 读到的数据是旧数据
        we = 1'b1;
        wdata = `REG_DATA_BIT'h100;
        for (i = 0; i < `REG_DATA_BIT; i = i + 1) begin
            raddr1 = i;
            raddr2 = i;
            waddr = i;
            wdata = wdata - `REG_DATA_BIT'h1;
            #20;
        end
        
        we = 1'b0;
        #100 $finish;
        
    end
endmodule

测试波形

写数据:

从 0号寄存器开始到 31号寄存器,分别写入 01ff到 20ff。

读数据:

读地址 1和读地址 2分别读寄存器值,0号寄存器读得值为 0。其余寄存器读值正确。

结果分析

先进行写数据测试,从 0号寄存器开始到 31号寄存器,分别写入 01ff20ff。然后进行读数据测试,发现 0号寄存器值为 0,其余寄存器的值符合预期。当同时写和读,即写地址和读地址相同,且写使能时,发现读到的数据为旧数据,而写入的数据不会冲突。

标签:ADDR,WIDTH,寄存器,MIPS,BIT,DATA,REG
From: https://www.cnblogs.com/Az1r/p/17674985.html

相关文章

  • MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数
    原文连接浮点数保存的字节格式如下:地址+0+1+2+3内容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM这里S代表符号位,1是负,0是正E偏移127的幂,二进制阶码=(EEEEEEEE)-127。M24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效位数,提高了精......
  • arm用户态寄存器
    常用的arm用户态寄存器如上表所示,有r0~r15这16个寄存器r0~r3:通常在函数传参时使用(从左到右的顺序,大于4个参数时使用栈来传递)和返回值(r0通常被用作返回值)。在函数内部r0-r3也可以用来存储局部变量。r4~r8,r10,r11:通常用来保存局部变量。r11通常用来作为(FP)栈基地址(下面会对这些......
  • 设备驱动-14.userspace进行IP的寄存器读写
    1定义寄存器以键盘keyscan为例,定义一个IP寄存器描述头文件,IOCRREG,IOCWREG定义了两个ioctl命令,用来读写寄存器。structmsg用来存放寄存器地址和值。/*Keyscanregister:addr+offset+mask*/#definekeyscan_top_keyscan_config1 0x0#definekeyscan_top_keyscan_......
  • Linux 内核设备驱动程序的IO寄存器访问 (上)
    Linux内核提供了一套可缓存的设备IO寄存器访问机制,即regmap。regmap机制支持以统一的接口,访问多种不同类型的设备IO寄存器,如内存映射的设备IO寄存器,和需要通过I2C、I3C、SPI、AC97和SLIMBUS等总线访问的设备寄存器等。内存映射设备IO寄存器和I2C总线是嵌入式系统......
  • [C#] 使用HslCommunication访问乐创寄存器#MULTIPROG EXPRESS
    使用MULTIPROGEXPRESS软件打开乐创工程后,在变量声明中可看到变量及其分配的Modbus地址 乐创寄存器   施耐德寄存器   %IX100.0 输入寄存器,地址100,bit0BOOL类型长度为Bit1  MW100 保持寄存器,地址100  %ID100 输入寄存器,地址100  MX100......
  • 寄存器与内存在CPU计算中的作用
    cpu的计算是在内存上做的吗?计算过程中的数据存储在内存中,但CPU执行计算的过程是在寄存器中进行的,而不是直接在内存上进行。当需要使用内存中的数据时,CPU会将数据加载到寄存器中进行操作,并将结果存回内存。这样可以加快计算的速度,因为寄存器是位于CPU内部,速度比内存更快。然而,寄存......
  • 关于UVM寄存器模型的理解
    UVM中的RAL寄存器模型的意义:让开发者能够方便,快速地配置dut的寄存器。RAL寄存器模型的实质:仍然是UVM中的一个类,但不是作为组件,而是和sequence一样,在basetest中被实例化和使用。本质上,RAL模型与DUT的通信还是依赖于agent的,其顺序是RAL模型通过发起sequence,信息经过adapter转换,给......
  • 高级定时器寄存器
    TIMx_CR1TIM1&TIM8controlregister1TIM1和TIM8控制寄存器1TIMx_CR2TIM1&TIM8controlregister2TIM1和TIM8控制寄存器2TIMx_SMCRTIM1&TIM8slavemodecontrolregisterTIM1和TIM8从模式控制寄存器TIMx_DIERTIM1&TIM8DMA/interruptenablereg......
  • EXTI寄存器
     SYSCFGexternalinterruptconfigurationregister1SYSCFG_EXTICR1EXTI中断0,1,2,3引脚选择 EXTIx[3:0]:EXTIxconfiguration(x=0to3)0000:PA[x]pin0001:PB[x]pin0010:PC[x]pin0011:PD[x]pin0100:PE[x]pin0101:Reserved0110:Rese......
  • GIC入门(二):寄存器组成,配置和中断处理
    1.寄存器组成GIC寄存器分为以下三组:GIC_DistributorGIC_RedistributorCPUInterfaceGIC_D&GIC_R两组寄存器用于配置中断,CPUInterface用于处理中断。GICD_*:distributor寄存器是memory-mapped,即占用地址空间,寄存器功能主要有:为SPI中断设置优先级级别,路由SPI将其分配至不......