2012-11-12 13:36:16 -05:00
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Module interface
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
2011-12-13 11:33:12 -05:00
|
|
|
module lm32_dp_ram(
|
2012-11-12 13:36:16 -05:00
|
|
|
// ----- Inputs -----
|
2011-12-13 11:33:12 -05:00
|
|
|
clk_i,
|
|
|
|
rst_i,
|
|
|
|
we_i,
|
|
|
|
waddr_i,
|
|
|
|
wdata_i,
|
|
|
|
raddr_i,
|
2012-11-12 13:36:16 -05:00
|
|
|
// ----- Outputs -----
|
|
|
|
rdata_o
|
|
|
|
);
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Parameters
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
parameter data_width = 1; // Width of the data ports
|
|
|
|
parameter addr_width = 1; // Width of the address ports
|
2011-12-13 11:33:12 -05:00
|
|
|
|
2012-11-12 13:36:16 -05:00
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Inputs
|
|
|
|
/////////////////////////////////////////////////////
|
2011-12-13 11:33:12 -05:00
|
|
|
|
|
|
|
input clk_i;
|
|
|
|
input rst_i;
|
|
|
|
input we_i;
|
|
|
|
input [addr_width-1:0] waddr_i;
|
|
|
|
input [data_width-1:0] wdata_i;
|
|
|
|
input [addr_width-1:0] raddr_i;
|
2012-11-12 13:36:16 -05:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Outputs
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
2011-12-13 11:33:12 -05:00
|
|
|
output [data_width-1:0] rdata_o;
|
|
|
|
|
2012-11-12 13:36:16 -05:00
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Internal nets and registers
|
|
|
|
/////////////////////////////////////////////////////
|
2011-12-13 11:33:12 -05:00
|
|
|
|
2012-11-12 13:36:16 -05:00
|
|
|
reg [data_width-1:0] mem[(1<<addr_width)-1:0];
|
2011-12-13 11:33:12 -05:00
|
|
|
reg [addr_width-1:0] raddr_r;
|
2012-11-12 13:36:16 -05:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Combinational logic
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
2012-11-12 13:36:14 -05:00
|
|
|
assign rdata_o = mem[raddr_r];
|
2011-12-13 11:33:12 -05:00
|
|
|
|
2012-11-12 13:36:16 -05:00
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
// Sequential logic
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
always @(posedge clk_i)
|
2011-12-13 11:33:12 -05:00
|
|
|
begin
|
|
|
|
if (we_i)
|
2012-11-12 13:36:14 -05:00
|
|
|
mem[waddr_i] <= wdata_i;
|
2011-12-13 11:33:12 -05:00
|
|
|
raddr_r <= raddr_i;
|
|
|
|
end
|
|
|
|
|
|
|
|
endmodule
|
|
|
|
|