luxinshuo

设计一个异步双端口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  

 

分类:

技术点:

相关文章:

  • 2021-12-07
  • 2021-07-21
  • 2021-06-30
  • 2021-11-13
  • 2021-05-06
  • 2021-11-28
  • 2021-11-28
猜你喜欢
  • 2021-11-28
  • 2021-04-10
  • 2021-11-28
  • 2021-10-31
  • 2021-11-02
  • 2022-12-23
  • 2021-08-16
相关资源
相似解决方案