简单的双端口ram,两地址线,两数据线,一条读写信号。在写时能读(写地址和读地址不一样)。
模块文件:
`timescale 1ns / 1ps
module doub_ram(
//input clk,
input r_w,//1为读,0为写
input [2:0] addr_r,
input [2:0] addr_w,
input [15:0] data_i,
output [15:0] data_o
);
reg [15:0] ram [7:0];//例化8*16的ram
assign data_o=ram[addr_r];//读数据
always @(r_w or addr_w)//写数据
if(~r_w)
ram[addr_w]<=data_i;
endmodule
激励文件:
`timescale 1ns / 1ps
module test_ram();
reg r_w;
reg [2:0] addr_r,addr_w;
reg [15:0] data_i;
wire [15:0] data_o;
doub_ram test_rom1(
.r_w(r_w),
.addr_r(addr_r),
.addr_w(addr_w),
.data_i(data_i),
.data_o(data_o)
);
//assign data1=data;
initial
begin//先写数据,将ram空间赋值
r_w=0;
addr_w=3'b000;
data_i=16'b0000_0000_0000_0111;
#20
r_w=0;
addr_w=3'b001;
data_i=16'b0000_0000_0000_0110;
#20;
r_w=0;
addr_w=3'b010;
data_i=16'b0000_0000_0000_0101;
#20
r_w=0;
addr_w=3'b011;
data_i=16'b0000_0000_0000_0100;
#20;
r_w=0;
addr_w=3'b100;
data_i=16'b0000_0000_0000_0011;
#20
r_w=0;
addr_w=3'b101;
data_i=16'b0000_0000_0000_0010;
#20;
r_w=0;
addr_w=3'b110;
data_i=16'b0000_0000_0000_0001;
#20
r_w=0;
addr_w=3'b111;
data_i=16'b0000_0000_0110_0000;
数据写完///
//读数据
#200;
r_w=1;
addr_r=3'b110;
#10;
addr_r=3'b100;
#10;
//写数据,同时读数据,读写地址可以不一样
#20
r_w=0;
addr_w=3'b111;//写111地址
data_i=16'b0000_0000_0110_0000;
addr_r=3'b101;//同时读101地址
#20;
addr_w=3'b101;//写101地址
data_i=16'b0000_0110_0110_0000;
addr_r=3'b111;//同时读111数据
#20;
addr_w=3'b001;//写001地址
data_i=16'b0000_0110_0110_0000;
addr_r=3'b001;//同时读001数据
end
endmodule