Copied wb_1master back from quad radio
[debian/gnuradio] / usrp2 / fpga / control_lib / wb_1master.v
1 /////////////////////////////////////////////////////////////////////
2 ////                                                             ////
3 ////  WISHBONE Connection Bus Top Level                          ////
4 ////                                                             ////
5 ////                                                             ////
6 ////  Original Author: Johny Chi                                 ////
7 ////                   chisuhua@yahoo.com.cn                     ////
8 ////  Modified By Matt Ettus, matt@ettus.com                     ////
9 ////                                                             ////
10 ////                                                             ////
11 /////////////////////////////////////////////////////////////////////
12 ////                                                              ////
13 //// Copyright (C) 2000, 2007 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 //   Up to 8 slaves share a Wishbone Bus connection to 1 master
39
40   module wb_1master
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
74             
75       parameter dw = 32,                // Data bus Width
76       parameter aw = 32,                // Address bus Width
77       parameter sw = 4)                 // Number of Select Lines
78       
79       (input clk_i, 
80        input rst_i,
81        
82        // Master  Interface
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,
87        input            m0_we_i,
88        input            m0_cyc_i,
89        input            m0_stb_i,
90        output           m0_ack_o,
91        output           m0_err_o,
92        output           m0_rty_o,
93        
94        // Slave Interfaces
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,
99        output           s0_we_o,
100        output           s0_cyc_o,
101        output           s0_stb_o,
102        input            s0_ack_i,
103        input            s0_err_i,
104        input            s0_rty_i,
105        
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,
110        output           s1_we_o,
111        output           s1_cyc_o,
112        output           s1_stb_o,
113        input            s1_ack_i,
114        input            s1_err_i,
115        input            s1_rty_i,
116        
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,
121        output           s2_we_o,
122        output           s2_cyc_o,
123        output           s2_stb_o,
124        input            s2_ack_i,
125        input            s2_err_i,
126        input            s2_rty_i,
127        
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,
132        output           s3_we_o,
133        output           s3_cyc_o,
134        output           s3_stb_o,
135        input            s3_ack_i,
136        input            s3_err_i,
137        input            s3_rty_i,
138        
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,
143        output           s4_we_o,
144        output           s4_cyc_o,
145        output           s4_stb_o,
146        input            s4_ack_i,
147        input            s4_err_i,
148        input            s4_rty_i,
149        
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,
154        output           s5_we_o,
155        output           s5_cyc_o,
156        output           s5_stb_o,
157        input            s5_ack_i,
158        input            s5_err_i,
159        input            s5_rty_i,
160        
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,
165        output           s6_we_o,
166        output           s6_cyc_o,
167        output           s6_stb_o,
168        input            s6_ack_i,
169        input            s6_err_i,
170        input            s6_rty_i,
171        
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,
176        output           s7_we_o,
177        output           s7_cyc_o,
178        output           s7_stb_o,
179        input            s7_ack_i,
180        input            s7_err_i,
181        input            s7_rty_i,
182
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,
187        output           s8_we_o,
188        output           s8_cyc_o,
189        output           s8_stb_o,
190        input            s8_ack_i,
191        input            s8_err_i,
192        input            s8_rty_i,
193        
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,
198        output           s9_we_o,
199        output           s9_cyc_o,
200        output           s9_stb_o,
201        input            s9_ack_i,
202        input            s9_err_i,
203        input            s9_rty_i,
204        
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,
209        output           sa_we_o,
210        output           sa_cyc_o,
211        output           sa_stb_o,
212        input            sa_ack_i,
213        input            sa_err_i,
214        input            sa_rty_i,
215        
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,
220        output           sb_we_o,
221        output           sb_cyc_o,
222        output           sb_stb_o,
223        input            sb_ack_i,
224        input            sb_err_i,
225        input            sb_rty_i,
226        
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,
231        output           sc_we_o,
232        output           sc_cyc_o,
233        output           sc_stb_o,
234        input            sc_ack_i,
235        input            sc_err_i,
236        input            sc_rty_i,
237        
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,
242        output           sd_we_o,
243        output           sd_cyc_o,
244        output           sd_stb_o,
245        input            sd_ack_i,
246        input            sd_err_i,
247        input            sd_rty_i,
248        
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,
253        output           se_we_o,
254        output           se_cyc_o,
255        output           se_stb_o,
256        input            se_ack_i,
257        input            se_err_i,
258        input            se_rty_i,
259        
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,
264        output           sf_we_o,
265        output           sf_cyc_o,
266        output           sf_stb_o,
267        input            sf_ack_i,
268        input            sf_err_i,
269        input            sf_rty_i
270        );
271    
272    // ////////////////////////////////////////////////////////////////
273    //
274    // Local wires
275    //
276    
277    wire [15:0]          ssel_dec;
278    reg [dw-1:0]         i_dat_s;        // internal share bus , slave data to master
279    
280    // Master output Interface
281    assign               m0_dat_o = i_dat_s;
282    
283    always @*
284      case(ssel_dec)
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)
303    
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 };
311
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];   
319    
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];   
326    
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];   
333    
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];   
340    
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];   
347    
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];   
354    
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];   
361    
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];   
368    
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];   
375    
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];   
382    
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];   
389    
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];   
396    
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];   
403    
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];   
410    
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];   
417    
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];   
424    
425    // Address decode logic
426    // WARNING -- must make sure these are mutually exclusive!
427
428
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);
445
446 /*
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);
463  */ 
464 endmodule // wb_1master