1. 程式人生 > 實用技巧 >設計一個非同步雙埠RAM,深度為16,資料位寬為8bit

設計一個非同步雙埠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