litex/verilog/lm32/lm32_dp_ram.v

67 lines
1.5 KiB
Coq
Raw Normal View History

/////////////////////////////////////////////////////
// Module interface
/////////////////////////////////////////////////////
2011-12-13 11:33:12 -05:00
module lm32_dp_ram(
// ----- Inputs -----
2011-12-13 11:33:12 -05:00
clk_i,
rst_i,
we_i,
waddr_i,
wdata_i,
raddr_i,
// ----- 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
/////////////////////////////////////////////////////
// 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;
/////////////////////////////////////////////////////
// Outputs
/////////////////////////////////////////////////////
2011-12-13 11:33:12 -05:00
output [data_width-1:0] rdata_o;
/////////////////////////////////////////////////////
// Internal nets and registers
/////////////////////////////////////////////////////
2011-12-13 11:33:12 -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;
/////////////////////////////////////////////////////
// Combinational logic
/////////////////////////////////////////////////////
assign rdata_o = mem[raddr_r];
2011-12-13 11:33:12 -05:00
/////////////////////////////////////////////////////
// Sequential logic
/////////////////////////////////////////////////////
always @(posedge clk_i)
2011-12-13 11:33:12 -05:00
begin
if (we_i)
mem[waddr_i] <= wdata_i;
2011-12-13 11:33:12 -05:00
raddr_r <= raddr_i;
end
endmodule