lib.cdc: add ResetSynchronizer.
This commit is contained in:
parent
e74dbc3377
commit
f44ca291c1
2 changed files with 68 additions and 2 deletions
|
|
@ -1,7 +1,7 @@
|
|||
from .. import *
|
||||
|
||||
|
||||
__all__ = ["MultiReg"]
|
||||
__all__ = ["MultiReg", "ResetSynchronizer"]
|
||||
|
||||
|
||||
class MultiReg:
|
||||
|
|
@ -23,3 +23,28 @@ class MultiReg:
|
|||
m.d[self.odomain] += o.eq(i)
|
||||
m.d.comb += self.o.eq(self._regs[-1])
|
||||
return m
|
||||
|
||||
|
||||
class ResetSynchronizer:
|
||||
def __init__(self, arst, domain="sync", n=2):
|
||||
self.arst = arst
|
||||
self.domain = domain
|
||||
|
||||
self._regs = [Signal(name="arst{}".format(i), reset=1,
|
||||
attrs={"no_retiming": True})
|
||||
for i in range(n)]
|
||||
|
||||
def elaborate(self, platform):
|
||||
if hasattr(platform, "get_reset_sync"):
|
||||
return platform.get_reset_sync(self)
|
||||
|
||||
m = Module()
|
||||
m.domains += ClockDomain("_reset_sync", async_reset=True)
|
||||
for i, o in zip((0, *self._regs), self._regs):
|
||||
m.d._reset_sync += o.eq(i)
|
||||
m.d.comb += [
|
||||
ClockSignal("_reset_sync").eq(ClockSignal(self.domain)),
|
||||
ResetSignal("_reset_sync").eq(self.arst),
|
||||
ResetSignal(self.domain).eq(self._regs[-1])
|
||||
]
|
||||
return m
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue