module DUAL_PORT_ARAM
#(
parameter ADDR_WIDTH = 4,
parameter DATA_WIDTH = 8,
parameter DATA_DEPTH = 1<<ADDR_WIDTH
)
(
input clk_r, //异步ram写时钟
input clk_w, //异步ram读取时钟
input rst_n, //复位信号
input cs_n, //片选信号
input [ADDR_WIDTH-1'b1:0]addr, //读写操作请求地址
input rd_en, //读取使能信号
input wr_en, //写入使能信号
input [DATA_WIDTH-1'b1:0] data_w, //写入数据
output reg [DATA_WIDTH-1'b1:0]data_r //读出的数据
);
/*
数据的个数为16,也就是2的4次方, 所以地址的宽度为4,深度为16
*/
/*
要实现一个双端口的异步ram,数据的个数为16,所以要有16个寄存器变量
*/
reg [DATA_WIDTH-1'b1:0] mem[DATA_DEPTH-1'b1:0]; //定义DATA_DEPTH个位宽为DATA_WIDTH的存储单元
//写控制模块
integer i;
always@(posedge clk_w or negedge rst_n)
if(~rst_n) //复位情况
begin
for(i=0 ; i<DATA_DEPTH; i=i+1'b1 )
mem[i]<={DATA_WIDTH{1'b0}};
end
else begin //检测到写请求
if(wr_en&~cs_n)
mem[addr]<=data_w;
end
//读取控制模块
always@(posedge clk_r or negedge rst_n)
if(~rst_n)
data_r<={DATA_WIDTH{1'b0}};
else if(rd_en&(~cs_n))
data_r<=mem[addr];
endmodule