Vivado MIPS寄存器堆(含测试代码)

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

本篇文章使用Verilog语言编写实现带有优先级的83译码器,含有设计代码和测试代码。

一、

寄存器堆regfile模块实现了32个32位通用寄存器。可以同时进行两个寄存器的读操作一个寄存器的写操作。写操作是同步写,写使能信号(we)为1时有效,为0时无效;读操作可以在任意时刻进行读操作。
(1)当复位信号有效(rst为1)时,读数据(rdata1和rdata2)为0
(2)否则当复位信号无效(rst为0)时,当读地址为0,读数据为0
(3)否则当读写地址相等,且读写使能都有效的时候,读数据为写数据
(4)否则当读使能有效时,读数据为寄存器堆中存储数据
(5)其余情况,读数据为0

接口描述表如下:

接口名 宽度 输入/输出
rst 1 输入
clk 1 输入
waddr 5 输入
wdata 32 输入
we 1 输入
raddr1 5 输入
re1 1 输入
rdata2 32 输出
raddr2 5 输入
re2 1 输入
rdata2 32 输出

二、宏定义文件

将宏定义文件(此处为define.v)右键设置为global include文件,即可在其他文件中进行引用。

`define RegAddrBus 4:0
`define RegDataBus 31:0
`define RegNum 31:0
`define RstEnable 1
`define RstDisable 0
`define ZeroWord 0
`define ReadEnable 1
`define WriteEnable 1
三、设计代码
`timescale 1ns / 1ps
`include "define.v"
module regfile(
    input wire clk,
    input wire rst,
    input wire [`RegAddrBus] waddr,
    input wire [`RegDataBus] wdata,
    input wire we,
    input wire [`RegAddrBus] raddr1,
    input wire re1,
    output reg [`RegDataBus] rdata1,
    input wire [`RegAddrBus] raddr2,
    input wire re2,
    output reg [`RegDataBus] rdata2
    );   
    reg [`RegDataBus] reg1[`RegNum];

    always@(*)begin
    //复位信号为0,写信号为1,当前地址不为0时,数据写入寄存器
        if(rst==`RstDisable)begin
            if((we==`WriteEnable)&&(waddr!=0))begin
                reg1[waddr]<=wdata;
            end
        end
    end    
    //读rdata1
    always@(*)begin
        if(rst==`RstEnable)begin
            //复位信号有效时,读数据为0
            rdata1<=`ZeroWord;
        end
        //复位信号无效时
        //读信号为1,读地址为0时,读数据为0
        else if((re1==`ReadEnable)&&(raddr1==0))begin
            rdata1<=`ZeroWord;
        end
        //读信号为1,写信号为1,读地址=写地址
        else if((re1==`ReadEnable)&&(we==`WriteEnable)&&(raddr1==waddr))begin
            rdata1<=wdata;
        end
        else if(re1==`ReadEnable) begin
            rdata1<=reg1[raddr1];
        end
        //其余情况下,读数据为0
        else begin
        rdata1<=`ZeroWord;
        end
    end
    //读rdata2
    always@(*)begin
        if(rst==`RstEnable)begin
            rdata2<=`ZeroWord;
        end
        else if((re2==`ReadEnable)&&(raddr2==0))begin
            rdata2<=`ZeroWord;
        end
        else if((re2==`ReadEnable)&&(we==`WriteEnable)&&(raddr2==waddr))begin
            rdata2<=wdata;
        end
        else if(re2==`ReadEnable) begin
            rdata2<=reg1[raddr2];
        end
        else begin
        rdata2<=`ZeroWord;
        end
    end
endmodule
四、测试代码
`timescale 1ns / 1ps
module regfile_tb();
    reg clk;
    reg rst;
    reg [`RegAddrBus] waddr;
    reg [`RegDataBus] wdata;
    reg we;
    reg [`RegAddrBus] raddr1;
    reg re1;
    wire [`RegDataBus] rdata1;
    reg [`RegAddrBus] raddr2;
    reg re2;
    wire [`RegDataBus] rdata2;
    regfile regfile0(rst,clk,waddr,wdata,we,raddr1,re1,rdata1,raddr2,re2,rdata2);
    integer i;
    initial begin
        clk=1;
        forever begin
            #10 clk=~clk;
        end
    end    
    //若把写和读放在两个initial中,存在并列的问题
    initial begin
        rst=0;
        #10
        rst=1;
        #30
        rst=0;
        #30
        //写使能有效,写数据有效
        we=1;
        wdata=32'h1234;
        for(i=0;i<=31;i=i+1)begin
            waddr=i;
            wdata=wdata+32'h1111;
            #30;
        end
        //写无效,读有效
        we=0;
        re1=1;
        re2=1;
        for(i=0;i<=31;i=i+1)begin
            raddr1=i;
            raddr2=31-i;
            #30;
        end
        //读写地址相等
        we=1;
        wdata=32'h5678;
        for(i=0;i<=31;i=i+1)begin
            waddr=i;
            raddr1=i;
            raddr2=i;
            #30;
            wdata=wdata+32'h0101;
        end
        //恢复0
        re1=0;
        re2=0;
        we=0;
        #100 $finish;
    end
endmodule
五、仿真波形图

Vivado MIPS寄存器堆(含测试代码)

仅供学习交流,如发现错误,欢迎大家指正。文章来源地址https://www.toymoban.com/news/detail-475002.html

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

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

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

相关文章

  • IC验证-寄存器专项测试

    关键点:对粘连的理解和验证 DUT初始化后,读取寄存器值,判断读取的值是否等于设计时所配置的初始值,不等则证明寄存器有错。 通常,对一个寄存器进行赋值,不会影响到其他寄存器值,但是当发生寄存器之间的粘连时,寄存器之间就不再有独立性,对其中某个寄存器

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

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

    2023年04月08日
    浏览(40)
  • 【ARM Coresight 系列文章 10.3 - ARM Coresight STM 寄存器介绍 及STM DMA 传输介绍】

    上篇文章:ARM Coresight 系列文章 10.2 - ARM Coresight STM Trace packets STM 的寄存器主要可以分为以下几类: STM DMA 相关的; STM HW Trigger 相关的; 系统控制及状态寄存器; 只读寄存器。 STM DMA 相关的寄存器

    2024年02月15日
    浏览(31)
  • 【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

    移位寄存器 :指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。 反馈移位寄存器(Feedback Shift Register,FSR) :每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就

    2024年02月15日
    浏览(40)
  • (超详细)STM32芯片Flash读写操作讲解和代码(寄存器版本)

    关于Flash,官方的解释为:Flash为32位宽的存储单元,可用于存储代码和数据常量。Flash模块位于微控制器内存映射中的特定基址……。而对于我们来说,只要知道Flash闪存区是一个掉电后也不会清除的数据存储地。(相信大家对于Flash闪存也有着一定 的了解了,我也不多说废话

    2023年04月19日
    浏览(36)
  • 【IC前端虚拟项目】MVU寄存器文档编写与RTL代码生成

    【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 兜兜转转又回到了寄存器,但是没有办法,虚拟项目肯定要贴近真实真实项目的,而一个真实项目里不管是做模块设计还是SOC设计,寄存器总是难以避免的。关于寄存器的生成使用和验证,有一个专栏

    2024年01月18日
    浏览(46)
  • 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信  2.1 串口简要模式图  2.2 相关寄存器 (1)PCON、SCON、SBUF (2)IE、IPH、IP (3)配置T1定时器 2.3 波特率和系统时钟和TH1和TL1计算  3.串口通信简单收发使用代码   3.1 在STC-isp使用端口助手,从单片机发送字节  3.2 通过端口助手利用主

    2024年02月05日
    浏览(36)
  • IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

    目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 ccode_standard /scripts/bin/ccode_standard 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路径(可以为脚本所在路径的任意相对路径) help 脚本使用帮助,打印说明信息 2 all 运行脚本后,脚本会解析

    2024年01月18日
    浏览(31)
  • 【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

    目录 前言: 一、中断优先级设置 二、中断相关寄存器(STM32-Cortex M3) 三、临界段代码保护 四、任务调度器的挂起和恢复 总结: 博客笔记根据正点原子视频教程编辑,仅供学习交流使用! ①中断概念回顾 让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中

    2024年02月10日
    浏览(37)
  • 【汇编中的寄存器分类与不同寄存器的用途】

    寄存器分类 在计算机体系结构中,8086CPU,寄存器可以分为以下几类: 1. 通用寄存器: 通用寄存器是用于存储数据和执行算术运算的寄存器。在 x86 架构中,这些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分别作为累加器(accumulat

    2024年02月09日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包