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

Subversion Repositories amber

[/] [amber/] [trunk/] [hw/] [vlog/] [system/] [wishbone_arbiter.v] - Blame information for rev 82

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 csantifort
//////////////////////////////////////////////////////////////////
2
//                                                              //
3
//  Wishbone Arbiter                                            //
4
//                                                              //
5
//  This file is part of the Amber project                      //
6
//  http://www.opencores.org/project,amber                      //
7
//                                                              //
8
//  Description                                                 //
9
//  Arbitrates between two wishbone masters and 13 wishbone     //
10
//  slave modules. The ethernet MAC wishbone master is given    //
11
//  priority over the Amber core.                               //
12
//                                                              //
13
//  Author(s):                                                  //
14
//      - Conor Santifort, csantifort.amber@gmail.com           //
15
//                                                              //
16
//////////////////////////////////////////////////////////////////
17
//                                                              //
18
// Copyright (C) 2010 Authors and OPENCORES.ORG                 //
19
//                                                              //
20
// This source file may be used and distributed without         //
21
// restriction provided that this copyright statement is not    //
22
// removed from the file and that any derivative work contains  //
23
// the original copyright notice and the associated disclaimer. //
24
//                                                              //
25
// This source file is free software; you can redistribute it   //
26
// and/or modify it under the terms of the GNU Lesser General   //
27
// Public License as published by the Free Software Foundation; //
28
// either version 2.1 of the License, or (at your option) any   //
29
// later version.                                               //
30
//                                                              //
31
// This source is distributed in the hope that it will be       //
32
// useful, but WITHOUT ANY WARRANTY; without even the implied   //
33
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
34
// PURPOSE.  See the GNU Lesser General Public License for more //
35
// details.                                                     //
36
//                                                              //
37
// You should have received a copy of the GNU Lesser General    //
38
// Public License along with this source; if not, download it   //
39
// from http://www.opencores.org/lgpl.shtml                     //
40
//                                                              //
41
//////////////////////////////////////////////////////////////////
42
 
43 35 csantifort
// TODO add module to switch endianess of ethmac i/f
44 2 csantifort
 
45 35 csantifort
module wishbone_arbiter #(
46
parameter WB_DWIDTH  = 32,
47
parameter WB_SWIDTH  = 4
48
)(
49 2 csantifort
 
50 35 csantifort
input                       i_wb_clk,     // WISHBONE clock
51
 
52 61 csantifort
// WISHBONE master 0 - Ethmac
53 35 csantifort
input       [31:0]          i_m0_wb_adr,
54
input       [WB_SWIDTH-1:0] i_m0_wb_sel,
55
input                       i_m0_wb_we,
56
output      [WB_DWIDTH-1:0] o_m0_wb_dat,
57
input       [WB_DWIDTH-1:0] i_m0_wb_dat,
58
input                       i_m0_wb_cyc,
59
input                       i_m0_wb_stb,
60
output                      o_m0_wb_ack,
61
output                      o_m0_wb_err,
62 2 csantifort
 
63
 
64 61 csantifort
// WISHBONE master 1 - Amber
65 35 csantifort
input       [31:0]          i_m1_wb_adr,
66
input       [WB_SWIDTH-1:0] i_m1_wb_sel,
67
input                       i_m1_wb_we,
68
output      [WB_DWIDTH-1:0] o_m1_wb_dat,
69
input       [WB_DWIDTH-1:0] i_m1_wb_dat,
70
input                       i_m1_wb_cyc,
71
input                       i_m1_wb_stb,
72
output                      o_m1_wb_ack,
73
output                      o_m1_wb_err,
74 2 csantifort
 
75
 
76
// WISHBONE slave 0 - Ethmac
77 35 csantifort
output      [31:0]          o_s0_wb_adr,
78
output      [WB_SWIDTH-1:0] o_s0_wb_sel,
79
output                      o_s0_wb_we,
80
input       [WB_DWIDTH-1:0] i_s0_wb_dat,
81
output      [WB_DWIDTH-1:0] o_s0_wb_dat,
82
output                      o_s0_wb_cyc,
83
output                      o_s0_wb_stb,
84
input                       i_s0_wb_ack,
85
input                       i_s0_wb_err,
86 2 csantifort
 
87
 
88
// WISHBONE slave 1 - Boot Memory
89 35 csantifort
output      [31:0]          o_s1_wb_adr,
90
output      [WB_SWIDTH-1:0] o_s1_wb_sel,
91
output                      o_s1_wb_we,
92
input       [WB_DWIDTH-1:0] i_s1_wb_dat,
93
output      [WB_DWIDTH-1:0] o_s1_wb_dat,
94
output                      o_s1_wb_cyc,
95
output                      o_s1_wb_stb,
96
input                       i_s1_wb_ack,
97
input                       i_s1_wb_err,
98 2 csantifort
 
99
 
100
// WISHBONE slave 2 - Main Memory
101 35 csantifort
output      [31:0]          o_s2_wb_adr,
102
output      [WB_SWIDTH-1:0] o_s2_wb_sel,
103
output                      o_s2_wb_we,
104
input       [WB_DWIDTH-1:0] i_s2_wb_dat,
105
output      [WB_DWIDTH-1:0] o_s2_wb_dat,
106
output                      o_s2_wb_cyc,
107
output                      o_s2_wb_stb,
108
input                       i_s2_wb_ack,
109
input                       i_s2_wb_err,
110 2 csantifort
 
111
 
112
// WISHBONE slave 3 - UART 0
113 35 csantifort
output      [31:0]          o_s3_wb_adr,
114
output      [WB_SWIDTH-1:0] o_s3_wb_sel,
115
output                      o_s3_wb_we,
116
input       [WB_DWIDTH-1:0] i_s3_wb_dat,
117
output      [WB_DWIDTH-1:0] o_s3_wb_dat,
118
output                      o_s3_wb_cyc,
119
output                      o_s3_wb_stb,
120
input                       i_s3_wb_ack,
121
input                       i_s3_wb_err,
122 2 csantifort
 
123
 
124
// WISHBONE slave 4 - UART 1
125 35 csantifort
output      [31:0]          o_s4_wb_adr,
126
output      [WB_SWIDTH-1:0] o_s4_wb_sel,
127
output                      o_s4_wb_we,
128
input       [WB_DWIDTH-1:0] i_s4_wb_dat,
129
output      [WB_DWIDTH-1:0] o_s4_wb_dat,
130
output                      o_s4_wb_cyc,
131
output                      o_s4_wb_stb,
132
input                       i_s4_wb_ack,
133
input                       i_s4_wb_err,
134 2 csantifort
 
135
 
136
// WISHBONE slave 5 - Test Module
137 35 csantifort
output      [31:0]          o_s5_wb_adr,
138
output      [WB_SWIDTH-1:0] o_s5_wb_sel,
139
output                      o_s5_wb_we,
140
input       [WB_DWIDTH-1:0] i_s5_wb_dat,
141
output      [WB_DWIDTH-1:0] o_s5_wb_dat,
142
output                      o_s5_wb_cyc,
143
output                      o_s5_wb_stb,
144
input                       i_s5_wb_ack,
145
input                       i_s5_wb_err,
146 2 csantifort
 
147
 
148
// WISHBONE slave 6 - Timer Module
149 35 csantifort
output      [31:0]          o_s6_wb_adr,
150
output      [WB_SWIDTH-1:0] o_s6_wb_sel,
151
output                      o_s6_wb_we,
152
input       [WB_DWIDTH-1:0] i_s6_wb_dat,
153
output      [WB_DWIDTH-1:0] o_s6_wb_dat,
154
output                      o_s6_wb_cyc,
155
output                      o_s6_wb_stb,
156
input                       i_s6_wb_ack,
157
input                       i_s6_wb_err,
158 2 csantifort
 
159
 
160
 // WISHBONE slave 7 - Interrupt Controller
161 35 csantifort
output      [31:0]          o_s7_wb_adr,
162
output      [WB_SWIDTH-1:0] o_s7_wb_sel,
163
output                      o_s7_wb_we,
164
input       [WB_DWIDTH-1:0] i_s7_wb_dat,
165
output      [WB_DWIDTH-1:0] o_s7_wb_dat,
166
output                      o_s7_wb_cyc,
167
output                      o_s7_wb_stb,
168
input                       i_s7_wb_ack,
169
input                       i_s7_wb_err
170 2 csantifort
);
171
 
172 82 csantifort
`include "memory_configuration.vh"
173
 
174 35 csantifort
reg         m0_wb_hold_r = 'd0;
175
reg         m1_wb_hold_r = 'd0;
176
// wire        m0_in_cycle;
177
// wire        m1_in_cycle;
178 2 csantifort
wire        current_master;
179
reg         current_master_r = 'd0;
180
wire        next_master;
181
wire        select_master;
182
wire [3:0]  current_slave;
183
 
184 35 csantifort
wire [31:0]             master_adr;
185
wire [WB_SWIDTH-1:0]    master_sel;
186
wire                    master_we;
187
wire [WB_DWIDTH-1:0]    master_wdat;
188
wire                    master_cyc;
189
wire                    master_stb;
190
wire [WB_DWIDTH-1:0]    master_rdat;
191
wire                    master_ack;
192
wire                    master_err;
193 2 csantifort
 
194 35 csantifort
 
195 2 csantifort
// Arbitrate between m0 and m1. Ethmac (m0) always gets priority
196
assign next_master    = i_m0_wb_cyc ? 1'd0 : 1'd1;
197
 
198
// Use cyc signal for arbitration so block accesses are not split up
199 35 csantifort
// assign m0_in_cycle    = m0_wb_hold_r && !master_ack;
200
// assign m1_in_cycle    = m1_wb_hold_r && !master_ack;
201 2 csantifort
 
202
// only select a new bus master when the current bus master
203 35 csantifort
// daccess ends
204
assign select_master  = current_master_r ? !m1_wb_hold_r : !m0_wb_hold_r;
205 2 csantifort
assign current_master = select_master ? next_master : current_master_r;
206
 
207
 
208
always @( posedge i_wb_clk )
209
    begin
210
    current_master_r    <= current_master;
211 35 csantifort
    m0_wb_hold_r        <= i_m0_wb_stb && !o_m0_wb_ack;
212
    m1_wb_hold_r        <= i_m1_wb_stb && !o_m1_wb_ack;
213 2 csantifort
    end
214
 
215
 
216
// Arbitrate between slaves
217
assign current_slave = in_ethmac   ( master_adr ) ? 4'd0  :  // Ethmac
218
                       in_boot_mem ( master_adr ) ? 4'd1  :  // Boot memory
219
                       in_main_mem ( master_adr ) ? 4'd2  :  // Main memory
220
                       in_uart0    ( master_adr ) ? 4'd3  :  // UART 0
221
                       in_uart1    ( master_adr ) ? 4'd4  :  // UART 1
222
                       in_test     ( master_adr ) ? 4'd5  :  // Test Module
223
                       in_tm       ( master_adr ) ? 4'd6  :  // Timer Module
224
                       in_ic       ( master_adr ) ? 4'd7  :  // Interrupt Controller
225
                                                    4'd2  ;  // default to main memory
226
 
227
 
228
assign master_adr   = current_master ? i_m1_wb_adr : i_m0_wb_adr ;
229 35 csantifort
assign master_sel   = current_master ? i_m1_wb_sel : i_m0_wb_sel ;
230
assign master_wdat  = current_master ? i_m1_wb_dat : i_m0_wb_dat ;
231 2 csantifort
assign master_we    = current_master ? i_m1_wb_we  : i_m0_wb_we  ;
232
assign master_cyc   = current_master ? i_m1_wb_cyc : i_m0_wb_cyc ;
233
assign master_stb   = current_master ? i_m1_wb_stb : i_m0_wb_stb ;
234
 
235
 
236
// Ethmac Slave outputs
237
assign o_s0_wb_adr  = master_adr;
238
assign o_s0_wb_dat  = master_wdat;
239
assign o_s0_wb_sel  = master_sel;
240
assign o_s0_wb_we   = current_slave == 4'd0 ? master_we  : 1'd0;
241
assign o_s0_wb_cyc  = current_slave == 4'd0 ? master_cyc : 1'd0;
242
assign o_s0_wb_stb  = current_slave == 4'd0 ? master_stb : 1'd0;
243
 
244
// Boot Memory outputs
245
assign o_s1_wb_adr  = master_adr;
246
assign o_s1_wb_dat  = master_wdat;
247
assign o_s1_wb_sel  = master_sel;
248
assign o_s1_wb_we   = current_slave == 4'd1 ? master_we  : 1'd0;
249
assign o_s1_wb_cyc  = current_slave == 4'd1 ? master_cyc : 1'd0;
250
assign o_s1_wb_stb  = current_slave == 4'd1 ? master_stb : 1'd0;
251
 
252
// Main Memory Outputs
253
assign o_s2_wb_adr  = master_adr;
254
assign o_s2_wb_dat  = master_wdat;
255
assign o_s2_wb_sel  = master_sel;
256
assign o_s2_wb_we   = current_slave == 4'd2 ? master_we  : 1'd0;
257
assign o_s2_wb_cyc  = current_slave == 4'd2 ? master_cyc : 1'd0;
258
assign o_s2_wb_stb  = current_slave == 4'd2 ? master_stb : 1'd0;
259
 
260
// UART0 Outputs
261
assign o_s3_wb_adr  = master_adr;
262
assign o_s3_wb_dat  = master_wdat;
263
assign o_s3_wb_sel  = master_sel;
264
assign o_s3_wb_we   = current_slave == 4'd3 ? master_we  : 1'd0;
265
assign o_s3_wb_cyc  = current_slave == 4'd3 ? master_cyc : 1'd0;
266
assign o_s3_wb_stb  = current_slave == 4'd3 ? master_stb : 1'd0;
267
 
268
// UART1 Outputs
269
assign o_s4_wb_adr  = master_adr;
270
assign o_s4_wb_dat  = master_wdat;
271
assign o_s4_wb_sel  = master_sel;
272
assign o_s4_wb_we   = current_slave == 4'd4 ? master_we  : 1'd0;
273
assign o_s4_wb_cyc  = current_slave == 4'd4 ? master_cyc : 1'd0;
274
assign o_s4_wb_stb  = current_slave == 4'd4 ? master_stb : 1'd0;
275
 
276
// Test Module Outputs
277
assign o_s5_wb_adr  = master_adr;
278
assign o_s5_wb_dat  = master_wdat;
279
assign o_s5_wb_sel  = master_sel;
280
assign o_s5_wb_we   = current_slave == 5'd5 ? master_we  : 1'd0;
281
assign o_s5_wb_cyc  = current_slave == 5'd5 ? master_cyc : 1'd0;
282
assign o_s5_wb_stb  = current_slave == 5'd5 ? master_stb : 1'd0;
283
 
284
// Timers Outputs
285
assign o_s6_wb_adr  = master_adr;
286
assign o_s6_wb_dat  = master_wdat;
287
assign o_s6_wb_sel  = master_sel;
288
assign o_s6_wb_we   = current_slave == 6'd6 ? master_we  : 1'd0;
289
assign o_s6_wb_cyc  = current_slave == 6'd6 ? master_cyc : 1'd0;
290
assign o_s6_wb_stb  = current_slave == 6'd6 ? master_stb : 1'd0;
291
 
292
// Interrupt Controller
293
assign o_s7_wb_adr  = master_adr;
294
assign o_s7_wb_dat  = master_wdat;
295
assign o_s7_wb_sel  = master_sel;
296
assign o_s7_wb_we   = current_slave == 4'd7 ? master_we  : 1'd0;
297
assign o_s7_wb_cyc  = current_slave == 4'd7 ? master_cyc : 1'd0;
298
assign o_s7_wb_stb  = current_slave == 4'd7 ? master_stb : 1'd0;
299
 
300
 
301
// Master Outputs
302
assign master_rdat  = current_slave == 4'd0  ? i_s0_wb_dat  :
303
                      current_slave == 4'd1  ? i_s1_wb_dat  :
304
                      current_slave == 4'd2  ? i_s2_wb_dat  :
305
                      current_slave == 4'd3  ? i_s3_wb_dat  :
306
                      current_slave == 4'd4  ? i_s4_wb_dat  :
307
                      current_slave == 4'd5  ? i_s5_wb_dat  :
308
                      current_slave == 4'd6  ? i_s6_wb_dat  :
309
                      current_slave == 4'd7  ? i_s7_wb_dat  :
310
                                               i_s2_wb_dat  ;
311
 
312
 
313
assign master_ack   = current_slave == 4'd0  ? i_s0_wb_ack  :
314
                      current_slave == 4'd1  ? i_s1_wb_ack  :
315
                      current_slave == 4'd2  ? i_s2_wb_ack  :
316
                      current_slave == 4'd3  ? i_s3_wb_ack  :
317
                      current_slave == 4'd4  ? i_s4_wb_ack  :
318
                      current_slave == 4'd5  ? i_s5_wb_ack  :
319
                      current_slave == 4'd6  ? i_s6_wb_ack  :
320
                      current_slave == 4'd7  ? i_s7_wb_ack  :
321
                                               i_s2_wb_ack  ;
322
 
323
 
324
assign master_err   = current_slave == 4'd0  ? i_s0_wb_err  :
325
                      current_slave == 4'd1  ? i_s1_wb_err  :
326
                      current_slave == 4'd2  ? i_s2_wb_err  :
327
                      current_slave == 4'd3  ? i_s3_wb_err  :
328
                      current_slave == 4'd4  ? i_s4_wb_err  :
329
                      current_slave == 4'd5  ? i_s5_wb_err  :
330
                      current_slave == 4'd6  ? i_s6_wb_err  :
331
                      current_slave == 4'd7  ? i_s7_wb_err  :
332
                                               i_s2_wb_err  ;
333
 
334
 
335
// Ethmac Master Outputs
336 35 csantifort
assign o_m0_wb_dat  = master_rdat;
337 2 csantifort
assign o_m0_wb_ack  = current_master  ? 1'd0 : master_ack ;
338
assign o_m0_wb_err  = current_master  ? 1'd0 : master_err ;
339
 
340
// Amber Master Outputs
341
assign o_m1_wb_dat  = master_rdat;
342
assign o_m1_wb_ack  = current_master  ?  master_ack : 1'd0 ;
343
assign o_m1_wb_err  = current_master  ?  master_err : 1'd0 ;
344
 
345
endmodule
346
 

powered by: WebSVN 2.1.0

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