73eafaa31dfb5e72779bbb2b7bc1d0dafc0a15b1
[litex.git] / litesata / frontend / arbiter.py
1 from litesata.common import *
2 from litesata.frontend.common import *
3
4 from migen.genlib.roundrobin import *
5
6 class LiteSATAArbiter(Module):
7 def __init__(self, users, master):
8 self.rr = RoundRobin(len(users))
9 self.grant = self.rr.grant
10 cases = {}
11 for i, slave in enumerate(users):
12 sink, source = slave.sink, slave.source
13 start = Signal()
14 done = Signal()
15 ongoing = Signal()
16 self.comb += [
17 start.eq(sink.stb & sink.sop),
18 done.eq(source.stb & source.last & source.eop & source.ack)
19 ]
20 self.sync += \
21 If(start,
22 ongoing.eq(1)
23 ).Elif(done,
24 ongoing.eq(0)
25 )
26 self.comb += self.rr.request[i].eq((start | ongoing) & ~done)
27 cases[i] = [users[i].connect(master)]
28 self.comb += Case(self.grant, cases)