blob: 68e0cc00e79c1f8e5cf1d995954a03638b609a28 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001module la_wb # (
2 parameter BASE_ADR = 32'h 2200_0000,
3 parameter LA_DATA_0 = 8'h00,
4 parameter LA_DATA_1 = 8'h04,
5 parameter LA_DATA_2 = 8'h08,
6 parameter LA_DATA_3 = 8'h0c,
7 parameter LA_ENA_0 = 8'h10,
8 parameter LA_ENA_1 = 8'h14,
9 parameter LA_ENA_2 = 8'h18,
10 parameter LA_ENA_3 = 8'h1c
11) (
12 input wb_clk_i,
13 input wb_rst_i,
14
15 input [31:0] wb_dat_i,
16 input [31:0] wb_adr_i,
17 input [3:0] wb_sel_i,
18 input wb_cyc_i,
19 input wb_stb_i,
20 input wb_we_i,
21
22 output [31:0] wb_dat_o,
23 output wb_ack_o,
24
shalan0d14e6e2020-08-31 16:50:48 +020025 input [127:0] la_data_in, // From MPRJ
shalanfd13eb52020-08-21 16:48:07 +020026 output [127:0] la_data,
shalan0d14e6e2020-08-31 16:50:48 +020027 output [127:0] la_oen
shalanfd13eb52020-08-21 16:48:07 +020028);
29
30 wire resetn;
31 wire valid;
32 wire ready;
33 wire [3:0] iomem_we;
34
35 assign resetn = ~wb_rst_i;
36 assign valid = wb_stb_i && wb_cyc_i;
37
38 assign iomem_we = wb_sel_i & {4{wb_we_i}};
39 assign wb_ack_o = ready;
40
41 la #(
42 .BASE_ADR(BASE_ADR),
43 .LA_DATA_0(LA_DATA_0),
44 .LA_DATA_1(LA_DATA_1),
45 .LA_DATA_2(LA_DATA_2),
46 .LA_DATA_3(LA_DATA_3),
47 .LA_ENA_0(LA_ENA_0),
48 .LA_ENA_1(LA_ENA_1),
49 .LA_ENA_2(LA_ENA_2),
50 .LA_ENA_3(LA_ENA_3)
51 ) la_ctrl (
52 .clk(wb_clk_i),
53 .resetn(resetn),
54 .iomem_addr(wb_adr_i),
55 .iomem_valid(valid),
56 .iomem_wstrb(iomem_we),
57 .iomem_wdata(wb_dat_i),
58 .iomem_rdata(wb_dat_o),
59 .iomem_ready(ready),
shalan0d14e6e2020-08-31 16:50:48 +020060 .la_data_in(la_data_in),
shalanfd13eb52020-08-21 16:48:07 +020061 .la_data(la_data),
shalan0d14e6e2020-08-31 16:50:48 +020062 .la_oen(la_oen)
shalanfd13eb52020-08-21 16:48:07 +020063 );
64
65endmodule
66
67module la #(
68 parameter BASE_ADR = 32'h 2200_0000,
69 parameter LA_DATA_0 = 8'h00,
70 parameter LA_DATA_1 = 8'h04,
71 parameter LA_DATA_2 = 8'h08,
72 parameter LA_DATA_3 = 8'h0c,
73 parameter LA_ENA_0 = 8'h10,
74 parameter LA_ENA_1 = 8'h14,
75 parameter LA_ENA_2 = 8'h18,
76 parameter LA_ENA_3 = 8'h1c
77) (
78 input clk,
79 input resetn,
80
81 input [31:0] iomem_addr,
82 input iomem_valid,
83 input [3:0] iomem_wstrb,
84 input [31:0] iomem_wdata,
85
86 output reg [31:0] iomem_rdata,
87 output reg iomem_ready,
88
shalan0d14e6e2020-08-31 16:50:48 +020089 input [127:0] la_data_in, // From MPRJ
90 output [127:0] la_data, // To MPRJ
91 output [127:0] la_oen
shalanfd13eb52020-08-21 16:48:07 +020092);
93
94 reg [31:0] la_data_0;
95 reg [31:0] la_data_1;
96 reg [31:0] la_data_2;
97 reg [31:0] la_data_3;
98
99 reg [31:0] la_ena_0;
100 reg [31:0] la_ena_1;
101 reg [31:0] la_ena_2;
102 reg [31:0] la_ena_3;
103
104 wire [3:0] la_data_sel;
105 wire [3:0] la_ena_sel;
106
107 assign la_data = {la_data_3, la_data_2, la_data_1, la_data_0};
shalan0d14e6e2020-08-31 16:50:48 +0200108 assign la_oen = {la_ena_3, la_ena_2, la_ena_1, la_ena_0};
shalanfd13eb52020-08-21 16:48:07 +0200109
110 assign la_data_sel = {
111 (iomem_addr[7:0] == LA_DATA_3),
112 (iomem_addr[7:0] == LA_DATA_2),
113 (iomem_addr[7:0] == LA_DATA_1),
114 (iomem_addr[7:0] == LA_DATA_0)
115 };
116
117 assign la_ena_sel = {
118 (iomem_addr[7:0] == LA_ENA_3),
119 (iomem_addr[7:0] == LA_ENA_2),
120 (iomem_addr[7:0] == LA_ENA_1),
121 (iomem_addr[7:0] == LA_ENA_0)
122 };
123
124
125 always @(posedge clk) begin
126 if (!resetn) begin
127 la_data_0 <= 0;
128 la_data_1 <= 0;
129 la_data_2 <= 0;
130 la_data_3 <= 0;
shalan0d14e6e2020-08-31 16:50:48 +0200131 la_ena_0 <= 32'hFFFF_FFFF; // default is tri-state buff disabled
132 la_ena_1 <= 32'hFFFF_FFFF;
133 la_ena_2 <= 32'hFFFF_FFFF;
134 la_ena_3 <= 32'hFFFF_FFFF;
shalanfd13eb52020-08-21 16:48:07 +0200135 end else begin
136 iomem_ready <= 0;
137 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
138 iomem_ready <= 1'b 1;
139
140 if (la_data_sel[0]) begin
shalan0d14e6e2020-08-31 16:50:48 +0200141 iomem_rdata <= la_data_0 | (la_data_in[31:0] & la_ena_0);
shalanfd13eb52020-08-21 16:48:07 +0200142
143 if (iomem_wstrb[0]) la_data_0[ 7: 0] <= iomem_wdata[ 7: 0];
144 if (iomem_wstrb[1]) la_data_0[15: 8] <= iomem_wdata[15: 8];
145 if (iomem_wstrb[2]) la_data_0[23:16] <= iomem_wdata[23:16];
146 if (iomem_wstrb[3]) la_data_0[31:24] <= iomem_wdata[31:24];
147
148 end else if (la_data_sel[1]) begin
shalan0d14e6e2020-08-31 16:50:48 +0200149 iomem_rdata <= la_data_1 | (la_data_in[63:32] & la_ena_1);
shalanfd13eb52020-08-21 16:48:07 +0200150
151 if (iomem_wstrb[0]) la_data_1[ 7: 0] <= iomem_wdata[ 7: 0];
152 if (iomem_wstrb[1]) la_data_1[15: 8] <= iomem_wdata[15: 8];
153 if (iomem_wstrb[2]) la_data_1[23:16] <= iomem_wdata[23:16];
154 if (iomem_wstrb[3]) la_data_1[31:24] <= iomem_wdata[31:24];
155
156 end else if (la_data_sel[2]) begin
shalan0d14e6e2020-08-31 16:50:48 +0200157 iomem_rdata <= la_data_2 | (la_data_in[95:64] & la_ena_2);
shalanfd13eb52020-08-21 16:48:07 +0200158
159 if (iomem_wstrb[0]) la_data_2[ 7: 0] <= iomem_wdata[ 7: 0];
160 if (iomem_wstrb[1]) la_data_2[15: 8] <= iomem_wdata[15: 8];
161 if (iomem_wstrb[2]) la_data_2[23:16] <= iomem_wdata[23:16];
162 if (iomem_wstrb[3]) la_data_2[31:24] <= iomem_wdata[31:24];
163
164 end else if (la_data_sel[3]) begin
shalan0d14e6e2020-08-31 16:50:48 +0200165 iomem_rdata <= la_data_3 | (la_data_in[127:96] & la_ena_3);
shalanfd13eb52020-08-21 16:48:07 +0200166
167 if (iomem_wstrb[0]) la_data_3[ 7: 0] <= iomem_wdata[ 7: 0];
168 if (iomem_wstrb[1]) la_data_3[15: 8] <= iomem_wdata[15: 8];
169 if (iomem_wstrb[2]) la_data_3[23:16] <= iomem_wdata[23:16];
170 if (iomem_wstrb[3]) la_data_3[31:24] <= iomem_wdata[31:24];
171 end else if (la_ena_sel[0]) begin
172 iomem_rdata <= la_ena_0;
173
174 if (iomem_wstrb[0]) la_ena_0[ 7: 0] <= iomem_wdata[ 7: 0];
175 if (iomem_wstrb[1]) la_ena_0[15: 8] <= iomem_wdata[15: 8];
176 if (iomem_wstrb[2]) la_ena_0[23:16] <= iomem_wdata[23:16];
177 if (iomem_wstrb[3]) la_ena_0[31:24] <= iomem_wdata[31:24];
178 end else if (la_ena_sel[1]) begin
179 iomem_rdata <= la_ena_1;
180
181 if (iomem_wstrb[0]) la_ena_1[ 7: 0] <= iomem_wdata[ 7: 0];
182 if (iomem_wstrb[1]) la_ena_1[15: 8] <= iomem_wdata[15: 8];
183 if (iomem_wstrb[2]) la_ena_1[23:16] <= iomem_wdata[23:16];
184 if (iomem_wstrb[3]) la_ena_1[31:24] <= iomem_wdata[31:24];
185 end else if (la_ena_sel[2]) begin
186 iomem_rdata <= la_ena_2;
187
188 if (iomem_wstrb[0]) la_ena_2[ 7: 0] <= iomem_wdata[ 7: 0];
189 if (iomem_wstrb[1]) la_ena_2[15: 8] <= iomem_wdata[15: 8];
190 if (iomem_wstrb[2]) la_ena_2[23:16] <= iomem_wdata[23:16];
191 if (iomem_wstrb[3]) la_ena_2[31:24] <= iomem_wdata[31:24];
192 end else if (la_ena_sel[3]) begin
193 iomem_rdata <= la_ena_3;
194
195 if (iomem_wstrb[0]) la_ena_3[ 7: 0] <= iomem_wdata[ 7: 0];
196 if (iomem_wstrb[1]) la_ena_3[15: 8] <= iomem_wdata[15: 8];
197 if (iomem_wstrb[2]) la_ena_3[23:16] <= iomem_wdata[23:16];
198 if (iomem_wstrb[3]) la_ena_3[31:24] <= iomem_wdata[31:24];
199 end
200 end
201 end
202 end
203
204endmodule