blob: fd713a48bedc9c2f6ba85bf38296015b80f0b822 [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
25 output [127:0] la_data,
26 output [127:0] la_ena
27);
28
29 wire resetn;
30 wire valid;
31 wire ready;
32 wire [3:0] iomem_we;
33
34 assign resetn = ~wb_rst_i;
35 assign valid = wb_stb_i && wb_cyc_i;
36
37 assign iomem_we = wb_sel_i & {4{wb_we_i}};
38 assign wb_ack_o = ready;
39
40 la #(
41 .BASE_ADR(BASE_ADR),
42 .LA_DATA_0(LA_DATA_0),
43 .LA_DATA_1(LA_DATA_1),
44 .LA_DATA_2(LA_DATA_2),
45 .LA_DATA_3(LA_DATA_3),
46 .LA_ENA_0(LA_ENA_0),
47 .LA_ENA_1(LA_ENA_1),
48 .LA_ENA_2(LA_ENA_2),
49 .LA_ENA_3(LA_ENA_3)
50 ) la_ctrl (
51 .clk(wb_clk_i),
52 .resetn(resetn),
53 .iomem_addr(wb_adr_i),
54 .iomem_valid(valid),
55 .iomem_wstrb(iomem_we),
56 .iomem_wdata(wb_dat_i),
57 .iomem_rdata(wb_dat_o),
58 .iomem_ready(ready),
59 .la_data(la_data),
60 .la_ena(la_ena)
61 );
62
63endmodule
64
65module la #(
66 parameter BASE_ADR = 32'h 2200_0000,
67 parameter LA_DATA_0 = 8'h00,
68 parameter LA_DATA_1 = 8'h04,
69 parameter LA_DATA_2 = 8'h08,
70 parameter LA_DATA_3 = 8'h0c,
71 parameter LA_ENA_0 = 8'h10,
72 parameter LA_ENA_1 = 8'h14,
73 parameter LA_ENA_2 = 8'h18,
74 parameter LA_ENA_3 = 8'h1c
75) (
76 input clk,
77 input resetn,
78
79 input [31:0] iomem_addr,
80 input iomem_valid,
81 input [3:0] iomem_wstrb,
82 input [31:0] iomem_wdata,
83
84 output reg [31:0] iomem_rdata,
85 output reg iomem_ready,
86
87 output [127:0] la_data,
88 output [127:0] la_ena
89);
90
91 reg [31:0] la_data_0;
92 reg [31:0] la_data_1;
93 reg [31:0] la_data_2;
94 reg [31:0] la_data_3;
95
96 reg [31:0] la_ena_0;
97 reg [31:0] la_ena_1;
98 reg [31:0] la_ena_2;
99 reg [31:0] la_ena_3;
100
101 wire [3:0] la_data_sel;
102 wire [3:0] la_ena_sel;
103
104 assign la_data = {la_data_3, la_data_2, la_data_1, la_data_0};
105 assign la_ena = {la_ena_3, la_ena_2, la_ena_1, la_ena_0};
106
107 assign la_data_sel = {
108 (iomem_addr[7:0] == LA_DATA_3),
109 (iomem_addr[7:0] == LA_DATA_2),
110 (iomem_addr[7:0] == LA_DATA_1),
111 (iomem_addr[7:0] == LA_DATA_0)
112 };
113
114 assign la_ena_sel = {
115 (iomem_addr[7:0] == LA_ENA_3),
116 (iomem_addr[7:0] == LA_ENA_2),
117 (iomem_addr[7:0] == LA_ENA_1),
118 (iomem_addr[7:0] == LA_ENA_0)
119 };
120
121
122 always @(posedge clk) begin
123 if (!resetn) begin
124 la_data_0 <= 0;
125 la_data_1 <= 0;
126 la_data_2 <= 0;
127 la_data_3 <= 0;
128 la_ena_0 <= 0;
129 la_ena_1 <= 0;
130 la_ena_2 <= 0;
131 la_ena_3 <= 0;
132 end else begin
133 iomem_ready <= 0;
134 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
135 iomem_ready <= 1'b 1;
136
137 if (la_data_sel[0]) begin
138 iomem_rdata <= la_data_0;
139
140 if (iomem_wstrb[0]) la_data_0[ 7: 0] <= iomem_wdata[ 7: 0];
141 if (iomem_wstrb[1]) la_data_0[15: 8] <= iomem_wdata[15: 8];
142 if (iomem_wstrb[2]) la_data_0[23:16] <= iomem_wdata[23:16];
143 if (iomem_wstrb[3]) la_data_0[31:24] <= iomem_wdata[31:24];
144
145 end else if (la_data_sel[1]) begin
146 iomem_rdata <= la_data_1;
147
148 if (iomem_wstrb[0]) la_data_1[ 7: 0] <= iomem_wdata[ 7: 0];
149 if (iomem_wstrb[1]) la_data_1[15: 8] <= iomem_wdata[15: 8];
150 if (iomem_wstrb[2]) la_data_1[23:16] <= iomem_wdata[23:16];
151 if (iomem_wstrb[3]) la_data_1[31:24] <= iomem_wdata[31:24];
152
153 end else if (la_data_sel[2]) begin
154 iomem_rdata <= la_data_2;
155
156 if (iomem_wstrb[0]) la_data_2[ 7: 0] <= iomem_wdata[ 7: 0];
157 if (iomem_wstrb[1]) la_data_2[15: 8] <= iomem_wdata[15: 8];
158 if (iomem_wstrb[2]) la_data_2[23:16] <= iomem_wdata[23:16];
159 if (iomem_wstrb[3]) la_data_2[31:24] <= iomem_wdata[31:24];
160
161 end else if (la_data_sel[3]) begin
162 iomem_rdata <= la_data_3;
163
164 if (iomem_wstrb[0]) la_data_3[ 7: 0] <= iomem_wdata[ 7: 0];
165 if (iomem_wstrb[1]) la_data_3[15: 8] <= iomem_wdata[15: 8];
166 if (iomem_wstrb[2]) la_data_3[23:16] <= iomem_wdata[23:16];
167 if (iomem_wstrb[3]) la_data_3[31:24] <= iomem_wdata[31:24];
168 end else if (la_ena_sel[0]) begin
169 iomem_rdata <= la_ena_0;
170
171 if (iomem_wstrb[0]) la_ena_0[ 7: 0] <= iomem_wdata[ 7: 0];
172 if (iomem_wstrb[1]) la_ena_0[15: 8] <= iomem_wdata[15: 8];
173 if (iomem_wstrb[2]) la_ena_0[23:16] <= iomem_wdata[23:16];
174 if (iomem_wstrb[3]) la_ena_0[31:24] <= iomem_wdata[31:24];
175 end else if (la_ena_sel[1]) begin
176 iomem_rdata <= la_ena_1;
177
178 if (iomem_wstrb[0]) la_ena_1[ 7: 0] <= iomem_wdata[ 7: 0];
179 if (iomem_wstrb[1]) la_ena_1[15: 8] <= iomem_wdata[15: 8];
180 if (iomem_wstrb[2]) la_ena_1[23:16] <= iomem_wdata[23:16];
181 if (iomem_wstrb[3]) la_ena_1[31:24] <= iomem_wdata[31:24];
182 end else if (la_ena_sel[2]) begin
183 iomem_rdata <= la_ena_2;
184
185 if (iomem_wstrb[0]) la_ena_2[ 7: 0] <= iomem_wdata[ 7: 0];
186 if (iomem_wstrb[1]) la_ena_2[15: 8] <= iomem_wdata[15: 8];
187 if (iomem_wstrb[2]) la_ena_2[23:16] <= iomem_wdata[23:16];
188 if (iomem_wstrb[3]) la_ena_2[31:24] <= iomem_wdata[31:24];
189 end else if (la_ena_sel[3]) begin
190 iomem_rdata <= la_ena_3;
191
192 if (iomem_wstrb[0]) la_ena_3[ 7: 0] <= iomem_wdata[ 7: 0];
193 if (iomem_wstrb[1]) la_ena_3[15: 8] <= iomem_wdata[15: 8];
194 if (iomem_wstrb[2]) la_ena_3[23:16] <= iomem_wdata[23:16];
195 if (iomem_wstrb[3]) la_ena_3[31:24] <= iomem_wdata[31:24];
196 end
197 end
198 end
199 end
200
201endmodule