cores/clock/USIDELAYCTRL: use separate reset/ready counters and set cd_sys.rst internally.

This is the behaviour that was duplicated in each target. Integrating it here
will allow simplifying the targets.
This commit is contained in:
Florent Kermarrec 2020-03-10 16:45:38 +01:00
parent bcbf558b6b
commit 3c0b97eec8
1 changed files with 31 additions and 13 deletions

View File

@ -1,4 +1,4 @@
# This file is Copyright (c) 2018-2019 Florent Kermarrec <florent@enjoy-digital.fr>
# This file is Copyright (c) 2018-2020 Florent Kermarrec <florent@enjoy-digital.fr>
# This file is Copyright (c) 2019 Michael Betz <michibetz@gmail.com>
# License: BSD
@ -435,21 +435,39 @@ class USMMCM(XilinxClocking):
class USIDELAYCTRL(Module):
def __init__(self, cd, reset_cycles=64):
reset_counter = Signal(log2_int(reset_cycles), reset=reset_cycles - 1)
ic_reset = Signal(reset=1)
sync = getattr(self.sync, cd.name)
sync += \
If(reset_counter != 0,
reset_counter.eq(reset_counter - 1)
def __init__(self, cd_ref, cd_sys, reset_cycles=64, ready_cycles=64):
cd_sys.rst.reset = 1
self.clock_domains.cd_ic = ClockDomain()
ic_reset_counter = Signal(max=reset_cycles, reset=reset_cycles-1)
ic_reset = Signal(reset=1)
cd_ref_sync = getattr(self.sync, cd_ref.name)
cd_ref_sync += [
If(ic_reset_counter != 0,
ic_reset_counter.eq(ic_reset_counter - 1)
).Else(
ic_reset.eq(0)
)
self.specials += Instance("IDELAYCTRL",
p_SIM_DEVICE = "ULTRASCALE",
i_REFCLK = cd.clk,
i_RST = ic_reset
)
]
ic_ready_counter = Signal(max=ready_cycles, reset=ready_cycles-1)
ic_ready = Signal()
self.comb += self.cd_ic.clk.eq(cd_sys.clk)
self.sync.ic += [
If(ic_ready,
If(ic_ready_counter != 0,
ic_ready_counter.eq(ic_ready_counter - 1)
).Else(
cd_sys.rst.eq(0)
)
)
]
self.specials += [
Instance("IDELAYCTRL",
p_SIM_DEVICE = "ULTRASCALE",
i_REFCLK = cd_ref.clk,
i_RST = ic_reset,
o_RDY = ic_ready),
AsyncResetSynchronizer(self.cd_ic, ic_reset)
]
# Lattice / iCE40 ----------------------------------------------------------------------------------