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