MIPS有个32寄存器,每个寄存器32位
由display编写可知input_sel控制输入情况
input_sel=
00:读地址1,01:读地址2
10:写地址,11写数据
读寄存器不需要时钟控制,但写寄存器需时钟控制。
声明模块的时候,输入一定是wire型变量,输出可以是wire也可以是reg

目录

  • regfilg.v
  • regfile_display
  • tb.v

regfilg.v

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/10/05 15:22:20
// Design Name:
// Module Name: regfile
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module regfile(input clk,input wen,//写使能input  [4 :0] raddr1,//读操作input  [4 :0] raddr2,output reg[31:0] rdata1,output reg[31:0] rdata2,input  [4 :0] waddr,//写操作input  [31:0] wdata,input [4 :0] test_addr,output reg[31:0] test_data);//实验要求,读寄存器不需要时钟控制,写需要
reg [31:0] memory[31:0];
integer i;
initial beginfor(i=0;i<=31;i=i+1)beginmemory[i]=0;end
end
always@(*)
beginrdata1<=memory[raddr1];
end
always@(*)beginrdata2<=memory[raddr2]; end
always@(*)
begintest_data<=memory[test_addr];
endalways@(posedge clk)beginif(wen==1)beginmemory[waddr]<=wdata;end endendmodule

regfile_display

//*************************************************************************
//   > 文件名: regfile_display.v
//   > 描述  :寄存器堆显示模块,调用FPGA板上的IO接口和触摸屏
//   > 作者  : LOONGSON
//   > 日期  : 2016-04-14
//*************************************************************************
module regfile_display(//时钟与复位信号input clk,input resetn,    //后缀"n"代表低电平有效//拨码开关,用于产生写使能和选择输入数input wen,input [1:0] input_sel,//led灯,用于指示写使能信号,和正在输入什么数据output led_wen,output led_waddr,    //指示输入写地址output led_wdata,    //指示输入写数据output led_raddr1,   //指示输入读地址1output led_raddr2,   //指示输入读地址2//触摸屏相关接口,不需要更改output lcd_rst,output lcd_cs,output lcd_rs,output lcd_wr,output lcd_rd,inout[15:0] lcd_data_io,output lcd_bl_ctr,inout ct_int,inout ct_sda,output ct_scl,output ct_rstn
);
//-----{LED显示}beginassign led_wen    = wen;assign led_raddr1 = (input_sel==2'd0);assign led_raddr2 = (input_sel==2'd1);assign led_waddr  = (input_sel==2'd2);assign led_wdata  = (input_sel==2'd3);
//-----{LED显示}end//-----{调用寄存器堆模块}begin//寄存器堆多增加一个读端口,用于在触摸屏上显示32个寄存器值wire [31:0] test_data;  wire [4 :0] test_addr;reg  [4 :0] raddr1;reg  [4 :0] raddr2;reg  [4 :0] waddr;reg  [31:0] wdata;wire [31:0] rdata1;wire [31:0] rdata2;regfile rf_module(.clk   (clk   ),.wen   (wen   ),.raddr1(raddr1),.raddr2(raddr2),.waddr (waddr ),.wdata (wdata ),.rdata1(rdata1),.rdata2(rdata2),.test_addr(test_addr),.test_data(test_data));
//-----{调用寄存器堆模块}end//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改reg         display_valid;reg  [39:0] display_name;reg  [31:0] display_value;wire [5 :0] display_number;wire        input_valid;wire [31:0] input_value;lcd_module lcd_module(.clk            (clk           ),   //10Mhz.resetn         (resetn        ),//调用触摸屏的接口.display_valid  (display_valid ),.display_name   (display_name  ),.display_value  (display_value ),.display_number (display_number),.input_valid    (input_valid   ),.input_value    (input_value   ),//lcd触摸屏相关接口,不需要更改.lcd_rst        (lcd_rst       ),.lcd_cs         (lcd_cs        ),.lcd_rs         (lcd_rs        ),.lcd_wr         (lcd_wr        ),.lcd_rd         (lcd_rd        ),.lcd_data_io    (lcd_data_io   ),.lcd_bl_ctr     (lcd_bl_ctr    ),.ct_int         (ct_int        ),.ct_sda         (ct_sda        ),.ct_scl         (ct_scl        ),.ct_rstn        (ct_rstn       ));
//-----{实例化触摸屏}end//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块//32个寄存器显示在7~38号的显示块,故读地址为(display_number-1)assign test_addr = display_number-5'd7; //当input_sel为2'b00时,表示输入数为读地址1,即raddr1always @(posedge clk)beginif (!resetn)beginraddr1 <= 5'd0;endelse if (input_valid &&  input_sel==2'd0)beginraddr1 <= input_value[4:0];endend//当input_sel为2'b01时,表示输入数为读地址2,即raddr2always @(posedge clk)beginif (!resetn)beginraddr2 <= 5'd0;endelse if (input_valid && input_sel==2'd1)beginraddr2 <= input_value[4:0];endend//当input_sel为2'b10时,表示输入数为写地址,即waddralways @(posedge clk)beginif (!resetn)beginwaddr  <= 5'd0;endelse if (input_valid && input_sel==2'd2)beginwaddr  <= input_value[4:0];endend//当input_sel为2'b11时,表示输入数为写数据,即wdataalways @(posedge clk)beginif (!resetn)beginwdata  <= 32'd0;endelse if (input_valid && input_sel==2'd3)beginwdata  <= input_value;     endend
//-----{从触摸屏获取输入}end//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,always @(posedge clk)beginif (display_number >6'd6 && display_number <6'd39 )begin //块号7~38显示32个通用寄存器的值display_valid <= 1'b1;display_name[39:16] <= "REG";display_name[15: 8] <= {4'b0011,3'b000,test_addr[4]};display_name[7 : 0] <= {4'b0011,test_addr[3:0]}; display_value       <= test_data;endelsebegincase(display_number)6'd1 : //显示读端口1的地址begindisplay_valid <= 1'b1;display_name  <= "RADD1";display_value <= raddr1;end6'd2 : //显示读端口1读出的数据begindisplay_valid <= 1'b1;display_name  <= "RDAT1";display_value <= rdata1;end6'd3 : //显示读端口2的地址begindisplay_valid <= 1'b1;display_name  <= "RADD2";display_value <= raddr2;end6'd4 : //显示读端口2读出的数据begindisplay_valid <= 1'b1;display_name  <= "RDAT2";display_value <= rdata2;end6'd5 : //显示写端口的地址begindisplay_valid <= 1'b1;display_name  <= "WADDR";display_value <= waddr;end6'd6 : //显示写端口写入的数据begindisplay_valid <= 1'b1;display_name  <= "WDATA";display_value <= wdata;enddefault :begindisplay_valid <= 1'b0;display_name  <= 40'd0;display_value <= 32'd0;endendcaseendend
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule

tb.v

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/10/05 22:19:41
// Design Name:
// Module Name: tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module tb;//inputsreg clk;reg wen;//写使能reg  [4 :0] raddr1;//读操作,读地址reg  [4 :0] raddr2;reg  [4 :0] waddr;reg  [31:0] wdata;reg  [4 :0] test_addr;//outputswire [31:0] rdata1;//读出数据wire [31:0] rdata2;    wire  [31:0] test_data;regfile uut (//调用regfile模块,自定义名字uut.clk   (clk   ),.wen   (wen   ),.raddr1(raddr1),.raddr2(raddr2),.waddr (waddr ),.wdata (wdata ),.rdata1(rdata1),.rdata2(rdata2),.test_addr(test_addr),.test_data(test_data));initial beginclk = 0;wen=0;raddr1=0;raddr2=0;waddr=0;wdata=0;test_addr=0;#100;wen=1;waddr=1'H1;wdata=32'H00001111;#200;wen=0;raddr1=1'H1;#400;endalways #5 clk = ~clk;endmodule

计算机组成原理——寄存器堆相关推荐

  1. 杭电 2016 计算机组成原理,杭电计算机组成原理寄存器堆设计实验4.doc

    杭州电子科技大学计算机学院 实验报告 课程名称:计算机组成原理 实验项目:寄存器堆设计实验 指导教师 实验位置: 姓 班 级: 学 号: 日 期:2015年5月7日 实验目的学习和使用Verlilog ...

  2. 计算机组成原理寄存器的实验原理,计算机组成原理实验报告_寄存器的原理及操作课案.docx...

    <计算机组成原理实验报告_寄存器的原理及操作课案.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机组成原理实验报告_寄存器的原理及操作课案.d ...

  3. 计算机组成原理 寄存器实验详解(含工程文件)

    寄存器实验 实验要求 分析 设计 具体实现 (一)验证寄存器写操作 (二)验证寄存器读操作 (三)移位操作 (四)循环移位操作 思考问题 寄存器实验 先放一张 Proteus 总体仿真图,设计过程还是 ...

  4. 寄存器堆计算机组成实验,《计算机组成原理》实验报告——寄存器堆

    资料简介 南通大学信息科学技术学院 <计算机组成实验> 实验报告 实验名称 寄存器堆的设计与实现 班级 物联网工程 192 学生姓名 谢焘 学号 1930110689 指导教师 成耀 日 ...

  5. 计算机组成原理实验——寄存器堆实现

    这次要做的是用Verilog代码写一个寄存器堆,此寄存器堆共有32个寄存器,每个寄存器可存储32个二进制位.要求有一个写端口,两个读端口,本次实验设计为异步读同步写的寄存器堆,即读寄存器不需要时钟控制 ...

  6. 计算机组成原理R0bus是什么,计算机组成原理实验 堆栈寄存器实验

    计算机组成原理实验报告 实验三:堆栈寄存器实验 一. 实验目的 1.熟悉堆栈概念. 2.熟悉堆栈寄存器的组成和硬件电路. 二.实验要求 完成3个对战寄存器的数据写入与读出. 三.实验原理 由三片8为字 ...

  7. 计算机组成原理swbus,计算机组成原理实验 2.1 总线与寄存器 赖晓铮.ppt

    文档介绍: 计算机组成原理实验系列一.总线与寄存器二.进位加法器三.比较器(仲裁器)四.计数器五.运算器六.存储器七.时序发生器八.微程序控制器九.硬布线控制器赖晓铮博士华南理工大学******@sc ...

  8. 计算机组成原理指令系统的设计,计算机组成原理课程设计-指令系统及专用寄存器设计...

    东北大学秦皇岛分校东北大学秦皇岛分校 计算机与通信工程学院计算机与通信工程学院 计算机组成原理计算机组成原理课程设计课程设计 指令系统及专用寄存器设计指令系统及专用寄存器设计 专业名称 计 算 机 科 ...

  9. 计算机组成原理实验写入怎么,计算机组成原理实验报告_寄存器的原理及操作...

    <计算机组成原理实验报告_寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告_寄存器的原理及操作(10页珍藏版)>请在人人文库网上搜索. 1.成绩:实 ...

最新文章

  1. [CentOS] CentOS 使用yum安装 php,mysql, apache
  2. Windows SDK 非模态对话框的消息处理
  3. os.popen read()报编码错误_偶遇OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
  4. HTML 5入门学习,源码中全部使用HTML 5标签
  5. OpenCV+yolov2-tiny实现目标检测(C++)
  6. Some Essential JavaScript Questions And Answers(5)
  7. bash shell数组模拟队列queue和shell数组使用技巧
  8. lisp语言画阿基米德线_中国油画艺术表达着艺术家思想情感,而且展现了油画语言独特之美...
  9. oracle11gasm,oracle11gASM管理
  10. 一朵云重50万公斤,为什么掉不下来?
  11. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据...
  12. DALSA相机平场校正步骤
  13. Python数据处理(一):处理 JSON、XML、CSV 三种格式数据
  14. 关于MSDTC - 与基础事务管理器的通信失败 错误解决的小备忘
  15. 文本文档html乱码,文本文档乱码怎么办?电脑文本文档乱码解决方法
  16. 第一个动态网页——留言板
  17. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)
  18. Android6.0 Qualcomm Atheros QCA6174A WiFi Model Support
  19. 流程图、数据关系绘图神器yEd
  20. 黄河小浪底调水调沙问题(mathmatica)

热门文章

  1. trans-resistor(转换电阻),后来缩写为transistor,中文译名就是晶体管。trans词根.变形金刚,变压器都是transformers
  2. 上接星辰,下抵炊烟:一颗中国AI定海针的故事
  3. NWT内斗纪录:管理的两个荒唐错误
  4. 记录一下Mac查看以‘.’点开头的文件夹
  5. floyd算法:我们真的明白floyd吗?
  6. 如何让Typora做出Word、Pdf的感觉
  7. HUAWEI+Eudemon1000E+防火墙+典型配置案例
  8. 阿里云解决方案架构师张平:云原生数字化安全生产的体系建设
  9. AD域角色转换:将辅域控制器升级为主域控制器
  10. ssh连接远程服务器自动输入密码