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