mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
corelogic/roundrobin: CE switching
This commit is contained in:
parent
e969b9afc3
commit
a4294762d0
1 changed files with 13 additions and 3 deletions
|
@ -1,11 +1,16 @@
|
|||
from migen.fhdl.structure import *
|
||||
|
||||
(SP_WITHDRAW, SP_CE) = range(2)
|
||||
|
||||
class RoundRobin:
|
||||
def __init__(self, n):
|
||||
def __init__(self, n, switch_policy=SP_WITHDRAW):
|
||||
self.n = n
|
||||
self.bn = bits_for(self.n-1)
|
||||
self.request = Signal(BV(self.n))
|
||||
self.grant = Signal(BV(self.bn))
|
||||
self.switch_policy = switch_policy
|
||||
if self.switch_policy == SP_CE:
|
||||
self.ce = Signal()
|
||||
|
||||
def get_fragment(self):
|
||||
cases = []
|
||||
|
@ -20,7 +25,12 @@ class RoundRobin:
|
|||
*switch
|
||||
)
|
||||
]
|
||||
case = If(~self.request[i], *switch)
|
||||
cases.append([Constant(i, BV(self.bn)), case])
|
||||
if self.switch_policy == SP_WITHDRAW:
|
||||
case = [If(~self.request[i], *switch)]
|
||||
else:
|
||||
case = switch
|
||||
cases.append([Constant(i, BV(self.bn))] + case)
|
||||
statement = Case(self.grant, *cases)
|
||||
if self.switch_policy == SP_CE:
|
||||
statement = If(self.ce, statement)
|
||||
return Fragment(sync=[statement])
|
||||
|
|
Loading…
Reference in a new issue