Skip to content

Commit a318243

Browse files
committedDec 1, 2016
rtio: CRI arbiter (untested)
1 parent cd3f68b commit a318243

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
 

Diff for: ‎artiq/gateware/rtio/cri.py

+44
Original file line numberDiff line numberDiff line change
@@ -147,3 +147,47 @@ def __init__(self, slaves=2, master=None):
147147
if direction == DIR_S_TO_M:
148148
cases[n].append(getattr(master, name).eq(getattr(slave, name)))
149149
self.comb += Case(selected, cases)
150+
151+
152+
class CRIArbiter(Module):
153+
def __init__(self, masters=2, slave=None):
154+
if isinstance(masters, int):
155+
masters = [Interface() for _ in range(masters)]
156+
if slave is None:
157+
slave = Interface()
158+
self.masters = masters
159+
self.slave = slave
160+
161+
# # #
162+
163+
selected = Signal(max=len(masters))
164+
165+
# mux master->slave signals
166+
for name, size, direction in layout:
167+
if direction == DIR_M_TO_S:
168+
choices = Array(getattr(m, name) for m in masters)
169+
self.comb += getattr(slave, name).eq(choices[selected])
170+
171+
# connect slave->master signals
172+
for name, size, direction in layout:
173+
if direction == DIR_S_TO_M:
174+
source = getattr(slave, name)
175+
for i, m in enumerate(masters):
176+
dest = getattr(m, name)
177+
if name == "arb_gnt":
178+
self.comb += dest.eq(source & (selected == i))
179+
else:
180+
self.comb += dest.eq(source)
181+
182+
# select master
183+
self.sync += \
184+
If(~slave.arb_req,
185+
[If(m.arb_req, selected.eq(i)) for i, m in enumerate(masters)]
186+
)
187+
188+
189+
class CRIInterconnectShared(Module):
190+
def __init__(self, masters=2, slaves=2):
191+
shared = Interface()
192+
self.submodules.arbiter = CRIArbiter(masters, shared)
193+
self.submodules.decoder = CRIDecoder(slaves, shared)

0 commit comments

Comments
 (0)