blob: d54ddf6a452a66f5f8f99cbd55f37864c3801e00 [file] [log] [blame]
Manar14d35ac2020-10-21 22:47:15 +02001module mem_synth_wb #(
2 parameter integer MEM_WORDS = 1024
3)(
4 input wb_clk_i,
5 input wb_rst_i,
6
7 input [31:0] wb_adr_i,
8 input [31:0] wb_dat_i,
9 input [3:0] wb_sel_i,
10 input wb_we_i,
11 input wb_cyc_i,
12 input wb_stb_i,
13
14 output wb_ack_o,
15 output [31:0] wb_dat_o
16);
17
18 wire valid;
19 wire ram_wen;
20 wire [3:0] wen; // write enable
21
22 assign valid = wb_cyc_i & wb_stb_i;
23 assign ram_wen = wb_we_i && valid;
24
25 assign wen = wb_sel_i & {4{ram_wen}} ;
26
27 reg wb_ack_read;
28 reg wb_ack_o;
29
30 always @(posedge wb_clk_i) begin
31 if (wb_rst_i == 1'b 1) begin
32 wb_ack_read <= 1'b0;
33 wb_ack_o <= 1'b0;
34 end else begin
35 wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
36 wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
37 end
38 end
39
40 soc_mem_synth # (
41 .MEM_WORDS(MEM_WORDS)
42 ) mem (
43 .clk(wb_clk_i),
44 .ena(valid),
45 .wen(wen),
46 .addr(wb_adr_i[12:2]),
47 .wdata(wb_dat_i),
48 .rdata(wb_dat_o)
49 );
50
51endmodule
52
53module soc_mem_synth #(
54 parameter integer MEM_WORDS = 2048
55)(
56 input clk,
57 input ena,
58 input [3:0] wen,
59 input [10:0] addr,
60 input [31:0] wdata,
61 output[31:0] rdata
62);
63
64 reg [31:0] rdata;
65 reg [31:0] mem [0:MEM_WORDS-1];
66
67 always @(posedge clk) begin
68 if (ena == 1'b1) begin
69 rdata <= mem[addr];
70 if (wen[0]) mem[addr][ 7: 0] <= wdata[ 7: 0];
71 if (wen[1]) mem[addr][15: 8] <= wdata[15: 8];
72 if (wen[2]) mem[addr][23:16] <= wdata[23:16];
73 if (wen[3]) mem[addr][31:24] <= wdata[31:24];
74 end
75 end
76
77endmodule