OpenCores
URL https://opencores.org/ocsvn/plb2wbbridge/plb2wbbridge/trunk

Subversion Repositories plb2wbbridge

[/] [plb2wbbridge/] [trunk/] [systems/] [EDK_Libs/] [WishboneIPLib/] [pcores/] [wb_conbus_v1_00_a/] [hdl/] [verilog/] [wb_conbus_top.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 feddischso
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  WISHBONE Connection Bus Top Level                          ////
4
////                                                             ////
5
////                                                             ////
6
////  Author: Johny Chi                                          ////
7
////          chisuhua@yahoo.com.cn                              ////
8
////                                                             ////
9
////                                                             ////
10
////                                                             ////
11
/////////////////////////////////////////////////////////////////////
12
////                                                              ////
13
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
14
////                                                              ////
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. ////
19
////                                                              ////
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.                                               ////
25
////                                                              ////
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 ////
30
//// details.                                                     ////
31
////                                                              ////
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                     ////
35
////                                                              ////
36
//////////////////////////////////////////////////////////////////////
37
//
38
//  Description
39
//      1. Up to 8 masters and 8 slaves share bus Wishbone connection
40
//      2. no priorty arbitor , 8 masters are processed in a round
41
//         robin way,
42
//      3. if WB_USE_TRISTATE was defined, the share bus is a tristate
43
//         bus, and use less logic resource.
44
//      4. wb_conbus was synthesis to XC2S100-5-PQ208 using synplify,
45
//     Max speed >60M , and 374 SLICE if using Multiplexor bus
46
//              or 150 SLICE if using tri-state bus.
47
//
48
//`include "wb_conbus_defines.v"
49
`define                 dw       32             // Data bus Width
50
`define                 aw       32             // Address bus Width
51
`define                 sw   `dw / 8    // Number of Select Lines
52
`define                 mbusw  `aw + `sw + `dw +4       //address width + byte select width + dat width + cyc + we + stb +cab , input from master interface
53
`define                 sbusw    3      //  ack + err + rty, input from slave interface
54
`define                 mselectw  8     // number of masters
55
`define                 sselectw  8     // number of slavers
56
 
57
//`define               WB_USE_TRISTATE
58
 
59
 
60
module wb_conbus_top(
61
        clk_i, rst_i,
62
 
63
        // Master 0 Interface
64
        m0_dat_i, m0_dat_o, m0_adr_i, m0_sel_i, m0_we_i, m0_cyc_i,
65
        m0_stb_i, m0_ack_o, m0_err_o, m0_rty_o, m0_cab_i,
66
 
67
        // Master 1 Interface
68
        m1_dat_i, m1_dat_o, m1_adr_i, m1_sel_i, m1_we_i, m1_cyc_i,
69
        m1_stb_i, m1_ack_o, m1_err_o, m1_rty_o, m1_cab_i,
70
 
71
        // Master 2 Interface
72
        m2_dat_i, m2_dat_o, m2_adr_i, m2_sel_i, m2_we_i, m2_cyc_i,
73
        m2_stb_i, m2_ack_o, m2_err_o, m2_rty_o, m2_cab_i,
74
 
75
        // Master 3 Interface
76
        m3_dat_i, m3_dat_o, m3_adr_i, m3_sel_i, m3_we_i, m3_cyc_i,
77
        m3_stb_i, m3_ack_o, m3_err_o, m3_rty_o, m3_cab_i,
78
 
79
        // Master 4 Interface
80
        m4_dat_i, m4_dat_o, m4_adr_i, m4_sel_i, m4_we_i, m4_cyc_i,
81
        m4_stb_i, m4_ack_o, m4_err_o, m4_rty_o, m4_cab_i,
82
 
83
        // Master 5 Interface
84
        m5_dat_i, m5_dat_o, m5_adr_i, m5_sel_i, m5_we_i, m5_cyc_i,
85
        m5_stb_i, m5_ack_o, m5_err_o, m5_rty_o, m5_cab_i,
86
 
87
        // Master 6 Interface
88
        m6_dat_i, m6_dat_o, m6_adr_i, m6_sel_i, m6_we_i, m6_cyc_i,
89
        m6_stb_i, m6_ack_o, m6_err_o, m6_rty_o, m6_cab_i,
90
 
91
        // Master 7 Interface
92
        m7_dat_i, m7_dat_o, m7_adr_i, m7_sel_i, m7_we_i, m7_cyc_i,
93
        m7_stb_i, m7_ack_o, m7_err_o, m7_rty_o, m7_cab_i,
94
 
95
        // Slave 0 Interface
96
        s0_dat_i, s0_dat_o, s0_adr_o, s0_sel_o, s0_we_o, s0_cyc_o,
97
        s0_stb_o, s0_ack_i, s0_err_i, s0_rty_i, s0_cab_o,
98
 
99
        // Slave 1 Interface
100
        s1_dat_i, s1_dat_o, s1_adr_o, s1_sel_o, s1_we_o, s1_cyc_o,
101
        s1_stb_o, s1_ack_i, s1_err_i, s1_rty_i, s1_cab_o,
102
 
103
        // Slave 2 Interface
104
        s2_dat_i, s2_dat_o, s2_adr_o, s2_sel_o, s2_we_o, s2_cyc_o,
105
        s2_stb_o, s2_ack_i, s2_err_i, s2_rty_i, s2_cab_o,
106
 
107
        // Slave 3 Interface
108
        s3_dat_i, s3_dat_o, s3_adr_o, s3_sel_o, s3_we_o, s3_cyc_o,
109
        s3_stb_o, s3_ack_i, s3_err_i, s3_rty_i, s3_cab_o,
110
 
111
        // Slave 4 Interface
112
        s4_dat_i, s4_dat_o, s4_adr_o, s4_sel_o, s4_we_o, s4_cyc_o,
113
        s4_stb_o, s4_ack_i, s4_err_i, s4_rty_i, s4_cab_o,
114
 
115
        // Slave 5 Interface
116
        s5_dat_i, s5_dat_o, s5_adr_o, s5_sel_o, s5_we_o, s5_cyc_o,
117
        s5_stb_o, s5_ack_i, s5_err_i, s5_rty_i, s5_cab_o,
118
 
119
        // Slave 6 Interface
120
        s6_dat_i, s6_dat_o, s6_adr_o, s6_sel_o, s6_we_o, s6_cyc_o,
121
        s6_stb_o, s6_ack_i, s6_err_i, s6_rty_i, s6_cab_o,
122
 
123
        // Slave 7 Interface
124
        s7_dat_i, s7_dat_o, s7_adr_o, s7_sel_o, s7_we_o, s7_cyc_o,
125
        s7_stb_o, s7_ack_i, s7_err_i, s7_rty_i, s7_cab_o
126
 
127
        );
128
 
129
////////////////////////////////////////////////////////////////////
130
//
131
// Module Parameters
132
//
133
 
134
 
135
parameter               s0_addr_w = 4 ;                 // slave 0 address decode width
136
parameter               s0_addr = 4'h0;                 // slave 0 address
137
parameter               s1_addr_w = 4 ;                 // slave 1 address decode width
138
parameter               s1_addr = 4'h1;                 // slave 1 address 
139
parameter               s27_addr_w = 8 ;                // slave 2 to slave 7 address decode width
140
parameter               s2_addr = 8'h92;                // slave 2 address
141
parameter               s3_addr = 8'h93;                // slave 3 address
142
parameter               s4_addr = 8'h94;                // slave 4 address
143
parameter               s5_addr = 8'h95;                // slave 5 address
144
parameter               s6_addr = 8'h96;                // slave 6 address
145
parameter               s7_addr = 8'h97;                // slave 7 address
146
 
147
 
148
////////////////////////////////////////////////////////////////////
149
//
150
// Module IOs
151
//
152
 
153
input           clk_i, rst_i;
154
 
155
// Master 0 Interface
156
input   [`dw-1:0]        m0_dat_i;
157
output  [`dw-1:0]        m0_dat_o;
158
input   [`aw-1:0]        m0_adr_i;
159
input   [`sw-1:0]        m0_sel_i;
160
input                   m0_we_i;
161
input                   m0_cyc_i;
162
input                   m0_stb_i;
163
input                   m0_cab_i;
164
output                  m0_ack_o;
165
output                  m0_err_o;
166
output                  m0_rty_o;
167
 
168
// Master 1 Interface
169
input   [`dw-1:0]        m1_dat_i;
170
output  [`dw-1:0]        m1_dat_o;
171
input   [`aw-1:0]        m1_adr_i;
172
input   [`sw-1:0]        m1_sel_i;
173
input                   m1_we_i;
174
input                   m1_cyc_i;
175
input                   m1_stb_i;
176
input                   m1_cab_i;
177
output                  m1_ack_o;
178
output                  m1_err_o;
179
output                  m1_rty_o;
180
 
181
// Master 2 Interface
182
input   [`dw-1:0]        m2_dat_i;
183
output  [`dw-1:0]        m2_dat_o;
184
input   [`aw-1:0]        m2_adr_i;
185
input   [`sw-1:0]        m2_sel_i;
186
input                   m2_we_i;
187
input                   m2_cyc_i;
188
input                   m2_stb_i;
189
input                   m2_cab_i;
190
output                  m2_ack_o;
191
output                  m2_err_o;
192
output                  m2_rty_o;
193
 
194
// Master 3 Interface
195
input   [`dw-1:0]        m3_dat_i;
196
output  [`dw-1:0]        m3_dat_o;
197
input   [`aw-1:0]        m3_adr_i;
198
input   [`sw-1:0]        m3_sel_i;
199
input                   m3_we_i;
200
input                   m3_cyc_i;
201
input                   m3_stb_i;
202
input                   m3_cab_i;
203
output                  m3_ack_o;
204
output                  m3_err_o;
205
output                  m3_rty_o;
206
 
207
// Master 4 Interface
208
input   [`dw-1:0]        m4_dat_i;
209
output  [`dw-1:0]        m4_dat_o;
210
input   [`aw-1:0]        m4_adr_i;
211
input   [`sw-1:0]        m4_sel_i;
212
input                   m4_we_i;
213
input                   m4_cyc_i;
214
input                   m4_stb_i;
215
input                   m4_cab_i;
216
output                  m4_ack_o;
217
output                  m4_err_o;
218
output                  m4_rty_o;
219
 
220
// Master 5 Interface
221
input   [`dw-1:0]        m5_dat_i;
222
output  [`dw-1:0]        m5_dat_o;
223
input   [`aw-1:0]        m5_adr_i;
224
input   [`sw-1:0]        m5_sel_i;
225
input                   m5_we_i;
226
input                   m5_cyc_i;
227
input                   m5_stb_i;
228
input                   m5_cab_i;
229
output                  m5_ack_o;
230
output                  m5_err_o;
231
output                  m5_rty_o;
232
 
233
// Master 6 Interface
234
input   [`dw-1:0]        m6_dat_i;
235
output  [`dw-1:0]        m6_dat_o;
236
input   [`aw-1:0]        m6_adr_i;
237
input   [`sw-1:0]        m6_sel_i;
238
input                   m6_we_i;
239
input                   m6_cyc_i;
240
input                   m6_stb_i;
241
input                   m6_cab_i;
242
output                  m6_ack_o;
243
output                  m6_err_o;
244
output                  m6_rty_o;
245
 
246
// Master 7 Interface
247
input   [`dw-1:0]        m7_dat_i;
248
output  [`dw-1:0]        m7_dat_o;
249
input   [`aw-1:0]        m7_adr_i;
250
input   [`sw-1:0]        m7_sel_i;
251
input                   m7_we_i;
252
input                   m7_cyc_i;
253
input                   m7_stb_i;
254
input                   m7_cab_i;
255
output                  m7_ack_o;
256
output                  m7_err_o;
257
output                  m7_rty_o;
258
 
259
// Slave 0 Interface
260
input   [`dw-1:0]        s0_dat_i;
261
output  [`dw-1:0]        s0_dat_o;
262
output  [`aw-1:0]        s0_adr_o;
263
output  [`sw-1:0]        s0_sel_o;
264
output                  s0_we_o;
265
output                  s0_cyc_o;
266
output                  s0_stb_o;
267
output                  s0_cab_o;
268
input                   s0_ack_i;
269
input                   s0_err_i;
270
input                   s0_rty_i;
271
 
272
// Slave 1 Interface
273
input   [`dw-1:0]        s1_dat_i;
274
output  [`dw-1:0]        s1_dat_o;
275
output  [`aw-1:0]        s1_adr_o;
276
output  [`sw-1:0]        s1_sel_o;
277
output                  s1_we_o;
278
output                  s1_cyc_o;
279
output                  s1_stb_o;
280
output                  s1_cab_o;
281
input                   s1_ack_i;
282
input                   s1_err_i;
283
input                   s1_rty_i;
284
 
285
// Slave 2 Interface
286
input   [`dw-1:0]        s2_dat_i;
287
output  [`dw-1:0]        s2_dat_o;
288
output  [`aw-1:0]        s2_adr_o;
289
output  [`sw-1:0]        s2_sel_o;
290
output                  s2_we_o;
291
output                  s2_cyc_o;
292
output                  s2_stb_o;
293
output                  s2_cab_o;
294
input                   s2_ack_i;
295
input                   s2_err_i;
296
input                   s2_rty_i;
297
 
298
// Slave 3 Interface
299
input   [`dw-1:0]        s3_dat_i;
300
output  [`dw-1:0]        s3_dat_o;
301
output  [`aw-1:0]        s3_adr_o;
302
output  [`sw-1:0]        s3_sel_o;
303
output                  s3_we_o;
304
output                  s3_cyc_o;
305
output                  s3_stb_o;
306
output                  s3_cab_o;
307
input                   s3_ack_i;
308
input                   s3_err_i;
309
input                   s3_rty_i;
310
 
311
// Slave 4 Interface
312
input   [`dw-1:0]        s4_dat_i;
313
output  [`dw-1:0]        s4_dat_o;
314
output  [`aw-1:0]        s4_adr_o;
315
output  [`sw-1:0]        s4_sel_o;
316
output                  s4_we_o;
317
output                  s4_cyc_o;
318
output                  s4_stb_o;
319
output                  s4_cab_o;
320
input                   s4_ack_i;
321
input                   s4_err_i;
322
input                   s4_rty_i;
323
 
324
// Slave 5 Interface
325
input   [`dw-1:0]        s5_dat_i;
326
output  [`dw-1:0]        s5_dat_o;
327
output  [`aw-1:0]        s5_adr_o;
328
output  [`sw-1:0]        s5_sel_o;
329
output                  s5_we_o;
330
output                  s5_cyc_o;
331
output                  s5_stb_o;
332
output                  s5_cab_o;
333
input                   s5_ack_i;
334
input                   s5_err_i;
335
input                   s5_rty_i;
336
 
337
// Slave 6 Interface
338
input   [`dw-1:0]        s6_dat_i;
339
output  [`dw-1:0]        s6_dat_o;
340
output  [`aw-1:0]        s6_adr_o;
341
output  [`sw-1:0]        s6_sel_o;
342
output                  s6_we_o;
343
output                  s6_cyc_o;
344
output                  s6_stb_o;
345
output                  s6_cab_o;
346
input                   s6_ack_i;
347
input                   s6_err_i;
348
input                   s6_rty_i;
349
 
350
// Slave 7 Interface
351
input   [`dw-1:0]        s7_dat_i;
352
output  [`dw-1:0]        s7_dat_o;
353
output  [`aw-1:0]        s7_adr_o;
354
output  [`sw-1:0]        s7_sel_o;
355
output                  s7_we_o;
356
output                  s7_cyc_o;
357
output                  s7_stb_o;
358
output                  s7_cab_o;
359
input                   s7_ack_i;
360
input                   s7_err_i;
361
input                   s7_rty_i;
362
 
363
 
364
////////////////////////////////////////////////////////////////////
365
//
366
// Local wires
367
//
368
 
369
wire    [`mselectw -1:0] i_gnt_arb;
370
wire    [2:0]    gnt;
371
reg     [`sselectw -1:0] i_ssel_dec;
372
`ifdef  WB_USE_TRISTATE
373
wire    [`mbusw -1:0]    i_bus_m;
374
`else
375
reg             [`mbusw -1:0]    i_bus_m;                // internal share bus, master data and control to slave
376
`endif
377
wire            [`dw -1:0]               i_dat_s;        // internal share bus , slave data to master
378
wire    [`sbusw -1:0]    i_bus_s;                        // internal share bus , slave control to master
379
 
380
 
381
 
382
 
383
////////////////////////////////////////////////////////////////////
384
//
385
// Master output Interfaces
386
//
387
 
388
// master0
389
assign  m0_dat_o = i_dat_s;
390
assign  {m0_ack_o, m0_err_o, m0_rty_o} = i_bus_s & {3{i_gnt_arb[0]}};
391
 
392
// master1
393
assign  m1_dat_o = i_dat_s;
394
assign  {m1_ack_o, m1_err_o, m1_rty_o} = i_bus_s & {3{i_gnt_arb[1]}};
395
 
396
// master2
397
 
398
assign  m2_dat_o = i_dat_s;
399
assign  {m2_ack_o, m2_err_o, m2_rty_o} = i_bus_s & {3{i_gnt_arb[2]}};
400
 
401
// master3
402
 
403
assign  m3_dat_o = i_dat_s;
404
assign  {m3_ack_o, m3_err_o, m3_rty_o} = i_bus_s & {3{i_gnt_arb[3]}};
405
 
406
// master4
407
 
408
assign  m4_dat_o = i_dat_s;
409
assign  {m4_ack_o, m4_err_o, m4_rty_o} = i_bus_s & {3{i_gnt_arb[4]}};
410
 
411
// master5
412
 
413
assign  m5_dat_o = i_dat_s;
414
assign  {m5_ack_o, m5_err_o, m5_rty_o} = i_bus_s & {3{i_gnt_arb[5]}};
415
 
416
// master6
417
 
418
assign  m6_dat_o = i_dat_s;
419
assign  {m6_ack_o, m6_err_o, m6_rty_o} = i_bus_s & {3{i_gnt_arb[6]}};
420
 
421
// master7
422
 
423
assign  m7_dat_o = i_dat_s;
424
assign  {m7_ack_o, m7_err_o, m7_rty_o} = i_bus_s & {3{i_gnt_arb[7]}};
425
 
426
 
427
assign  i_bus_s = {s0_ack_i | s1_ack_i | s2_ack_i | s3_ack_i | s4_ack_i | s5_ack_i | s6_ack_i | s7_ack_i ,
428
                                   s0_err_i | s1_err_i | s2_err_i | s3_err_i | s4_err_i | s5_err_i | s6_err_i | s7_err_i ,
429
                                   s0_rty_i | s1_rty_i | s2_rty_i | s3_rty_i | s4_rty_i | s5_rty_i | s6_rty_i | s7_rty_i };
430
 
431
////////////////////////////////
432
//      Slave output interface
433
//
434
// slave0
435
assign  {s0_adr_o, s0_sel_o, s0_dat_o, s0_we_o, s0_cab_o,s0_cyc_o} = i_bus_m[`mbusw -1:1];
436
assign  s0_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[0];  // stb_o = cyc_i & stb_i & i_ssel_dec
437
 
438
// slave1
439
 
440
assign  {s1_adr_o, s1_sel_o, s1_dat_o, s1_we_o, s1_cab_o, s1_cyc_o} = i_bus_m[`mbusw -1:1];
441
assign  s1_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[1];
442
 
443
// slave2
444
 
445
assign  {s2_adr_o, s2_sel_o, s2_dat_o, s2_we_o, s2_cab_o, s2_cyc_o} = i_bus_m[`mbusw -1:1];
446
assign  s2_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[2];
447
 
448
// slave3
449
 
450
assign  {s3_adr_o, s3_sel_o, s3_dat_o, s3_we_o, s3_cab_o, s3_cyc_o} = i_bus_m[`mbusw -1:1];
451
assign  s3_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[3];
452
 
453
// slave4
454
 
455
assign  {s4_adr_o, s4_sel_o, s4_dat_o, s4_we_o, s4_cab_o, s4_cyc_o} = i_bus_m[`mbusw -1:1];
456
assign  s4_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[4];
457
 
458
// slave5
459
 
460
assign  {s5_adr_o, s5_sel_o, s5_dat_o, s5_we_o, s5_cab_o, s5_cyc_o} = i_bus_m[`mbusw -1:1];
461
assign  s5_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[5];
462
 
463
// slave6
464
 
465
assign  {s6_adr_o, s6_sel_o, s6_dat_o, s6_we_o, s6_cab_o, s6_cyc_o} = i_bus_m[`mbusw -1:1];
466
assign  s6_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[6];
467
 
468
// slave7
469
 
470
assign  {s7_adr_o, s7_sel_o, s7_dat_o, s7_we_o, s7_cab_o, s7_cyc_o} = i_bus_m[`mbusw -1:1];
471
assign  s7_stb_o = i_bus_m[1] & i_bus_m[0] & i_ssel_dec[7];
472
 
473
///////////////////////////////////////
474
//      Master and Slave input interface
475
//
476
 
477
`ifdef  WB_USE_TRISTATE
478
// input from master interface
479
assign  i_bus_m = i_gnt_arb[0] ? {m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i, m0_stb_i} : 72'bz ;
480
assign  i_bus_m = i_gnt_arb[1] ? {m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i,m1_cyc_i, m1_stb_i} : 72'bz ;
481
assign  i_bus_m = i_gnt_arb[2] ? {m2_adr_i, m2_sel_i, m2_dat_i,  m2_we_i, m2_cab_i, m2_cyc_i, m2_stb_i} : 72'bz ;
482
assign  i_bus_m = i_gnt_arb[3] ? {m3_adr_i, m3_sel_i, m3_dat_i,  m3_we_i, m3_cab_i, m3_cyc_i, m3_stb_i} : 72'bz ;
483
assign  i_bus_m = i_gnt_arb[4] ? {m4_adr_i, m4_sel_i, m4_dat_i,  m4_we_i, m4_cab_i, m4_cyc_i, m4_stb_i} : 72'bz ;
484
assign  i_bus_m = i_gnt_arb[5] ? {m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,  m5_stb_i} : 72'bz ;
485
assign  i_bus_m = i_gnt_arb[6] ? {m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i, m6_stb_i} : 72'bz ;
486
assign  i_bus_m = i_gnt_arb[7] ? {m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i} : 72'bz ;
487
// input from slave interface
488
assign  i_dat_s = i_ssel_dec[0] ? s0_dat_i: 32'bz;
489
assign  i_dat_s = i_ssel_dec[1] ? s1_dat_i: 32'bz;
490
assign  i_dat_s = i_ssel_dec[2] ? s2_dat_i: 32'bz;
491
assign  i_dat_s = i_ssel_dec[3] ? s3_dat_i: 32'bz;
492
assign  i_dat_s = i_ssel_dec[4] ? s4_dat_i: 32'bz;
493
assign  i_dat_s = i_ssel_dec[5] ? s5_dat_i: 32'bz;
494
assign  i_dat_s = i_ssel_dec[6] ? s6_dat_i: 32'bz;
495
assign  i_dat_s = i_ssel_dec[7] ? s7_dat_i: 32'bz;
496
 
497
`else
498
 
499
always @(gnt , m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i,
500
                m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i, m1_cyc_i,m1_stb_i,
501
                m2_adr_i, m2_sel_i, m2_dat_i, m2_we_i, m2_cab_i, m2_cyc_i,m2_stb_i,
502
                m3_adr_i, m3_sel_i, m3_dat_i, m3_we_i, m3_cab_i, m3_cyc_i,m3_stb_i,
503
                m4_adr_i, m4_sel_i, m4_dat_i, m4_we_i, m4_cab_i, m4_cyc_i,m4_stb_i,
504
                m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,m5_stb_i,
505
                m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i,m6_stb_i,
506
                m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i)
507
                case(gnt)
508
                        3'h0:   i_bus_m = {m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i};
509
                        3'h1:   i_bus_m = {m1_adr_i, m1_sel_i, m1_dat_i, m1_we_i, m1_cab_i, m1_cyc_i,m1_stb_i};
510
                        3'h2:   i_bus_m = {m2_adr_i, m2_sel_i, m2_dat_i, m2_we_i, m2_cab_i, m2_cyc_i,m2_stb_i};
511
                        3'h3:   i_bus_m = {m3_adr_i, m3_sel_i, m3_dat_i, m3_we_i, m3_cab_i, m3_cyc_i,m3_stb_i};
512
                        3'h4:   i_bus_m = {m4_adr_i, m4_sel_i, m4_dat_i, m4_we_i, m4_cab_i, m4_cyc_i,m4_stb_i};
513
                        3'h5:   i_bus_m = {m5_adr_i, m5_sel_i, m5_dat_i, m5_we_i, m5_cab_i, m5_cyc_i,m5_stb_i};
514
                        3'h6:   i_bus_m = {m6_adr_i, m6_sel_i, m6_dat_i, m6_we_i, m6_cab_i, m6_cyc_i,m6_stb_i};
515
                        3'h7:   i_bus_m = {m7_adr_i, m7_sel_i, m7_dat_i, m7_we_i, m7_cab_i, m7_cyc_i,m7_stb_i};
516
                        default:i_bus_m =  72'b0;//{m0_adr_i, m0_sel_i, m0_dat_i, m0_we_i, m0_cab_i, m0_cyc_i,m0_stb_i};
517
endcase
518
 
519
assign  i_dat_s = i_ssel_dec[0] ? s0_dat_i :
520
                                  i_ssel_dec[1] ? s1_dat_i :
521
                                  i_ssel_dec[2] ? s2_dat_i :
522
                                  i_ssel_dec[3] ? s3_dat_i :
523
                                  i_ssel_dec[4] ? s4_dat_i :
524
                                  i_ssel_dec[5] ? s5_dat_i :
525
                                  i_ssel_dec[6] ? s6_dat_i :
526
                                  i_ssel_dec[7] ? s7_dat_i : {`dw{1'b0}};
527
`endif
528
//
529
// arbitor 
530
//
531
assign i_gnt_arb[0] = (gnt == 3'd0);
532
assign i_gnt_arb[1] = (gnt == 3'd1);
533
assign i_gnt_arb[2] = (gnt == 3'd2);
534
assign i_gnt_arb[3] = (gnt == 3'd3);
535
assign i_gnt_arb[4] = (gnt == 3'd4);
536
assign i_gnt_arb[5] = (gnt == 3'd5);
537
assign i_gnt_arb[6] = (gnt == 3'd6);
538
assign i_gnt_arb[7] = (gnt == 3'd7);
539
 
540
wb_conbus_arb   wb_conbus_arb(
541
        .clk(clk_i),
542
        .rst(rst_i),
543
        .req({  m7_cyc_i,
544
                m6_cyc_i,
545
                m5_cyc_i,
546
                m4_cyc_i,
547
                m3_cyc_i,
548
                m2_cyc_i,
549
                m1_cyc_i,
550
                m0_cyc_i}),
551
        .gnt(gnt)
552
);
553
 
554
//////////////////////////////////
555
//              address decode logic
556
//
557
wire [7:0]       m0_ssel_dec, m1_ssel_dec, m2_ssel_dec, m3_ssel_dec, m4_ssel_dec, m5_ssel_dec, m6_ssel_dec, m7_ssel_dec;
558
always @(gnt, m0_ssel_dec, m1_ssel_dec, m2_ssel_dec, m3_ssel_dec, m4_ssel_dec, m5_ssel_dec, m6_ssel_dec, m7_ssel_dec)
559
        case(gnt)
560
                3'h0: i_ssel_dec = m0_ssel_dec;
561
                3'h1: i_ssel_dec = m1_ssel_dec;
562
                3'h2: i_ssel_dec = m2_ssel_dec;
563
                3'h3: i_ssel_dec = m3_ssel_dec;
564
                3'h4: i_ssel_dec = m4_ssel_dec;
565
                3'h5: i_ssel_dec = m5_ssel_dec;
566
                3'h6: i_ssel_dec = m6_ssel_dec;
567
                3'h7: i_ssel_dec = m7_ssel_dec;
568
                default: i_ssel_dec = 7'b0;
569
endcase
570
//
571
//      decode all master address before arbitor for running faster
572
//      
573
assign m0_ssel_dec[0] = (m0_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
574
assign m0_ssel_dec[1] = (m0_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
575
assign m0_ssel_dec[2] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
576
assign m0_ssel_dec[3] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
577
assign m0_ssel_dec[4] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
578
assign m0_ssel_dec[5] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
579
assign m0_ssel_dec[6] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
580
assign m0_ssel_dec[7] = (m0_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
581
 
582
assign m1_ssel_dec[0] = (m1_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
583
assign m1_ssel_dec[1] = (m1_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
584
assign m1_ssel_dec[2] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
585
assign m1_ssel_dec[3] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
586
assign m1_ssel_dec[4] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
587
assign m1_ssel_dec[5] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
588
assign m1_ssel_dec[6] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
589
assign m1_ssel_dec[7] = (m1_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
590
 
591
assign m2_ssel_dec[0] = (m2_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
592
assign m2_ssel_dec[1] = (m2_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
593
assign m2_ssel_dec[2] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
594
assign m2_ssel_dec[3] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
595
assign m2_ssel_dec[4] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
596
assign m2_ssel_dec[5] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
597
assign m2_ssel_dec[6] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
598
assign m2_ssel_dec[7] = (m2_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
599
 
600
assign m3_ssel_dec[0] = (m3_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
601
assign m3_ssel_dec[1] = (m3_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
602
assign m3_ssel_dec[2] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
603
assign m3_ssel_dec[3] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
604
assign m3_ssel_dec[4] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
605
assign m3_ssel_dec[5] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
606
assign m3_ssel_dec[6] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
607
assign m3_ssel_dec[7] = (m3_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
608
 
609
assign m4_ssel_dec[0] = (m4_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
610
assign m4_ssel_dec[1] = (m4_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
611
assign m4_ssel_dec[2] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
612
assign m4_ssel_dec[3] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
613
assign m4_ssel_dec[4] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
614
assign m4_ssel_dec[5] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
615
assign m4_ssel_dec[6] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
616
assign m4_ssel_dec[7] = (m4_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
617
 
618
assign m5_ssel_dec[0] = (m5_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
619
assign m5_ssel_dec[1] = (m5_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
620
assign m5_ssel_dec[2] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
621
assign m5_ssel_dec[3] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
622
assign m5_ssel_dec[4] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
623
assign m5_ssel_dec[5] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
624
assign m5_ssel_dec[6] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
625
assign m5_ssel_dec[7] = (m5_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
626
 
627
assign m6_ssel_dec[0] = (m6_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
628
assign m6_ssel_dec[1] = (m6_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
629
assign m6_ssel_dec[2] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
630
assign m6_ssel_dec[3] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
631
assign m6_ssel_dec[4] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
632
assign m6_ssel_dec[5] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
633
assign m6_ssel_dec[6] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
634
assign m6_ssel_dec[7] = (m6_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
635
 
636
assign m7_ssel_dec[0] = (m7_adr_i[`aw -1 : `aw - s0_addr_w ] == s0_addr);
637
assign m7_ssel_dec[1] = (m7_adr_i[`aw -1 : `aw - s1_addr_w ] == s1_addr);
638
assign m7_ssel_dec[2] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s2_addr);
639
assign m7_ssel_dec[3] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s3_addr);
640
assign m7_ssel_dec[4] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s4_addr);
641
assign m7_ssel_dec[5] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s5_addr);
642
assign m7_ssel_dec[6] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s6_addr);
643
assign m7_ssel_dec[7] = (m7_adr_i[`aw -1 : `aw - s27_addr_w ] == s7_addr);
644
 
645
//assign i_ssel_dec[0] = (i_bus_m[`mbusw -1 : `mbusw - s0_addr_w ] == s0_addr);
646
//assign i_ssel_dec[1] = (i_bus_m[`mbusw -1 : `mbusw - s1_addr_w ] == s1_addr);
647
//assign i_ssel_dec[2] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s2_addr);
648
//assign i_ssel_dec[3] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s3_addr);
649
//assign i_ssel_dec[4] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s4_addr);
650
//assign i_ssel_dec[5] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s5_addr);
651
//assign i_ssel_dec[6] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s6_addr);
652
//assign i_ssel_dec[7] = (i_bus_m[`mbusw -1 : `mbusw - s27_addr_w ] == s7_addr);
653
 
654
 
655
endmodule
656
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.