设计一个异步双端口RAM,深度为16,数据位宽为8bit

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  
原文地址:https://www.cnblogs.com/luxinshuo/p/13552479.html