litex/migen/genlib/roundrobin.py

39 lines
841 B
Python
Raw Normal View History

from migen.fhdl.std import *
2011-12-08 15:15:02 -05:00
2012-03-16 11:54:47 -04:00
(SP_WITHDRAW, SP_CE) = range(2)
class RoundRobin(Module):
2012-03-16 11:54:47 -04:00
def __init__(self, n, switch_policy=SP_WITHDRAW):
self.request = Signal(n)
self.grant = Signal(max=n)
2012-03-16 11:54:47 -04:00
self.switch_policy = switch_policy
if self.switch_policy == SP_CE:
self.ce = Signal()
2011-12-08 15:15:02 -05:00
###
if n > 1:
2012-11-28 19:11:15 -05:00
cases = {}
for i in range(n):
switch = []
for j in reversed(range(i+1,i+n)):
t = j % n
switch = [
If(self.request[t],
2012-11-28 17:18:43 -05:00
self.grant.eq(t)
).Else(
*switch
)
]
if self.switch_policy == SP_WITHDRAW:
case = [If(~self.request[i], *switch)]
else:
case = switch
2012-11-28 19:11:15 -05:00
cases[i] = case
statement = Case(self.grant, cases)
if self.switch_policy == SP_CE:
statement = If(self.ce, statement)
self.sync += statement
else:
self.comb += self.grant.eq(0)