1 |
408 |
julius |
Wishbone arbiter RTL source
|
2 |
|
|
|
3 |
|
|
The current implementation of these arbiters for the design is a hard-coded
|
4 |
|
|
slightly configurable set up, rather than a configurable one-size-fits-all
|
5 |
|
|
approach. It is assumed a Harvard architecture is in use, and therefore there
|
6 |
|
|
are seperate busses for both instruction and data busses of the processor. The
|
7 |
|
|
data bus arbiter also has a peripheral, or byte (wide) bus, attached to it.
|
8 |
|
|
|
9 |
|
|
The busses have ports following the Wishbone B3 standard. They are a cross-bar
|
10 |
|
|
switch setup, ie only one master can be controlling the bus at a time. A simple
|
11 |
|
|
priority-based arbitration system is used, however this only really matters for
|
12 |
|
|
the data bus, which has multiple masters.
|
13 |
|
|
|
14 |
|
|
The addresses for each slave are configured through parameters. It is expected
|
15 |
|
|
the instantiation of the arbiter will define these parameters also.
|
16 |
|
|
|
17 |
|
|
The arbiters have the option of passing the signals through with or without any
|
18 |
|
|
sequential logic (registering) however they _DO NOT_ yet support registered
|
19 |
|
|
bursting (ie, where wb_cti indicates anything other than a Wishbone classic
|
20 |
|
|
cycle.) Do not enable registering, via the defines, and expect bursting to work!
|
21 |
|
|
|
22 |
|
|
There is an optional watchdog counter which will assert wb_err if a request is
|
23 |
|
|
not serviced within the counting period of the clock. The width of the timer
|
24 |
|
|
is defined.
|
25 |
|
|
|
26 |
|
|
The arbiters depend on the design's top level define file. The options for
|
27 |
|
|
registering and the watchdog timer should be set there.
|
28 |
|
|
|
29 |
|
|
arbiter_ibus.v:
|
30 |
|
|
This has only one master input and two slaves - a ROM and a main memory.
|
31 |
|
|
This is the simplest of the arbiters. It has 32-bit wide data ports.
|
32 |
|
|
|
33 |
|
|
|
34 |
|
|
arbiter_dbus.v:
|
35 |
|
|
This has two masters ports and several slave ports. It has 32-bit wide
|
36 |
|
|
data ports. It has a default slave it selects if none of the other
|
37 |
|
|
slaves are selected, allowing daisy-chaining of another arbiter onto it
|
38 |
|
|
(used for the peripheral byte-bus.)
|
39 |
|
|
|
40 |
|
|
Increasing or reducing the slaves here requires:
|
41 |
|
|
1. Altering the module() declaration, adding the required ports.
|
42 |
|
|
2. Altering the input/output declaration, adding the required ports.
|
43 |
|
|
3. Add/remove(comment-out) the appropriate line in the section under the
|
44 |
|
|
commend "Slave selects". Ensure to alter the final slave, or
|
45 |
|
|
"default" slave's select logic to include/exclude the slave being
|
46 |
|
|
added/removed.
|
47 |
|
|
4. Alter the inputs from the master going to the slave
|
48 |
|
|
5. Alter the inputs from the slave (wb_ack, wb_dat_i, etc.) going to the
|
49 |
|
|
master
|
50 |
|
|
6. When instantiating, be sure that the address for the new slave is
|
51 |
|
|
defined.
|
52 |
|
|
7. Be sure to update the appropriate parameters in design-params.v with
|
53 |
|
|
the correct total number of slaves, and the address of the new slave.
|
54 |
|
|
|
55 |
|
|
For most of this slave configuration change, it should be as easy as
|
56 |
|
|
following the example of the structure already in the file, and
|
57 |
|
|
potentially just moving the open block-comment marker "/*" past the
|
58 |
|
|
lines for the new slave.
|
59 |
|
|
|
60 |
|
|
arbiter_bytebus.v:
|
61 |
|
|
This is a single-master arbiter, connecting to multiple slaves. It has
|
62 |
|
|
single byte-wide data ports. The data port back to the master maps read
|
63 |
|
|
bytes to the correct position in a 32-bit wide word, consistent with a
|
64 |
|
|
big-endian representation of data. There is no default slave. The
|
65 |
|
|
procedure for adding new slaves is the same as for the main data-bus
|
66 |
|
|
arbiter, except for the default slave selection considerations.
|
67 |
|
|
|