设计32位RAM存储器 该模块的信号名称功能说明 addr 32位地址总线,用于传送地址,以便按地址访问存储单元。 data_in 32位数据输入总线 data_out32位数据输出总线 clk 时钟信号,上升沿有效 MemWrEn 写使能信号。当MemWrEn为0时,数据从addr地址端口指定的内存单元读出。当MemWrEn为1时,配合clk时钟信号工作,在clk上升沿,数据存入由addr地址端口指定的内存单元。写出verilog的源文件和激励文件
时间: 2023-12-10 14:39:58 浏览: 96
下面是32位RAM存储器的Verilog代码:
```
module RAM(
input [31:0] addr,
input [31:0] data_in,
output reg [31:0] data_out,
input clk,
input MemWrEn
);
reg [31:0] memory [0:((1<<32)-1)];
always @(posedge clk) begin
if(MemWrEn == 1'b1) begin
memory[addr] <= data_in;
end
end
assign data_out = (MemWrEn == 1'b0) ? memory[addr] : 32'b0;
endmodule
```
下面是32位RAM存储器的激励文件:
```
`timescale 1ns/1ns
module RAM_tb;
reg [31:0] addr;
reg [31:0] data_in;
wire [31:0] data_out;
reg clk;
reg MemWrEn;
RAM dut(
.addr(addr),
.data_in(data_in),
.data_out(data_out),
.clk(clk),
.MemWrEn(MemWrEn)
);
initial begin
clk = 0;
MemWrEn = 0;
#10 addr = 32'h00000000; data_in = 32'h11223344; MemWrEn = 1; // Write to address 0
#10 addr = 32'h00000004; data_in = 32'h55667788; MemWrEn = 1; // Write to address 4
#10 addr = 32'h00000008; data_in = 32'h99aabbcc; MemWrEn = 1; // Write to address 8
#10 addr = 32'h00000000; MemWrEn = 0; // Read from address 0
#10 addr = 32'h00000004; MemWrEn = 0; // Read from address 4
#10 addr = 32'h00000008; MemWrEn = 0; // Read from address 8
#10 $finish;
end
always #5 clk <= ~clk;
endmodule
```
在这个激励文件中,我们首先写入了三个不同的数据到地址0x00000000、0x00000004和0x00000008。然后,我们从这些地址读取数据,并将数据输出到仿真波形中。最后,我们使用$finish系统任务结束仿真。
阅读全文