1 from litesata
.common
import *
2 from litesata
.frontend
.common
import *
4 from migen
.genlib
.roundrobin
import *
6 class LiteSATAArbiter(Module
):
7 def __init__(self
, users
, master
):
8 self
.rr
= RoundRobin(len(users
))
9 self
.submodules
+= self
.rr
10 self
.grant
= self
.rr
.grant
12 for i
, slave
in enumerate(users
):
13 sink
, source
= slave
.sink
, slave
.source
18 start
.eq(sink
.stb
& sink
.sop
),
19 done
.eq(source
.stb
& source
.last
& source
.eop
& source
.ack
)
27 self
.comb
+= self
.rr
.request
[i
].eq((start | ongoing
) & ~done
)
28 cases
[i
] = [users
[i
].connect(master
)]
29 self
.comb
+= Case(self
.grant
, cases
)