設計一個異步雙端口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  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章