1 /////////////////////////////////////////////////////////////////////
3 //// WISHBONE Connection Bus Top Level ////
6 //// Original Author: Johny Chi ////
7 //// chisuhua@yahoo.com.cn ////
8 //// Modified By Matt Ettus, matt@ettus.com ////
11 /////////////////////////////////////////////////////////////////////
13 //// Copyright (C) 2000, 2007 Authors and OPENCORES.ORG ////
15 //// This source file may be used and distributed without ////
16 //// restriction provided that this copyright statement is not ////
17 //// removed from the file and that any derivative work contains ////
18 //// the original copyright notice and the associated disclaimer. ////
20 //// This source file is free software; you can redistribute it ////
21 //// and/or modify it under the terms of the GNU Lesser General ////
22 //// Public License as published by the Free Software Foundation; ////
23 //// either version 2.1 of the License, or (at your option) any ////
24 //// later version. ////
26 //// This source is distributed in the hope that it will be ////
27 //// useful, but WITHOUT ANY WARRANTY; without even the implied ////
28 //// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
29 //// PURPOSE. See the GNU Lesser General Public License for more ////
32 //// You should have received a copy of the GNU Lesser General ////
33 //// Public License along with this source; if not, download it ////
34 //// from http://www.opencores.org/lgpl.shtml ////
36 //////////////////////////////////////////////////////////////////////
38 // Up to 8 slaves share a Wishbone Bus connection to 1 master
41 #(parameter s0_addr_w = 4, // slave 0 address decode width
42 parameter s0_addr = 4'h0, // slave 0 address
43 parameter s1_addr_w = 4 , // slave 1 address decode width
44 parameter s1_addr = 4'h1, // slave 1 address
45 parameter s215_addr_w = 8 , // slave 2 to slave 7 address decode width
46 parameter s2_addr = 8'h92, // slave 2 address
47 parameter s3_addr = 8'h93, // slave 3 address
48 parameter s4_addr = 8'h94, // slave 4 address
49 parameter s5_addr = 8'h95, // slave 5 address
50 parameter s6_addr = 8'h96, // slave 6 address
51 parameter s7_addr = 8'h97, // slave 7 address
52 parameter s8_addr = 8'h98, // slave 7 address
53 parameter s9_addr = 8'h99, // slave 7 address
54 parameter s10_addr = 8'h9a, // slave 7 address
55 parameter s11_addr = 8'h9b, // slave 7 address
56 parameter s12_addr = 8'h9c, // slave 7 address
57 parameter s13_addr = 8'h9d, // slave 7 address
58 parameter s14_addr = 8'h9e, // slave 7 address
59 parameter s15_addr = 8'h9f, // slave 7 address
61 parameter dw = 32, // Data bus Width
62 parameter aw = 32, // Address bus Width
63 parameter sw = 4) // Number of Select Lines
69 input [dw-1:0] m0_dat_i,
70 output [dw-1:0] m0_dat_o,
71 input [aw-1:0] m0_adr_i,
72 input [sw-1:0] m0_sel_i,
81 input [dw-1:0] s0_dat_i,
82 output [dw-1:0] s0_dat_o,
83 output [aw-1:0] s0_adr_o,
84 output [sw-1:0] s0_sel_o,
92 input [dw-1:0] s1_dat_i,
93 output [dw-1:0] s1_dat_o,
94 output [aw-1:0] s1_adr_o,
95 output [sw-1:0] s1_sel_o,
103 input [dw-1:0] s2_dat_i,
104 output [dw-1:0] s2_dat_o,
105 output [aw-1:0] s2_adr_o,
106 output [sw-1:0] s2_sel_o,
114 input [dw-1:0] s3_dat_i,
115 output [dw-1:0] s3_dat_o,
116 output [aw-1:0] s3_adr_o,
117 output [sw-1:0] s3_sel_o,
125 input [dw-1:0] s4_dat_i,
126 output [dw-1:0] s4_dat_o,
127 output [aw-1:0] s4_adr_o,
128 output [sw-1:0] s4_sel_o,
136 input [dw-1:0] s5_dat_i,
137 output [dw-1:0] s5_dat_o,
138 output [aw-1:0] s5_adr_o,
139 output [sw-1:0] s5_sel_o,
147 input [dw-1:0] s6_dat_i,
148 output [dw-1:0] s6_dat_o,
149 output [aw-1:0] s6_adr_o,
150 output [sw-1:0] s6_sel_o,
158 input [dw-1:0] s7_dat_i,
159 output [dw-1:0] s7_dat_o,
160 output [aw-1:0] s7_adr_o,
161 output [sw-1:0] s7_sel_o,
169 input [dw-1:0] s8_dat_i,
170 output [dw-1:0] s8_dat_o,
171 output [aw-1:0] s8_adr_o,
172 output [sw-1:0] s8_sel_o,
180 input [dw-1:0] s9_dat_i,
181 output [dw-1:0] s9_dat_o,
182 output [aw-1:0] s9_adr_o,
183 output [sw-1:0] s9_sel_o,
191 input [dw-1:0] s10_dat_i,
192 output [dw-1:0] s10_dat_o,
193 output [aw-1:0] s10_adr_o,
194 output [sw-1:0] s10_sel_o,
202 input [dw-1:0] s11_dat_i,
203 output [dw-1:0] s11_dat_o,
204 output [aw-1:0] s11_adr_o,
205 output [sw-1:0] s11_sel_o,
213 input [dw-1:0] s12_dat_i,
214 output [dw-1:0] s12_dat_o,
215 output [aw-1:0] s12_adr_o,
216 output [sw-1:0] s12_sel_o,
224 input [dw-1:0] s13_dat_i,
225 output [dw-1:0] s13_dat_o,
226 output [aw-1:0] s13_adr_o,
227 output [sw-1:0] s13_sel_o,
235 input [dw-1:0] s14_dat_i,
236 output [dw-1:0] s14_dat_o,
237 output [aw-1:0] s14_adr_o,
238 output [sw-1:0] s14_sel_o,
246 input [dw-1:0] s15_dat_i,
247 output [dw-1:0] s15_dat_o,
248 output [aw-1:0] s15_adr_o,
249 output [sw-1:0] s15_sel_o,
258 // ////////////////////////////////////////////////////////////////
263 wire [15:0] ssel_dec;
264 reg [dw-1:0] i_dat_s; // internal share bus , slave data to master
266 // Master output Interface
267 assign m0_dat_o = i_dat_s;
271 1 : i_dat_s <= s0_dat_i;
272 2 : i_dat_s <= s1_dat_i;
273 4 : i_dat_s <= s2_dat_i;
274 8 : i_dat_s <= s3_dat_i;
275 16 : i_dat_s <= s4_dat_i;
276 32 : i_dat_s <= s5_dat_i;
277 64 : i_dat_s <= s6_dat_i;
278 128 : i_dat_s <= s7_dat_i;
279 256 : i_dat_s <= s8_dat_i;
280 512 : i_dat_s <= s9_dat_i;
281 1024 : i_dat_s <= s10_dat_i;
282 2048 : i_dat_s <= s11_dat_i;
283 4096 : i_dat_s <= s12_dat_i;
284 8192 : i_dat_s <= s13_dat_i;
285 16384 : i_dat_s <= s14_dat_i;
286 32768 : i_dat_s <= s15_dat_i;
287 default : i_dat_s <= s0_dat_i;
288 endcase // case(ssel_dec)
290 assign {m0_ack_o, m0_err_o, m0_rty_o}
291 = {s0_ack_i | s1_ack_i | s2_ack_i | s3_ack_i | s4_ack_i | s5_ack_i | s6_ack_i | s7_ack_i |
292 s8_ack_i | s9_ack_i | s10_ack_i | s11_ack_i | s12_ack_i | s13_ack_i | s14_ack_i | s15_ack_i ,
293 s0_err_i | s1_err_i | s2_err_i | s3_err_i | s4_err_i | s5_err_i | s6_err_i | s7_err_i |
294 s8_err_i | s9_err_i | s10_err_i | s11_err_i | s12_err_i | s13_err_i | s14_err_i | s15_err_i ,
295 s0_rty_i | s1_rty_i | s2_rty_i | s3_rty_i | s4_rty_i | s5_rty_i | s6_rty_i | s7_rty_i |
296 s8_rty_i | s9_rty_i | s10_rty_i | s11_rty_i | s12_rty_i | s13_rty_i | s14_rty_i | s15_rty_i };
298 // Slave output interfaces
299 assign s0_adr_o = m0_adr_i;
300 assign s0_sel_o = m0_sel_i;
301 assign s0_dat_o = m0_dat_i;
302 assign s0_we_o = m0_we_i;
303 assign s0_cyc_o = m0_cyc_i;
304 assign s0_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[0];
306 assign s1_adr_o = m0_adr_i;
307 assign s1_sel_o = m0_sel_i;
308 assign s1_dat_o = m0_dat_i;
309 assign s1_we_o = m0_we_i;
310 assign s1_cyc_o = m0_cyc_i;
311 assign s1_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[1];
313 assign s2_adr_o = m0_adr_i;
314 assign s2_sel_o = m0_sel_i;
315 assign s2_dat_o = m0_dat_i;
316 assign s2_we_o = m0_we_i;
317 assign s2_cyc_o = m0_cyc_i;
318 assign s2_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[2];
320 assign s3_adr_o = m0_adr_i;
321 assign s3_sel_o = m0_sel_i;
322 assign s3_dat_o = m0_dat_i;
323 assign s3_we_o = m0_we_i;
324 assign s3_cyc_o = m0_cyc_i;
325 assign s3_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[3];
327 assign s4_adr_o = m0_adr_i;
328 assign s4_sel_o = m0_sel_i;
329 assign s4_dat_o = m0_dat_i;
330 assign s4_we_o = m0_we_i;
331 assign s4_cyc_o = m0_cyc_i;
332 assign s4_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[4];
334 assign s5_adr_o = m0_adr_i;
335 assign s5_sel_o = m0_sel_i;
336 assign s5_dat_o = m0_dat_i;
337 assign s5_we_o = m0_we_i;
338 assign s5_cyc_o = m0_cyc_i;
339 assign s5_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[5];
341 assign s6_adr_o = m0_adr_i;
342 assign s6_sel_o = m0_sel_i;
343 assign s6_dat_o = m0_dat_i;
344 assign s6_we_o = m0_we_i;
345 assign s6_cyc_o = m0_cyc_i;
346 assign s6_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[6];
348 assign s7_adr_o = m0_adr_i;
349 assign s7_sel_o = m0_sel_i;
350 assign s7_dat_o = m0_dat_i;
351 assign s7_we_o = m0_we_i;
352 assign s7_cyc_o = m0_cyc_i;
353 assign s7_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[7];
355 assign s8_adr_o = m0_adr_i;
356 assign s8_sel_o = m0_sel_i;
357 assign s8_dat_o = m0_dat_i;
358 assign s8_we_o = m0_we_i;
359 assign s8_cyc_o = m0_cyc_i;
360 assign s8_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[8];
362 assign s9_adr_o = m0_adr_i;
363 assign s9_sel_o = m0_sel_i;
364 assign s9_dat_o = m0_dat_i;
365 assign s9_we_o = m0_we_i;
366 assign s9_cyc_o = m0_cyc_i;
367 assign s9_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[9];
369 assign s10_adr_o = m0_adr_i;
370 assign s10_sel_o = m0_sel_i;
371 assign s10_dat_o = m0_dat_i;
372 assign s10_we_o = m0_we_i;
373 assign s10_cyc_o = m0_cyc_i;
374 assign s10_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[10];
376 assign s11_adr_o = m0_adr_i;
377 assign s11_sel_o = m0_sel_i;
378 assign s11_dat_o = m0_dat_i;
379 assign s11_we_o = m0_we_i;
380 assign s11_cyc_o = m0_cyc_i;
381 assign s11_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[11];
383 assign s12_adr_o = m0_adr_i;
384 assign s12_sel_o = m0_sel_i;
385 assign s12_dat_o = m0_dat_i;
386 assign s12_we_o = m0_we_i;
387 assign s12_cyc_o = m0_cyc_i;
388 assign s12_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[12];
390 assign s13_adr_o = m0_adr_i;
391 assign s13_sel_o = m0_sel_i;
392 assign s13_dat_o = m0_dat_i;
393 assign s13_we_o = m0_we_i;
394 assign s13_cyc_o = m0_cyc_i;
395 assign s13_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[13];
397 assign s14_adr_o = m0_adr_i;
398 assign s14_sel_o = m0_sel_i;
399 assign s14_dat_o = m0_dat_i;
400 assign s14_we_o = m0_we_i;
401 assign s14_cyc_o = m0_cyc_i;
402 assign s14_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[14];
404 assign s15_adr_o = m0_adr_i;
405 assign s15_sel_o = m0_sel_i;
406 assign s15_dat_o = m0_dat_i;
407 assign s15_we_o = m0_we_i;
408 assign s15_cyc_o = m0_cyc_i;
409 assign s15_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[15];
411 // Address decode logic
412 // WARNING -- must make sure these are mutually exclusive!
413 assign ssel_dec[0] = (m0_adr_i[aw -1 : aw - s0_addr_w ] == s0_addr);
414 assign ssel_dec[1] = (m0_adr_i[aw -1 : aw - s1_addr_w ] == s1_addr);
415 assign ssel_dec[2] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s2_addr);
416 assign ssel_dec[3] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s3_addr);
417 assign ssel_dec[4] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s4_addr);
418 assign ssel_dec[5] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s5_addr);
419 assign ssel_dec[6] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s6_addr);
420 assign ssel_dec[7] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s7_addr);
421 assign ssel_dec[8] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s8_addr);
422 assign ssel_dec[9] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s9_addr);
423 assign ssel_dec[10] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s10_addr);
424 assign ssel_dec[11] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s11_addr);
425 assign ssel_dec[12] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s12_addr);
426 assign ssel_dec[13] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s13_addr);
427 assign ssel_dec[14] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s14_addr);
428 assign ssel_dec[15] = (m0_adr_i[aw -1 : aw - s215_addr_w ] == s15_addr);
430 endmodule // wb_1master