e56ba1fb2f915e21e26a750a6f063aa19e3383f4
[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 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
60       
61       parameter dw = 32,                // Data bus Width
62       parameter aw = 32,                // Address bus Width
63       parameter sw = 4)                 // Number of Select Lines
64       
65       (input clk_i, 
66        input rst_i,
67        
68        // Master  Interface
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,
73        input            m0_we_i,
74        input            m0_cyc_i,
75        input            m0_stb_i,
76        output           m0_ack_o,
77        output           m0_err_o,
78        output           m0_rty_o,
79        
80        // Slave Interfaces
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,
85        output           s0_we_o,
86        output           s0_cyc_o,
87        output           s0_stb_o,
88        input            s0_ack_i,
89        input            s0_err_i,
90        input            s0_rty_i,
91        
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,
96        output           s1_we_o,
97        output           s1_cyc_o,
98        output           s1_stb_o,
99        input            s1_ack_i,
100        input            s1_err_i,
101        input            s1_rty_i,
102        
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,
107        output           s2_we_o,
108        output           s2_cyc_o,
109        output           s2_stb_o,
110        input            s2_ack_i,
111        input            s2_err_i,
112        input            s2_rty_i,
113        
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,
118        output           s3_we_o,
119        output           s3_cyc_o,
120        output           s3_stb_o,
121        input            s3_ack_i,
122        input            s3_err_i,
123        input            s3_rty_i,
124        
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,
129        output           s4_we_o,
130        output           s4_cyc_o,
131        output           s4_stb_o,
132        input            s4_ack_i,
133        input            s4_err_i,
134        input            s4_rty_i,
135        
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,
140        output           s5_we_o,
141        output           s5_cyc_o,
142        output           s5_stb_o,
143        input            s5_ack_i,
144        input            s5_err_i,
145        input            s5_rty_i,
146        
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,
151        output           s6_we_o,
152        output           s6_cyc_o,
153        output           s6_stb_o,
154        input            s6_ack_i,
155        input            s6_err_i,
156        input            s6_rty_i,
157        
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,
162        output           s7_we_o,
163        output           s7_cyc_o,
164        output           s7_stb_o,
165        input            s7_ack_i,
166        input            s7_err_i,
167        input            s7_rty_i,
168
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,
173        output           s8_we_o,
174        output           s8_cyc_o,
175        output           s8_stb_o,
176        input            s8_ack_i,
177        input            s8_err_i,
178        input            s8_rty_i,
179        
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,
184        output           s9_we_o,
185        output           s9_cyc_o,
186        output           s9_stb_o,
187        input            s9_ack_i,
188        input            s9_err_i,
189        input            s9_rty_i,
190        
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,
195        output           s10_we_o,
196        output           s10_cyc_o,
197        output           s10_stb_o,
198        input            s10_ack_i,
199        input            s10_err_i,
200        input            s10_rty_i,
201        
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,
206        output           s11_we_o,
207        output           s11_cyc_o,
208        output           s11_stb_o,
209        input            s11_ack_i,
210        input            s11_err_i,
211        input            s11_rty_i,
212        
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,
217        output           s12_we_o,
218        output           s12_cyc_o,
219        output           s12_stb_o,
220        input            s12_ack_i,
221        input            s12_err_i,
222        input            s12_rty_i,
223        
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,
228        output           s13_we_o,
229        output           s13_cyc_o,
230        output           s13_stb_o,
231        input            s13_ack_i,
232        input            s13_err_i,
233        input            s13_rty_i,
234        
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,
239        output           s14_we_o,
240        output           s14_cyc_o,
241        output           s14_stb_o,
242        input            s14_ack_i,
243        input            s14_err_i,
244        input            s14_rty_i,
245        
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,
250        output           s15_we_o,
251        output           s15_cyc_o,
252        output           s15_stb_o,
253        input            s15_ack_i,
254        input            s15_err_i,
255        input            s15_rty_i
256        );
257    
258    // ////////////////////////////////////////////////////////////////
259    //
260    // Local wires
261    //
262    
263    wire [15:0]          ssel_dec;
264    reg [dw-1:0]         i_dat_s;        // internal share bus , slave data to master
265    
266    // Master output Interface
267    assign               m0_dat_o = i_dat_s;
268    
269    always @*
270      case(ssel_dec)
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)
289    
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 };
297
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];   
305    
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];   
312    
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];   
319    
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];   
326    
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];   
333    
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];   
340    
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];   
347    
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];   
354    
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];   
361    
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];   
368    
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];   
375    
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];   
382    
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];   
389    
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];   
396    
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];   
403    
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];   
410    
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);
429    
430 endmodule // wb_1master