设计一个异步双端口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
posted on 2020-08-24 10:37 🐗 阅读(1279) 评论(0) 编辑 收藏 举报