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 decode_w = 8, // address decode width
42 parameter s0_addr = 8'h0, // slave 0 address
43 parameter s0_mask = 8'h0, // slave 0 don't cares
44 parameter s1_addr = 8'h0, // slave 1 address
45 parameter s1_mask = 8'h0, // slave 1 don't cares
46 parameter s2_addr = 8'h0, // slave 2 address
47 parameter s2_mask = 8'h0, // slave 2 don't cares
48 parameter s3_addr = 8'h0, // slave 3 address
49 parameter s3_mask = 8'h0, // slave 3 don't cares
50 parameter s4_addr = 8'h0, // slave 4 address
51 parameter s4_mask = 8'h0, // slave 4 don't cares
52 parameter s5_addr = 8'h0, // slave 5 address
53 parameter s5_mask = 8'h0, // slave 5 don't cares
54 parameter s6_addr = 8'h0, // slave 6 address
55 parameter s6_mask = 8'h0, // slave 6 don't cares
56 parameter s7_addr = 8'h0, // slave 7 address
57 parameter s7_mask = 8'h0, // slave 7 don't cares
58 parameter s8_addr = 8'h0, // slave 8 address
59 parameter s8_mask = 8'h0, // slave 8 don't cares
60 parameter s9_addr = 8'h0, // slave 9 address
61 parameter s9_mask = 8'h0, // slave 9 don't cares
62 parameter sa_addr = 8'h0, // slave a address
63 parameter sa_mask = 8'h0, // slave a don't cares
64 parameter sb_addr = 8'h0, // slave b address
65 parameter sb_mask = 8'h0, // slave b don't cares
66 parameter sc_addr = 8'h0, // slave c address
67 parameter sc_mask = 8'h0, // slave c don't cares
68 parameter sd_addr = 8'h0, // slave d address
69 parameter sd_mask = 8'h0, // slave d don't cares
70 parameter se_addr = 8'h0, // slave e address
71 parameter se_mask = 8'h0, // slave e don't cares
72 parameter sf_addr = 8'h0, // slave f address
73 parameter sf_mask = 8'h0, // slave f don't cares
75 parameter dw = 32, // Data bus Width
76 parameter aw = 32, // Address bus Width
77 parameter sw = 4) // Number of Select Lines
83 input [dw-1:0] m0_dat_i,
84 output [dw-1:0] m0_dat_o,
85 input [aw-1:0] m0_adr_i,
86 input [sw-1:0] m0_sel_i,
95 input [dw-1:0] s0_dat_i,
96 output [dw-1:0] s0_dat_o,
97 output [aw-1:0] s0_adr_o,
98 output [sw-1:0] s0_sel_o,
106 input [dw-1:0] s1_dat_i,
107 output [dw-1:0] s1_dat_o,
108 output [aw-1:0] s1_adr_o,
109 output [sw-1:0] s1_sel_o,
117 input [dw-1:0] s2_dat_i,
118 output [dw-1:0] s2_dat_o,
119 output [aw-1:0] s2_adr_o,
120 output [sw-1:0] s2_sel_o,
128 input [dw-1:0] s3_dat_i,
129 output [dw-1:0] s3_dat_o,
130 output [aw-1:0] s3_adr_o,
131 output [sw-1:0] s3_sel_o,
139 input [dw-1:0] s4_dat_i,
140 output [dw-1:0] s4_dat_o,
141 output [aw-1:0] s4_adr_o,
142 output [sw-1:0] s4_sel_o,
150 input [dw-1:0] s5_dat_i,
151 output [dw-1:0] s5_dat_o,
152 output [aw-1:0] s5_adr_o,
153 output [sw-1:0] s5_sel_o,
161 input [dw-1:0] s6_dat_i,
162 output [dw-1:0] s6_dat_o,
163 output [aw-1:0] s6_adr_o,
164 output [sw-1:0] s6_sel_o,
172 input [dw-1:0] s7_dat_i,
173 output [dw-1:0] s7_dat_o,
174 output [aw-1:0] s7_adr_o,
175 output [sw-1:0] s7_sel_o,
183 input [dw-1:0] s8_dat_i,
184 output [dw-1:0] s8_dat_o,
185 output [aw-1:0] s8_adr_o,
186 output [sw-1:0] s8_sel_o,
194 input [dw-1:0] s9_dat_i,
195 output [dw-1:0] s9_dat_o,
196 output [aw-1:0] s9_adr_o,
197 output [sw-1:0] s9_sel_o,
205 input [dw-1:0] sa_dat_i,
206 output [dw-1:0] sa_dat_o,
207 output [aw-1:0] sa_adr_o,
208 output [sw-1:0] sa_sel_o,
216 input [dw-1:0] sb_dat_i,
217 output [dw-1:0] sb_dat_o,
218 output [aw-1:0] sb_adr_o,
219 output [sw-1:0] sb_sel_o,
227 input [dw-1:0] sc_dat_i,
228 output [dw-1:0] sc_dat_o,
229 output [aw-1:0] sc_adr_o,
230 output [sw-1:0] sc_sel_o,
238 input [dw-1:0] sd_dat_i,
239 output [dw-1:0] sd_dat_o,
240 output [aw-1:0] sd_adr_o,
241 output [sw-1:0] sd_sel_o,
249 input [dw-1:0] se_dat_i,
250 output [dw-1:0] se_dat_o,
251 output [aw-1:0] se_adr_o,
252 output [sw-1:0] se_sel_o,
260 input [dw-1:0] sf_dat_i,
261 output [dw-1:0] sf_dat_o,
262 output [aw-1:0] sf_adr_o,
263 output [sw-1:0] sf_sel_o,
272 // ////////////////////////////////////////////////////////////////
277 wire [15:0] ssel_dec;
278 reg [dw-1:0] i_dat_s; // internal share bus , slave data to master
280 // Master output Interface
281 assign m0_dat_o = i_dat_s;
285 1 : i_dat_s <= s0_dat_i;
286 2 : i_dat_s <= s1_dat_i;
287 4 : i_dat_s <= s2_dat_i;
288 8 : i_dat_s <= s3_dat_i;
289 16 : i_dat_s <= s4_dat_i;
290 32 : i_dat_s <= s5_dat_i;
291 64 : i_dat_s <= s6_dat_i;
292 128 : i_dat_s <= s7_dat_i;
293 256 : i_dat_s <= s8_dat_i;
294 512 : i_dat_s <= s9_dat_i;
295 1024 : i_dat_s <= sa_dat_i;
296 2048 : i_dat_s <= sb_dat_i;
297 4096 : i_dat_s <= sc_dat_i;
298 8192 : i_dat_s <= sd_dat_i;
299 16384 : i_dat_s <= se_dat_i;
300 32768 : i_dat_s <= sf_dat_i;
301 default : i_dat_s <= s0_dat_i;
302 endcase // case(ssel_dec)
304 assign {m0_ack_o, m0_err_o, m0_rty_o}
305 = {s0_ack_i | s1_ack_i | s2_ack_i | s3_ack_i | s4_ack_i | s5_ack_i | s6_ack_i | s7_ack_i |
306 s8_ack_i | s9_ack_i | sa_ack_i | sb_ack_i | sc_ack_i | sd_ack_i | se_ack_i | sf_ack_i ,
307 s0_err_i | s1_err_i | s2_err_i | s3_err_i | s4_err_i | s5_err_i | s6_err_i | s7_err_i |
308 s8_err_i | s9_err_i | sa_err_i | sb_err_i | sc_err_i | sd_err_i | se_err_i | sf_err_i ,
309 s0_rty_i | s1_rty_i | s2_rty_i | s3_rty_i | s4_rty_i | s5_rty_i | s6_rty_i | s7_rty_i |
310 s8_rty_i | s9_rty_i | sa_rty_i | sb_rty_i | sc_rty_i | sd_rty_i | se_rty_i | sf_rty_i };
312 // Slave output interfaces
313 assign s0_adr_o = m0_adr_i;
314 assign s0_sel_o = m0_sel_i;
315 assign s0_dat_o = m0_dat_i;
316 assign s0_we_o = m0_we_i;
317 assign s0_cyc_o = m0_cyc_i;
318 assign s0_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[0];
320 assign s1_adr_o = m0_adr_i;
321 assign s1_sel_o = m0_sel_i;
322 assign s1_dat_o = m0_dat_i;
323 assign s1_we_o = m0_we_i;
324 assign s1_cyc_o = m0_cyc_i;
325 assign s1_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[1];
327 assign s2_adr_o = m0_adr_i;
328 assign s2_sel_o = m0_sel_i;
329 assign s2_dat_o = m0_dat_i;
330 assign s2_we_o = m0_we_i;
331 assign s2_cyc_o = m0_cyc_i;
332 assign s2_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[2];
334 assign s3_adr_o = m0_adr_i;
335 assign s3_sel_o = m0_sel_i;
336 assign s3_dat_o = m0_dat_i;
337 assign s3_we_o = m0_we_i;
338 assign s3_cyc_o = m0_cyc_i;
339 assign s3_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[3];
341 assign s4_adr_o = m0_adr_i;
342 assign s4_sel_o = m0_sel_i;
343 assign s4_dat_o = m0_dat_i;
344 assign s4_we_o = m0_we_i;
345 assign s4_cyc_o = m0_cyc_i;
346 assign s4_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[4];
348 assign s5_adr_o = m0_adr_i;
349 assign s5_sel_o = m0_sel_i;
350 assign s5_dat_o = m0_dat_i;
351 assign s5_we_o = m0_we_i;
352 assign s5_cyc_o = m0_cyc_i;
353 assign s5_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[5];
355 assign s6_adr_o = m0_adr_i;
356 assign s6_sel_o = m0_sel_i;
357 assign s6_dat_o = m0_dat_i;
358 assign s6_we_o = m0_we_i;
359 assign s6_cyc_o = m0_cyc_i;
360 assign s6_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[6];
362 assign s7_adr_o = m0_adr_i;
363 assign s7_sel_o = m0_sel_i;
364 assign s7_dat_o = m0_dat_i;
365 assign s7_we_o = m0_we_i;
366 assign s7_cyc_o = m0_cyc_i;
367 assign s7_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[7];
369 assign s8_adr_o = m0_adr_i;
370 assign s8_sel_o = m0_sel_i;
371 assign s8_dat_o = m0_dat_i;
372 assign s8_we_o = m0_we_i;
373 assign s8_cyc_o = m0_cyc_i;
374 assign s8_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[8];
376 assign s9_adr_o = m0_adr_i;
377 assign s9_sel_o = m0_sel_i;
378 assign s9_dat_o = m0_dat_i;
379 assign s9_we_o = m0_we_i;
380 assign s9_cyc_o = m0_cyc_i;
381 assign s9_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[9];
383 assign sa_adr_o = m0_adr_i;
384 assign sa_sel_o = m0_sel_i;
385 assign sa_dat_o = m0_dat_i;
386 assign sa_we_o = m0_we_i;
387 assign sa_cyc_o = m0_cyc_i;
388 assign sa_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[10];
390 assign sb_adr_o = m0_adr_i;
391 assign sb_sel_o = m0_sel_i;
392 assign sb_dat_o = m0_dat_i;
393 assign sb_we_o = m0_we_i;
394 assign sb_cyc_o = m0_cyc_i;
395 assign sb_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[11];
397 assign sc_adr_o = m0_adr_i;
398 assign sc_sel_o = m0_sel_i;
399 assign sc_dat_o = m0_dat_i;
400 assign sc_we_o = m0_we_i;
401 assign sc_cyc_o = m0_cyc_i;
402 assign sc_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[12];
404 assign sd_adr_o = m0_adr_i;
405 assign sd_sel_o = m0_sel_i;
406 assign sd_dat_o = m0_dat_i;
407 assign sd_we_o = m0_we_i;
408 assign sd_cyc_o = m0_cyc_i;
409 assign sd_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[13];
411 assign se_adr_o = m0_adr_i;
412 assign se_sel_o = m0_sel_i;
413 assign se_dat_o = m0_dat_i;
414 assign se_we_o = m0_we_i;
415 assign se_cyc_o = m0_cyc_i;
416 assign se_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[14];
418 assign sf_adr_o = m0_adr_i;
419 assign sf_sel_o = m0_sel_i;
420 assign sf_dat_o = m0_dat_i;
421 assign sf_we_o = m0_we_i;
422 assign sf_cyc_o = m0_cyc_i;
423 assign sf_stb_o = m0_cyc_i & m0_stb_i & ssel_dec[15];
425 // Address decode logic
426 // WARNING -- must make sure these are mutually exclusive!
429 assign ssel_dec[0] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s0_addr) & s0_mask);
430 assign ssel_dec[1] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s1_addr) & s1_mask);
431 assign ssel_dec[2] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s2_addr) & s2_mask);
432 assign ssel_dec[3] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s3_addr) & s3_mask);
433 assign ssel_dec[4] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s4_addr) & s4_mask);
434 assign ssel_dec[5] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s5_addr) & s5_mask);
435 assign ssel_dec[6] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s6_addr) & s6_mask);
436 assign ssel_dec[7] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s7_addr) & s7_mask);
437 assign ssel_dec[8] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s8_addr) & s8_mask);
438 assign ssel_dec[9] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ s9_addr) & s9_mask);
439 assign ssel_dec[10] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sa_addr) & sa_mask);
440 assign ssel_dec[11] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sb_addr) & sb_mask);
441 assign ssel_dec[12] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sc_addr) & sc_mask);
442 assign ssel_dec[13] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sd_addr) & sd_mask);
443 assign ssel_dec[14] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ se_addr) & se_mask);
444 assign ssel_dec[15] = ~|((m0_adr_i[aw-1:aw-decode_w] ^ sf_addr) & sf_mask);
447 assign ssel_dec[0] = (m0_adr_i[aw -1 : aw - decode_w ] == s0_addr);
448 assign ssel_dec[1] = (m0_adr_i[aw -1 : aw - decode_w ] == s1_addr);
449 assign ssel_dec[2] = (m0_adr_i[aw -1 : aw - decode_w ] == s2_addr);
450 assign ssel_dec[3] = (m0_adr_i[aw -1 : aw - decode_w ] == s3_addr);
451 assign ssel_dec[4] = (m0_adr_i[aw -1 : aw - decode_w ] == s4_addr);
452 assign ssel_dec[5] = (m0_adr_i[aw -1 : aw - decode_w ] == s5_addr);
453 assign ssel_dec[6] = (m0_adr_i[aw -1 : aw - decode_w ] == s6_addr);
454 assign ssel_dec[7] = (m0_adr_i[aw -1 : aw - decode_w ] == s7_addr);
455 assign ssel_dec[8] = (m0_adr_i[aw -1 : aw - decode_w ] == s8_addr);
456 assign ssel_dec[9] = (m0_adr_i[aw -1 : aw - decode_w ] == s9_addr);
457 assign ssel_dec[10] = (m0_adr_i[aw -1 : aw - decode_w ] == sa_addr);
458 assign ssel_dec[11] = (m0_adr_i[aw -1 : aw - decode_w ] == sb_addr);
459 assign ssel_dec[12] = (m0_adr_i[aw -1 : aw - decode_w ] == sc_addr);
460 assign ssel_dec[13] = (m0_adr_i[aw -1 : aw - decode_w ] == sd_addr);
461 assign ssel_dec[14] = (m0_adr_i[aw -1 : aw - decode_w ] == se_addr);
462 assign ssel_dec[15] = (m0_adr_i[aw -1 : aw - decode_w ] == sf_addr);
464 endmodule // wb_1master