1
0
mirror of https://github.com/olofk/serv.git synced 2026-01-22 18:21:12 +00:00
olofk.serv/rtl/camd_ram.v
2018-10-26 22:52:39 +02:00

56 lines
1.3 KiB
Verilog

module camd_ram
#(//camd parameters
parameter AW = 32,
parameter DW = 32,
//Memory parameters
parameter depth = 256,
parameter aw = $clog2(depth),
parameter memfile = "")
(input clk_i,
input rst_i,
input [AW-1:0] ca_adr_i, //FIXME width = AW-clog2(WB_DW/8)
input ca_cmd_i,
input ca_vld_i,
output ca_rdy_o,
input [DW-1:0] dm_dat_i,
input [DW/8-1:0] dm_msk_i,
input dm_vld_i,
output dm_rdy_o,
output [DW-1:0] rd_dat_o,
output reg rd_vld_o,
input rd_rdy_i);
wire ca_en = ca_vld_i & ca_rdy_o;
wire dm_en = dm_vld_i & dm_rdy_o;
wire ram_we = ca_en & dm_en;
assign ca_rdy_o = 1'b1;
assign dm_rdy_o = 1'b1;
wire [aw-1:2] raddr;
reg [aw-1:2] latched_raddr;
assign raddr = ca_en ? ca_adr_i[aw-1:2] : latched_raddr;
always @(posedge clk_i) begin
if (ca_en)
latched_raddr <= ca_adr_i[aw-1:2];
rd_vld_o <= 1'b0;
if (ca_en & !ca_cmd_i)
rd_vld_o <= 1'b1;
end
wb_ram_generic
#(.depth(depth/4),
.memfile (memfile))
ram0
(.clk (clk_i),
.we ({4{ram_we}} & dm_msk_i),
.din (dm_dat_i),
.waddr (ca_adr_i[aw-1:2]),
.raddr (raddr),
.dout (rd_dat_o));
endmodule