From b124a98d927a0e1a8c4e5d3fc9af5794f41b2489 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Wed, 6 Aug 2014 19:38:37 +0800 Subject: [PATCH] genlib: add reset synchronizer --- mibuild/xilinx_common.py | 21 +++++++++++++++++++-- migen/genlib/resetsync.py | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 migen/genlib/resetsync.py diff --git a/mibuild/xilinx_common.py b/mibuild/xilinx_common.py index 94ac17b7..dbd3decd 100644 --- a/mibuild/xilinx_common.py +++ b/mibuild/xilinx_common.py @@ -4,6 +4,7 @@ from distutils.version import StrictVersion from migen.fhdl.std import * from migen.fhdl.specials import SynthesisDirective from migen.genlib.cdc import * +from migen.genlib.resetsync import AsyncResetSynchronizer from mibuild.generic_platform import GenericPlatform from mibuild import tools @@ -66,13 +67,29 @@ class XilinxMultiReg: def lower(dr): return XilinxMultiRegImpl(dr.i, dr.o, dr.odomain, dr.n) +class XilinxAsyncResetSynchronizerImpl(Module): + def __init__(self, cd, async_reset): + rst1 = Signal() + self.specials += [ + Instance("FDPE", p_INIT=1, i_D=0, i_PRE=async_reset, + i_C=cd.clk, o_Q=rst1), + Instance("FDPE", p_INIT=1, i_D=rst1, i_PRE=async_reset, + i_C=cd.clk, o_Q=cd.rst) + ] + +class XilinxAsyncResetSynchronizer: + staticmethod + def lower(dr): + return XilinxAsyncResetSynchronizerImpl(dr.cd, dr.async_reset) + class XilinxGenericPlatform(GenericPlatform): bitstream_ext = ".bit" def get_verilog(self, *args, special_overrides=dict(), **kwargs): so = { - NoRetiming: XilinxNoRetiming, - MultiReg: XilinxMultiReg + NoRetiming: XilinxNoRetiming, + MultiReg: XilinxMultiReg, + AsyncResetSynchronizer: XilinxAsyncResetSynchronizer } so.update(special_overrides) return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs) diff --git a/migen/genlib/resetsync.py b/migen/genlib/resetsync.py new file mode 100644 index 00000000..43a16cda --- /dev/null +++ b/migen/genlib/resetsync.py @@ -0,0 +1,18 @@ +from migen.fhdl.std import * +from migen.fhdl.specials import Special +from migen.fhdl.tools import list_signals + +class AsyncResetSynchronizer(Special): + def __init__(self, cd, async_reset): + Special.__init__(self) + self.cd = cd + self.async_reset = async_reset + + def iter_expressions(self): + yield self.cd, "clk", SPECIAL_INPUT + yield self.cd, "rst", SPECIAL_OUTPUT + yield self, "async_reset", SPECIAL_INPUT + + @staticmethod + def lower(dr): + raise NotImplementedError("Attempted to use a reset synchronizer, but platform does not support them") -- 2.30.2