MIPS寄存器堆

这篇具有很好参考价值的文章主要介绍了MIPS寄存器堆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验目的

  • 熟悉并掌握 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,其余寄存器的值符合预期。当同时写和读,即写地址和读地址相同,且写使能时,发现读到的数据为旧数据,而写入的数据不会冲突。文章来源地址https://www.toymoban.com/news/detail-691781.html

到了这里,关于MIPS寄存器堆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机组】通用寄存器单元实验的解密与实战

    ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《机组 | 模块单元实验》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目的 🌼二、 实验内容 🌻三、 实验详情 实验1:数据输入通用寄存器 实验2:寄存器内

    2024年01月18日
    浏览(42)
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示: 其能接受的电压输入范围一般为0-3.3V(V REF- ≤ V IN ≤ V REF+ ),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。 这里用于做ADC采集的引脚使

    2024年02月15日
    浏览(51)
  • 实验四 用集成移位寄存器实现序列检测器

    一、实验要求 用移位寄存器和与非门设计一个 1101 序列检测器。电路连续不停地工作,对 串行输入的序列进行检测,当连续检测 4 个码元符合检测码 1101 时,检测器输出 为 1 ,指示灯亮,其他情况下输出为 0 ,指示灯灭。 二、实验设备 1 . Mini-FPGA 开发板( Cyclone IV 系列

    2024年02月03日
    浏览(42)
  • 实验二 CPU 部件实现之 ALU 和寄存器堆

     1.1设计要求 理解和掌握 CPU 中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用 Verilog 和 ModelSim 进行设计和仿真。 1. 使用 Verilog 完成 ALU 的设计,并编写测试仿真文件验证其正确性。要求: ALU 支持 16 位的加、减、与、或以及移位运算。 2. 使用 Veril

    2024年02月01日
    浏览(35)
  • 深度理解STM32的串口实验(寄存器)【保姆级教程】

    USART—通用同步异步收发接收器,是一个串行通信设备,可以和外部设备进行灵活的全双工数据交换,有别于USART还有一个UART(在原来的基础上裁剪掉了同步通信功能(时钟同步)),串行通信一般是以帧格式传输数据,一帧一帧的传。 协议层: 串口通信的一个数据包包含从

    2023年04月15日
    浏览(39)
  • 南京邮电大学电工电子(数电)实验报告——计数器 & 移位寄存器

    1、掌握计数器的逻辑功能及应用方法 2、掌握任意进制计数器的设计方法 3、掌握数字电路多个输出波形相位关系的正确测试方法 4、了解非均匀周期信号波形的测试方法 设计一个分频比N=5的整数分频电路,观察并记录时钟脉冲和输出波形。 选用cb4cle二进制计数器模块,采用

    2024年02月03日
    浏览(83)
  • 代码生成- 寄存器计算机

    寄存器计算机是目前最流行的机器体系结构之一。 效率很高 机器体系结构规整 机器基于寄存器架构: 典型的有16、32或更多个寄存器,所有操作都在寄存器中进行 访存都通过load/store进行,内存不能直接运算 内存,存放溢出的变量(溢出是指寄存器放不下的变量) 寄存器,

    2023年04月08日
    浏览(49)
  • STM32-串口通信波特率计算以及寄存器的配置详解

    处理器与外部设备通信的两种方式 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输 优点:占用引脚资源少 缺点:速度相对较慢 按照数据传送方向,分为: 单工 :数据传输只支持数据在一个方向上传输

    2024年02月05日
    浏览(94)
  • 计算机系统中寄存器,高速缓存,主内存之间的联系与区别

    在计算机系统中,寄存器是位于中央处理器(CPU)内部的一组高速存储单元,用于存储临时数据、指令和地址。寄存器在计算机系统中起着关键的作用,用于执行各种计算和控制操作。 计算机系统中的寄存器可以分为多个类型,每种类型具有不同的功能和用途。以下是常见的

    2024年02月09日
    浏览(34)
  • NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算

    原文:5 Computing with Register Machines 译者:飞龙 协议:CC BY-NC-SA 4.0 我的目标是表明天堂机器不是一种神圣的生命体,而是一种钟表(相信钟表有灵魂属性的人将制造者的荣耀归功于作品),因为几乎所有多种运动都是由一种最简单和物质力量引起的,就像钟表的所有运动都是由

    2024年01月20日
    浏览(102)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包