没有合适的资源?快使用搜索试试~ 我知道了~
简单4个8位存储器读写verilog实现
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 28 下载量 12 浏览量
2021-01-06
05:27:37
上传
评论 2
收藏 155KB PDF 举报
温馨提示
本文主要思路是建立一个4个8位寄存器,然后在顶层文件中对这四个寄存器写入数值,最后在四个存储器中读取数值。 其模块框图如下: 下面是verilog代码实现: (1)存储器模块 module device_regs(clk,reset,data_in,data_adr,wr_en,rd_en,read_data); input clk,reset; input wr_en, rd_en; input [7:0] data_in; input [1:0] data_adr; output [7:0] read_data; reg [7:0] reg0,reg1,reg2,reg3; wire [7
资源推荐
资源详情
资源评论
简单简单4个个8位存储器读写位存储器读写verilog实现实现
本文主要思路是建立一个4个8位寄存器,然后在顶层文件中对这四个寄存器写入数值,最后在四个存储器中读取数值。
其模块框图如下:
下面是verilog代码实现:
(1)存储器模块
module device_regs(clk,reset,data_in,data_adr,wr_en,rd_en,read_data);
input clk,reset;
input wr_en, rd_en;
input [7:0] data_in;
input [1:0] data_adr;
output [7:0] read_data;
reg [7:0] reg0,reg1,reg2,reg3;
wire [7:0] reg0_nxt,reg1_nxt,reg2_nxt,reg3_nxt;
reg[7:0] read_data,read_data_nxt;
wire reg_match0,reg_match1,reg_match2,reg_match3;
assign reg_match0 = (data_adr == 2'b00);
assign reg_match1 = (data_adr == 2'b01);
assign reg_match2 = (data_adr == 2'b10);
assign reg_match3 = (data_adr == 2'b11);
assign reg0_nxt = (reg_match0&&wr_en)? data_in:reg0;
assign reg1_nxt = (reg_match0&&wr_en)? data_in:reg1;
assign reg2_nxt = (reg_match0&&wr_en)? data_in:reg2;
assign reg3_nxt = (reg_match0&&wr_en)? data_in:reg3;
always@(posedge clk or negedge reset)begin
if(!reset)begin
reg0 <= 'd0;
reg1 <= 'd0;
reg2 <= 'd0;
reg3 <= 'd0;
read_data <= 4'b0000;
end
else begin
reg0 <= reg0_nxt;
reg1 <= reg1_nxt;
reg2 <= reg2_nxt;
reg3 <= reg3_nxt;
read_data <= read_data_nxt;
end
end
always@(*) begin
read_data_nxt = read_data;
if(rd_en)begin
case(1'b1)
reg_match0:read_data_nxt = reg0;
reg_match1:read_data_nxt = reg1;
reg_match2:read_data_nxt = reg2;
reg_match3:read_data_nxt = reg3;
endcase
end
end
endmodule
(2)测试文件,包括读写任务
`timescale 1ns/1ns
module testbench_top();
reg[1:0] address_tb;
reg[7:0] wrdata_tb;
wire[7:0] rddata_tb;
reg wr_en_tb,rd_en_tb;
reg clk_tb;
reg reset_tb;
parameter CLKTB_HALF_PERIOD = 5;
parameter RST_DEASSERT_DELAY = 100;
parameter REG0_OFFSET = 2'b00,
REG1_OFFSET = 2'b01,
REG2_OFFSET = 2'b10,
REG3_OFFSET = 2'b11;
initial begin
clk_tb = 0;
forever #CLKTB_HALF_PERIOD clk_tb = ~clk_tb;
end
//generate clk
initial begin
reset_tb = 1'b0;
#RST_DEASSERT_DELAY reset_tb= 1'b1;
end
//generate reset
initial begin
address_tb = 2'b00;
wrdata_tb = 'h0;
wr_en_tb = 1'b0;
rd_en_tb = 1'b0;
end
//initialize varible
device_regs device_regs_tb
(.clk(clk_tb),
.reset(reset_tb),
.data_in(wrdata_tb),
.data_adr(address_tb),
.wr_en(wr_en_tb),
资源评论
- Thecodingmonkey2022-11-24资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
- 想清楚讲明白2023-11-07感谢资源主分享的资源解决了我当下的问题,非常有用的资源。
- m0_741275942024-01-05资源不错,很实用,内容全面,介绍详细,很好用,谢谢分享。
- m0_641228302022-12-19实在是宝藏资源、宝藏分享者!感谢大佬~
weixin_38687968
- 粉丝: 7
- 资源: 969
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功