Exemplo n.º 1
0
    def __init__(self, platform):
        self.pll_reset = CSRStorage(reset=1)
        self.pll_locked = CSRStatus()
        self.clock_domains.cd_rtio = ClockDomain()
        self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True)

        if platform.hw_rev == "v2.0":
            clk_synth = platform.request("cdr_clk_clean_fabric")
        else:
            clk_synth = platform.request("si5324_clkout_fabric")
        clk_synth_se = Signal()
        platform.add_period_constraint(clk_synth.p, 8.0)
        self.specials += [
            Instance("IBUFGDS",
                     p_DIFF_TERM="TRUE",
                     p_IBUF_LOW_PWR="FALSE",
                     i_I=clk_synth.p,
                     i_IB=clk_synth.n,
                     o_O=clk_synth_se),
        ]

        pll_locked = Signal()
        rtio_clk = Signal()
        rtiox4_clk = Signal()
        fb_clk = Signal()
        self.specials += [
            Instance(
                "PLLE2_ADV",
                p_STARTUP_WAIT="FALSE",
                o_LOCKED=pll_locked,
                p_BANDWIDTH="HIGH",
                p_REF_JITTER1=0.001,
                p_CLKIN1_PERIOD=8.0,
                p_CLKIN2_PERIOD=8.0,
                i_CLKIN2=clk_synth_se,
                # Warning: CLKINSEL=0 means CLKIN2 is selected
                i_CLKINSEL=0,

                # VCO @ 1.5GHz when using 125MHz input
                p_CLKFBOUT_MULT=12,
                p_DIVCLK_DIVIDE=1,
                i_CLKFBIN=fb_clk,
                i_RST=self.pll_reset.storage,
                o_CLKFBOUT=fb_clk,
                p_CLKOUT0_DIVIDE=3,
                p_CLKOUT0_PHASE=0.0,
                o_CLKOUT0=rtiox4_clk,
                p_CLKOUT1_DIVIDE=12,
                p_CLKOUT1_PHASE=0.0,
                o_CLKOUT1=rtio_clk),
            Instance("BUFG", i_I=rtio_clk, o_O=self.cd_rtio.clk),
            Instance("BUFG", i_I=rtiox4_clk, o_O=self.cd_rtiox4.clk),
            AsyncResetSynchronizer(self.cd_rtio, ~pll_locked),
            MultiReg(pll_locked, self.pll_locked.status)
        ]
Exemplo n.º 2
0
    def __init__(self, platform, rtio_internal_clk, use_sma=True):
        self._clock_sel = CSRStorage()
        self._pll_reset = CSRStorage(reset=1)
        self._pll_locked = CSRStatus()
        self.clock_domains.cd_rtio = ClockDomain()
        self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True)

        # 100 MHz when using 125MHz input
        self.clock_domains.cd_ext_clkout = ClockDomain(reset_less=True)
        platform.add_period_constraint(self.cd_ext_clkout.clk, 5.0)
        if use_sma:
            ext_clkout = platform.request("user_sma_gpio_p_33")
            self.sync.ext_clkout += ext_clkout.eq(~ext_clkout)

        rtio_external_clk = Signal()
        if use_sma:
            user_sma_clock = platform.request("user_sma_clock")
            platform.add_period_constraint(user_sma_clock.p, 8.0)
            self.specials += Instance("IBUFDS",
                                      i_I=user_sma_clock.p, i_IB=user_sma_clock.n,
                                      o_O=rtio_external_clk)

        pll_locked = Signal()
        rtio_clk = Signal()
        rtiox4_clk = Signal()
        ext_clkout_clk = Signal()
        self.specials += [
            Instance("PLLE2_ADV",
                     p_STARTUP_WAIT="FALSE", o_LOCKED=pll_locked,

                     p_REF_JITTER1=0.01,
                     p_CLKIN1_PERIOD=8.0, p_CLKIN2_PERIOD=8.0,
                     i_CLKIN1=rtio_internal_clk, i_CLKIN2=rtio_external_clk,
                     # Warning: CLKINSEL=0 means CLKIN2 is selected
                     i_CLKINSEL=~self._clock_sel.storage,

                     # VCO @ 1GHz when using 125MHz input
                     p_CLKFBOUT_MULT=8, p_DIVCLK_DIVIDE=1,
                     i_CLKFBIN=self.cd_rtio.clk,
                     i_RST=self._pll_reset.storage,

                     o_CLKFBOUT=rtio_clk,

                     p_CLKOUT0_DIVIDE=2, p_CLKOUT0_PHASE=0.0,
                     o_CLKOUT0=rtiox4_clk,

                     p_CLKOUT1_DIVIDE=5, p_CLKOUT1_PHASE=0.0,
                     o_CLKOUT1=ext_clkout_clk),
            Instance("BUFG", i_I=rtio_clk, o_O=self.cd_rtio.clk),
            Instance("BUFG", i_I=rtiox4_clk, o_O=self.cd_rtiox4.clk),
            Instance("BUFG", i_I=ext_clkout_clk, o_O=self.cd_ext_clkout.clk),

            AsyncResetSynchronizer(self.cd_rtio, ~pll_locked),
            MultiReg(pll_locked, self._pll_locked.status)
        ]
Exemplo n.º 3
0
    def __init__(self, platform, core_config):
        self.clock_domains.cd_init = ClockDomain()
        self.clock_domains.cd_por = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys2x = ClockDomain()
        self.clock_domains.cd_sys2x_i = ClockDomain(reset_less=True)

        # # #

        self.stop = Signal()

        # clk / rst
        clk = platform.request("clk")
        rst = platform.request("rst")

        # power on reset
        por_count = Signal(16, reset=2**16 - 1)
        por_done = Signal()
        self.comb += self.cd_por.clk.eq(ClockSignal())
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # pll
        self.submodules.pll = pll = ECP5PLL()
        pll.register_clkin(clk, core_config["input_clk_freq"])
        pll.create_clkout(self.cd_sys2x_i, 2 * core_config["sys_clk_freq"])
        pll.create_clkout(self.cd_init, core_config["init_clk_freq"])
        self.specials += [
            Instance("ECLKSYNCB",
                     i_ECLKI=self.cd_sys2x_i.clk,
                     i_STOP=self.stop,
                     o_ECLKO=self.cd_sys2x.clk),
            Instance("CLKDIVF",
                     p_DIV="2.0",
                     i_ALIGNWD=0,
                     i_CLKI=self.cd_sys2x.clk,
                     i_RST=self.cd_sys2x.rst,
                     o_CDIVX=self.cd_sys.clk),
            AsyncResetSynchronizer(self.cd_init,
                                   ~por_done | ~pll.locked | rst),
            AsyncResetSynchronizer(self.cd_sys, ~por_done | ~pll.locked | rst),
        ]
Exemplo n.º 4
0
    def __init__(self, platform, sys_clk_freq):
        self.clock_domains.cd_init    = ClockDomain()
        self.clock_domains.cd_por     = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys     = ClockDomain()
        self.clock_domains.cd_sys2x   = ClockDomain()
        self.clock_domains.cd_sys2x_i = ClockDomain(reset_less=True)

        # # #

        self.stop = Signal()

        # Clk / Rst
        clk100 = platform.request("clk100")
        rst_n  = platform.request("rst_n")
        platform.add_period_constraint(clk100, 1e9/100e6)

        # Power on reset
        por_count = Signal(16, reset=2**16-1)
        por_done  = Signal()
        self.comb += self.cd_por.clk.eq(ClockSignal())
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # PLL
        self.submodules.pll = pll = ECP5PLL()
        pll.register_clkin(clk100, 100e6)
        pll.create_clkout(self.cd_sys2x_i, 2*sys_clk_freq)
        pll.create_clkout(self.cd_init, 25e6)
        self.specials += [
            Instance("ECLKSYNCB",
                i_ECLKI = self.cd_sys2x_i.clk,
                i_STOP  = self.stop,
                o_ECLKO = self.cd_sys2x.clk),
            Instance("CLKDIVF",
                p_DIV     = "2.0",
                i_ALIGNWD = 0,
                i_CLKI    = self.cd_sys2x.clk,
                i_RST     = self.cd_sys2x.rst,
                o_CDIVX   = self.cd_sys.clk),
            AsyncResetSynchronizer(self.cd_init, ~por_done | ~pll.locked | ~rst_n),
            AsyncResetSynchronizer(self.cd_sys,  ~por_done | ~pll.locked | ~rst_n)
        ]
Exemplo n.º 5
0
    def __init__(self, platform, rtio_internal_clk):
        self._clock_sel = CSRStorage()
        self._pll_reset = CSRStorage(reset=1)
        self._pll_locked = CSRStatus()
        self.clock_domains.cd_rtio = ClockDomain()
        self.clock_domains.cd_rtiox4 = ClockDomain(reset_less=True)

        rtio_external_clk = Signal()
        clk_synth_se = Signal()
        clk_synth = platform.request("si5324_clkout_fabric")
        platform.add_period_constraint(clk_synth.p, 8.0)
        self.specials += [
            Instance("IBUFGDS",
                     p_DIFF_TERM="TRUE",
                     p_IBUF_LOW_PWR="TRUE",
                     i_I=clk_synth.p,
                     i_IB=clk_synth.n,
                     o_O=clk_synth_se),
            Instance("BUFG", i_I=clk_synth_se, o_O=rtio_external_clk),
        ]
        platform.add_false_path_constraints(rtio_external_clk,
                                            rtio_internal_clk)

        pll_locked = Signal()
        rtio_clk = Signal()
        rtiox4_clk = Signal()
        ext_clkout_clk = Signal()
        self.specials += [
            Instance(
                "PLLE2_ADV",
                p_STARTUP_WAIT="FALSE",
                o_LOCKED=pll_locked,
                p_REF_JITTER1=0.01,
                p_CLKIN1_PERIOD=8.0,
                p_CLKIN2_PERIOD=8.0,
                i_CLKIN1=rtio_internal_clk,
                i_CLKIN2=rtio_external_clk,
                # Warning: CLKINSEL=0 means CLKIN2 is selected
                i_CLKINSEL=~self._clock_sel.storage,

                # VCO @ 1GHz when using 125MHz input
                p_CLKFBOUT_MULT=8,
                p_DIVCLK_DIVIDE=1,
                i_CLKFBIN=self.cd_rtio.clk,
                i_RST=self._pll_reset.storage,
                o_CLKFBOUT=rtio_clk,
                p_CLKOUT0_DIVIDE=2,
                p_CLKOUT0_PHASE=0.0,
                o_CLKOUT0=rtiox4_clk),
            Instance("BUFG", i_I=rtio_clk, o_O=self.cd_rtio.clk),
            Instance("BUFG", i_I=rtiox4_clk, o_O=self.cd_rtiox4.clk),
            AsyncResetSynchronizer(self.cd_rtio, ~pll_locked),
            MultiReg(pll_locked, self._pll_locked.status)
        ]
Exemplo n.º 6
0
    def __init__(self, platform, sys_clk_freq):
        self.rst = Signal()
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_por = ClockDomain()

        # TODO: replace with PLL
        # Clocking
        self.submodules.sys_clk = sys_osc = NXOSCA()
        sys_osc.create_hf_clk(self.cd_sys, sys_clk_freq)
        platform.add_period_constraint(self.cd_sys.clk, 1e9 / sys_clk_freq)
        rst_n = platform.request("gsrn")

        # Power On Reset
        por_cycles = 4096
        por_counter = Signal(log2_int(por_cycles), reset=por_cycles - 1)
        self.comb += self.cd_por.clk.eq(self.cd_sys.clk)
        self.sync.por += If(por_counter != 0, por_counter.eq(por_counter - 1))
        self.specials += AsyncResetSynchronizer(self.cd_por, ~rst_n)
        self.specials += AsyncResetSynchronizer(self.cd_sys,
                                                (por_counter != 0) | self.rst)
Exemplo n.º 7
0
    def __init__(self, platform, sys_clk_freq):
        self.rst = Signal()
        self.clock_domains.cd_sys = ClockDomain()

        # # #

        # Clk / Rst
        clk27 = platform.request("clk27")
        rst_n = platform.request("user_btn", 0)
        self.comb += self.cd_sys.clk.eq(clk27)
        self.specials += AsyncResetSynchronizer(self.cd_sys, ~rst_n)
Exemplo n.º 8
0
Arquivo: mii.py Projeto: LGTMCU/misoc
    def __init__(self, clock_pads, pads):
        self._reset = CSRStorage()

        # # #

        if hasattr(clock_pads, "phy"):
            self.sync.base50 += clock_pads.phy.eq(~clock_pads.phy)

        self.clock_domains.cd_eth_rx = ClockDomain()
        self.clock_domains.cd_eth_tx = ClockDomain()
        self.comb += self.cd_eth_rx.clk.eq(clock_pads.rx)
        self.comb += self.cd_eth_tx.clk.eq(clock_pads.tx)

        reset = self._reset.storage
        if hasattr(pads, "rst_n"):
            self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
    def __init__(self, width, depth, idomain, odomain):
        self.din = Signal(width)
        self.dout = Signal(width)

        # # #

        reset = Signal()
        cd_write = ClockDomain()
        cd_read = ClockDomain()
        self.comb += [
            cd_write.clk.eq(ClockSignal(idomain)),
            cd_read.clk.eq(ClockSignal(odomain)),
            reset.eq(ResetSignal(idomain) | ResetSignal(odomain))
        ]
        self.specials += [
            AsyncResetSynchronizer(cd_write, reset),
            AsyncResetSynchronizer(cd_read, reset)
        ]
        self.clock_domains += cd_write, cd_read

        wrpointer = Signal(max=depth, reset=depth//2)
        rdpointer = Signal(max=depth)

        storage = Memory(width, depth)
        self.specials += storage

        wrport = storage.get_port(write_capable=True, clock_domain="write")
        rdport = storage.get_port(clock_domain="read")
        self.specials += wrport, rdport

        self.sync.write += wrpointer.eq(wrpointer + 1)
        self.sync.read += rdpointer.eq(rdpointer + 1)

        self.comb += [
            wrport.we.eq(1),
            wrport.adr.eq(wrpointer),
            wrport.dat_w.eq(self.din),

            rdport.adr.eq(rdpointer),
            self.dout.eq(rdport.dat_r)
        ]
Exemplo n.º 10
0
    def __init__(self, platform):
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_clk200 = ClockDomain()

        clk50 = platform.request("clk50")
        self.reset = Signal()

        pll_locked = Signal()
        pll_fb = Signal()
        pll_sys = Signal()
        pll_clk200 = Signal()
        self.specials += [
            Instance("PLLE2_BASE",
                     p_STARTUP_WAIT="FALSE", o_LOCKED=pll_locked,

                     # VCO @ 1GHz
                     p_REF_JITTER1=0.01, p_CLKIN1_PERIOD=20.0,
                     p_CLKFBOUT_MULT=20, p_DIVCLK_DIVIDE=1,
                     i_CLKIN1=clk50, i_CLKFBIN=pll_fb, o_CLKFBOUT=pll_fb,

                     # 125MHz
                     p_CLKOUT0_DIVIDE=8, p_CLKOUT0_PHASE=0.0, o_CLKOUT0=pll_sys,

                     # 200MHz
                     p_CLKOUT3_DIVIDE=5, p_CLKOUT3_PHASE=0.0, o_CLKOUT3=pll_clk200
            ),
            Instance("BUFG", i_I=pll_sys, o_O=self.cd_sys.clk),
            Instance("BUFG", i_I=pll_clk200, o_O=self.cd_clk200.clk),
            AsyncResetSynchronizer(self.cd_sys, ~pll_locked | self.reset),
            AsyncResetSynchronizer(self.cd_clk200, ~pll_locked | self.reset)
        ]

        reset_counter = Signal(4, reset=15)
        ic_reset = Signal(reset=1)
        self.sync.clk200 += \
            If(reset_counter != 0,
                reset_counter.eq(reset_counter - 1)
            ).Else(
                ic_reset.eq(0)
            )
        self.specials += Instance("IDELAYCTRL", i_REFCLK=ClockSignal("clk200"), i_RST=ic_reset)
    def __init__(self, clk, rst):
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_clk125 = ClockDomain()

        # # #

        self.comb += self.cd_sys.clk.eq(clk)
        self.specials += AsyncResetSynchronizer(self.cd_sys, rst)

        self.submodules.pll = pll = S7PLL()
        pll.register_clkin(clk, 100e6)
        pll.create_clkout(self.cd_clk125, 125e6)
Exemplo n.º 12
0
    def __init__(self, clock_pads, pads):
        self._reset = CSRStorage()

        # # #

        self.clock_domains.cd_eth_rx = ClockDomain()
        self.clock_domains.cd_eth_tx = ClockDomain()

        self.specials += [
            Instance("BUFG", i_I=clock_pads.rx, o_O=self.cd_eth_rx.clk),
            DDROutput(1, 0, clock_pads.tx, ClockSignal("eth_tx"))
        ]
        self.comb += self.cd_eth_tx.clk.eq(self.cd_eth_rx.clk)

        reset = self._reset.storage
        if hasattr(pads, "rst_n"):
            self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
Exemplo n.º 13
0
    def __init__(self, platform, sys_clk_freq):
        self.rst = CSR()  # not used

        # # #

        clk = platform.request("clk")
        rst = platform.request("rst")
        platform.add_period_constraint(clk, 1e9 / sys_clk_freq)

        self.clock_domains.cd_sys = ClockDomain()
        self.comb += self.cd_sys.clk.eq(clk)
        self.specials += AsyncResetSynchronizer(self.cd_sys, rst)
Exemplo n.º 14
0
 def create_clkout(self, cd, freq, phase=0, margin=1e-2, with_reset=True):
     (clko_freq_min, clko_freq_max) = self.clko_freq_range
     assert freq >= clko_freq_min
     assert freq <= clko_freq_max
     assert self.nclkouts < self.nclkouts_max
     clkout = Signal()
     self.clkouts[self.nclkouts] = (clkout, freq, phase, margin)
     if with_reset:
         self.specials += AsyncResetSynchronizer(cd, ~self.locked)
     self.comb += cd.clk.eq(clkout)
     create_clkout_log(self.logger, cd.name, freq, margin, self.nclkouts)
     self.nclkouts += 1
Exemplo n.º 15
0
    def __init__(self, clock_pads, pads, with_hw_init_reset, mii_mode=0):
        self._reset = CSRStorage()

        # # #

        self.clock_domains.cd_eth_rx = ClockDomain()
        self.clock_domains.cd_eth_tx = ClockDomain()

        # RX : Let the synthesis tool insert the appropriate clock buffer
        self.comb += self.cd_eth_rx.clk.eq(clock_pads.rx)

        # TX : GMII: Drive clock_pads.gtx, clock_pads.tx unused
        #      MII: Use PHY clock_pads.tx as eth_tx_clk, do not drive clock_pads.gtx
        self.specials += DDROutput(1, mii_mode, clock_pads.gtx, ClockSignal("eth_tx"))
        if isinstance(mii_mode, int) and (mii_mode == 0):
            self.specials += Instance("BUFG",
                i_I = self.cd_eth_rx.clk,
                o_O = self.cd_eth_tx.clk,
            )
        else:
            # XXX Xilinx specific, replace BUFGMUX with a generic clock buffer?
            self.specials += Instance("BUFGMUX",
                i_I0 = self.cd_eth_rx.clk,
                i_I1 = clock_pads.tx,
                i_S  = mii_mode,
                o_O  = self.cd_eth_tx.clk,
            )

        reset = Signal()
        if with_hw_init_reset:
            self.submodules.hw_reset = LiteEthPHYHWReset()
            self.comb += reset.eq(self._reset.storage | self.hw_reset.reset)
        else:
            self.comb += reset.eq(self._reset.storage)

        self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
Exemplo n.º 16
0
    def __init__(self, platform, sys_clk_freq):
        self.clock_domains.cd_sys_pll = ClockDomain()
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys4x = ClockDomain(reset_less=True)
        self.clock_domains.cd_pll4x = ClockDomain(reset_less=True)
        self.clock_domains.cd_idelay = ClockDomain()
        self.clock_domains.cd_uart = ClockDomain()
        self.clock_domains.cd_eth = ClockDomain()

        # # #

        self.submodules.main_pll = main_pll = USMMCM(speedgrade=-2)
        self.comb += main_pll.reset.eq(platform.request("cpu_reset"))
        main_pll.register_clkin(platform.request("clk125"), 125e6)
        main_pll.create_clkout(self.cd_sys_pll, sys_clk_freq)
        main_pll.create_clkout(self.cd_idelay, 200e6, with_reset=False)
        main_pll.create_clkout(self.cd_uart, 100e6)
        main_pll.create_clkout(self.cd_eth, 200e6)
        main_pll.expose_drp()

        self.submodules.pll = pll = USMMCM(speedgrade=-2)
        self.comb += pll.reset.eq(~main_pll.locked)
        pll.register_clkin(self.cd_sys_pll.clk, sys_clk_freq)
        pll.create_clkout(self.cd_pll4x,
                          sys_clk_freq * 4,
                          buf=None,
                          with_reset=False)

        self.specials += [
            Instance(
                "BUFGCE_DIV",
                p_BUFGCE_DIVIDE=4,
                i_CE=1,
                i_I=self.cd_pll4x.clk,
                o_O=self.cd_sys.clk,
            ),
            Instance(
                "BUFGCE",
                i_CE=1,
                i_I=self.cd_pll4x.clk,
                o_O=self.cd_sys4x.clk,
            ),
            AsyncResetSynchronizer(self.cd_idelay, ~pll.locked),
        ]

        self.submodules.idelayctrl = USIDELAYCTRL(cd_ref=self.cd_idelay,
                                                  cd_sys=self.cd_sys)

        sys_clk_counter = Signal(32)
        self.sync += sys_clk_counter.eq(sys_clk_counter + 1)
        self.sys_clk_counter = CSRStatus(32)
        self.comb += self.sys_clk_counter.status.eq(sys_clk_counter)
Exemplo n.º 17
0
    def __init__(self, platform, sys_clk_freq):
        self.rst = Signal()
        self.clock_domains.cd_init = ClockDomain()
        self.clock_domains.cd_por = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys2x = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys2x_i = ClockDomain(reset_less=True)

        # # #

        self.stop = Signal()
        self.reset = Signal()

        # Clk / Rst
        clk12 = platform.request("clk12")
        rst = platform.request("user_btn", 0)

        # Power on reset
        por_count = Signal(16, reset=2**16 - 1)
        por_done = Signal()
        self.comb += self.cd_por.clk.eq(clk12)
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # PLL
        sys2x_clk_ecsout = Signal()
        self.submodules.pll = pll = ECP5PLL()
        self.comb += pll.reset.eq(~por_done | rst | self.rst)
        pll.register_clkin(clk12, 12e6)
        pll.create_clkout(self.cd_sys2x_i, 2 * sys_clk_freq)
        pll.create_clkout(self.cd_init, 25e6)
        self.specials += [
            Instance(
                "ECLKBRIDGECS",
                i_CLK0=self.cd_sys2x_i.clk,
                i_SEL=0,
                o_ECSOUT=sys2x_clk_ecsout,
            ),
            Instance("ECLKSYNCB",
                     i_ECLKI=sys2x_clk_ecsout,
                     i_STOP=self.stop,
                     o_ECLKO=self.cd_sys2x.clk),
            Instance("CLKDIVF",
                     p_DIV="2.0",
                     i_ALIGNWD=0,
                     i_CLKI=self.cd_sys2x.clk,
                     i_RST=self.reset,
                     o_CDIVX=self.cd_sys.clk),
            AsyncResetSynchronizer(self.cd_sys, ~pll.locked | self.reset),
        ]

        self.comb += platform.request("dram_vtt_en").eq(1)
Exemplo n.º 18
0
    def __init__(self, platform, sys_clk_freq):
        assert sys_clk_freq == 12e6
        self.rst = Signal()
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_por = ClockDomain(reset_less=True)
        self.clock_domains.cd_usb_12 = ClockDomain()
        self.clock_domains.cd_usb_48 = ClockDomain()

        # # #

        # Clk/Rst
        clk48 = platform.request("clk48")
        platform.add_period_constraint(clk48, 1e9 / 48e6)

        # Power On Reset
        por_count = Signal(16, reset=2**16 - 1)
        por_done = Signal()
        self.comb += self.cd_por.clk.eq(ClockSignal())
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # USB PLL
        self.submodules.pll = pll = iCE40PLL()
        #self.comb += pll.reset.eq(self.rst) # FIXME: Add proper iCE40PLL reset support and add back | self.rst.
        pll.clko_freq_range = (
            12e6, 275e9
        )  # FIXME: improve iCE40PLL to avoid lowering clko_freq_min.
        pll.register_clkin(clk48, 48e6)
        pll.create_clkout(self.cd_usb_12, 12e6, with_reset=False)
        self.comb += self.cd_usb_48.clk.eq(clk48)
        self.specials += AsyncResetSynchronizer(self.cd_usb_12,
                                                ~por_done | ~pll.locked)
        self.specials += AsyncResetSynchronizer(self.cd_usb_48,
                                                ~por_done | ~pll.locked)

        # Sys Clk
        self.comb += self.cd_sys.clk.eq(self.cd_usb_12.clk)
        self.specials += AsyncResetSynchronizer(self.cd_sys,
                                                ~por_done | ~pll.locked)
Exemplo n.º 19
0
    def __init__(self, platform, core_config):
        assert core_config["memtype"] in ["DDR4"]
        self.clock_domains.cd_por       = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys       = ClockDomain()
        self.clock_domains.cd_sys4x     = ClockDomain()
        self.clock_domains.cd_sys4x_pll = ClockDomain()
        self.clock_domains.cd_iodelay   = ClockDomain()

        # # #

        clk = platform.request("clk")
        rst = platform.request("rst")

        # Power On Reset
        por_count = Signal(32, reset=int(core_config["input_clk_freq"]*100/1e3)) # 100ms
        por_done  = Signal()
        self.comb += self.cd_por.clk.eq(clk)
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # Sys PLL
        self.submodules.sys_pll = sys_pll = USMMCM(speedgrade=core_config["speedgrade"])
        self.comb += sys_pll.reset.eq(rst)
        sys_pll.register_clkin(clk, core_config["input_clk_freq"])
        sys_pll.create_clkout(self.cd_iodelay, core_config["iodelay_clk_freq"])
        sys_pll.create_clkout(self.cd_sys4x_pll, 4*core_config["sys_clk_freq"], buf=None)
        self.comb += platform.request("pll_locked").eq(sys_pll.locked)
        self.specials += [
            Instance("BUFGCE_DIV", name="main_bufgce_div",
                p_BUFGCE_DIVIDE=4,
                i_CE=por_done, i_I=self.cd_sys4x_pll.clk, o_O=self.cd_sys.clk),
            Instance("BUFGCE", name="main_bufgce",
                i_CE=por_done, i_I=self.cd_sys4x_pll.clk, o_O=self.cd_sys4x.clk),
            AsyncResetSynchronizer(self.cd_sys4x, ~por_done | ~sys_pll.locked | rst),
            AsyncResetSynchronizer(self.cd_sys,   ~por_done | ~sys_pll.locked | rst),
        ]

        # IODelay Ctrl
        self.submodules.idelayctrl = USIDELAYCTRL(self.cd_iodelay, cd_sys=self.cd_sys)
Exemplo n.º 20
0
    def __init__(self, platform):
        self.clock_domains.cd_sys = ClockDomain()

        clk = platform.request("clk_in")

        platform.add_period_constraint(clk, 1e9/30e6)

        # pll
        self.submodules.pll = pll = ECP5PLL()
        pll.register_clkin(clk, 30e6)
        pll.create_clkout(self.cd_sys, 60e6)

        self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll.locked)
Exemplo n.º 21
0
    def __init__(self, platform, clk_freq):
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys_ps = ClockDomain()
        self.clock_domains.cd_base50 = ClockDomain()

        f0 = 32*1000000
        clk32 = platform.request("clk32")
        clk32a = Signal()
        self.specials += Instance("IBUFG", i_I=clk32, o_O=clk32a)
        clk32b = Signal()
        self.specials += Instance("BUFIO2", p_DIVIDE=1,
                                  p_DIVIDE_BYPASS="******", p_I_INVERT="FALSE",
                                  i_I=clk32a, o_DIVCLK=clk32b)
        f = Fraction(int(clk_freq), int(f0))
        n, m, p = f.denominator, f.numerator, 8
        assert f0/n*m == clk_freq
        pll_lckd = Signal()
        pll_fb = Signal()
        pll = Signal(6)
        self.specials.pll = Instance("PLL_ADV", p_SIM_DEVICE="SPARTAN6",
                                     p_BANDWIDTH="OPTIMIZED", p_COMPENSATION="INTERNAL",
                                     p_REF_JITTER=.01, p_CLK_FEEDBACK="CLKFBOUT",
                                     i_DADDR=0, i_DCLK=0, i_DEN=0, i_DI=0, i_DWE=0, i_RST=0, i_REL=0,
                                     p_DIVCLK_DIVIDE=1, p_CLKFBOUT_MULT=m*p//n, p_CLKFBOUT_PHASE=0.,
                                     i_CLKIN1=clk32b, i_CLKIN2=0, i_CLKINSEL=1,
                                     p_CLKIN1_PERIOD=1000000000/f0, p_CLKIN2_PERIOD=0.,
                                     i_CLKFBIN=pll_fb, o_CLKFBOUT=pll_fb, o_LOCKED=pll_lckd,
                                     o_CLKOUT0=pll[0], p_CLKOUT0_DUTY_CYCLE=.5,
                                     o_CLKOUT1=pll[1], p_CLKOUT1_DUTY_CYCLE=.5,
                                     o_CLKOUT2=pll[2], p_CLKOUT2_DUTY_CYCLE=.5,
                                     o_CLKOUT3=pll[3], p_CLKOUT3_DUTY_CYCLE=.5,
                                     o_CLKOUT4=pll[4], p_CLKOUT4_DUTY_CYCLE=.5,
                                     o_CLKOUT5=pll[5], p_CLKOUT5_DUTY_CYCLE=.5,
                                     p_CLKOUT0_PHASE=0., p_CLKOUT0_DIVIDE=p//1,
                                     p_CLKOUT1_PHASE=0., p_CLKOUT1_DIVIDE=p//1,
                                     p_CLKOUT2_PHASE=0., p_CLKOUT2_DIVIDE=p//1,
                                     p_CLKOUT3_PHASE=0., p_CLKOUT3_DIVIDE=p//1,
                                     p_CLKOUT4_PHASE=0., p_CLKOUT4_DIVIDE=p//1,  # sys
                                     p_CLKOUT5_PHASE=270., p_CLKOUT5_DIVIDE=p//1,  # sys_ps
        )
        self.specials += Instance("BUFG", i_I=pll[4], o_O=self.cd_sys.clk)
        self.specials += Instance("BUFG", i_I=pll[5], o_O=self.cd_sys_ps.clk)
        self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll_lckd)

        self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE",
                                  p_INIT=0, p_SRTYPE="SYNC",
                                  i_D0=0, i_D1=1, i_S=0, i_R=0, i_CE=1,
                                  i_C0=self.cd_sys.clk, i_C1=~self.cd_sys.clk,
                                  o_Q=platform.request("sdram_clock"))

        self.specials += Instance("BUFG", i_I=platform.request("clk50"), o_O=self.cd_base50.clk)
Exemplo n.º 22
0
    def __init__(self, clock_pads, pads, with_hw_init_reset, tx_delay=2e-9):
        self._reset = CSRStorage()

        # # #

        # RX Clock
        self.clock_domains.cd_eth_rx = ClockDomain()
        self.comb += self.cd_eth_rx.clk.eq(clock_pads.rx)

        # TX Clock
        self.clock_domains.cd_eth_tx = ClockDomain()
        self.comb += self.cd_eth_tx.clk.eq(self.cd_eth_rx.clk)
        tx_delay_taps = int(tx_delay / 25e-12)  # 25ps per tap
        assert tx_delay_taps < 128

        eth_tx_clk_o = Signal()
        self.specials += [
            DDROutput(clk=ClockSignal("eth_tx"), i1=1, i2=0, o=eth_tx_clk_o),
            Instance("DELAYG",
                     p_DEL_MODE="SCLK_ALIGNED",
                     p_DEL_VALUE=tx_delay_taps,
                     i_A=eth_tx_clk_o,
                     o_Z=clock_pads.tx)
        ]

        # Reset
        self.reset = reset = Signal()
        if with_hw_init_reset:
            self.submodules.hw_reset = LiteEthPHYHWReset()
            self.comb += reset.eq(self._reset.storage | self.hw_reset.reset)
        else:
            self.comb += reset.eq(self._reset.storage)
        if hasattr(pads, "rst_n"):
            self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
Exemplo n.º 23
0
    def __init__(self, clock_pads, pads, with_hw_init_reset, mii_mode=0):
        self._reset = CSRStorage()

        # # #

        self.clock_domains.cd_eth_rx = ClockDomain()
        self.clock_domains.cd_eth_tx = ClockDomain()

        self.comb += self.cd_eth_tx.clk.eq(ClockSignal("eth_tx_sclk"))
        #self.clock_domains.cd_eth_rx = ClockDomain()
        #self.clock_domains.cd_eth_tx = ClockDomain()

        # RX : Let the synthesis tool insert the appropriate clock buffer
        self.comb += self.cd_eth_rx.clk.eq(ClockSignal("eth_rx_sclk"))

        # TX : GMII: Drive clock_pads.gtx, clock_pads.tx unused
        #      MII: Use PHY clock_pads.tx as eth_tx_clk, do not drive clock_pads.gtx
        #self.specials += DDROutput(1, 0, clock_pads.tx, ClockSignal("eth_tx"))

        # hack to pass signal through the PLL to bring it from GR to Clock routing
        #self.comb += self.cd_eth_tx.clk.eq(ClockSignal("clk125"))

        #eth_rx_clk_ibuf = Signal()
        #self.comb += self.cd_eth_rx.clk.eq(clock_pads.rx)

        # Reset
        reset = Signal()
        if with_hw_init_reset:
            self.submodules.hw_reset = LiteEthPHYHWReset()
            self.comb += reset.eq(self._reset.storage | self.hw_reset.reset)
        else:
            self.comb += reset.eq(self._reset.storage)
        if hasattr(pads, "rst_n"):
            self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
Exemplo n.º 24
0
    def __init__(self, platform, sys_clk_freq, with_usb_pll=False):
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys_ps = ClockDomain(reset_less=True)
        self.clock_domains.cd_clk10 = ClockDomain(
        )  # FIXME: for initial LiteSDCard tests.

        # # #

        # Clk / Rst
        clk25 = platform.request("clk25")
        rst = platform.request("rst")

        # PLL
        self.submodules.pll = pll = ECP5PLL()
        self.comb += pll.reset.eq(rst)
        pll.register_clkin(clk25, 25e6)
        pll.create_clkout(self.cd_sys, sys_clk_freq)
        pll.create_clkout(self.cd_sys_ps, sys_clk_freq, phase=90)
        pll.create_clkout(self.cd_clk10, 10e6)
        self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll.locked | rst)
        self.specials += AsyncResetSynchronizer(self.cd_clk10,
                                                ~pll.locked | rst)

        # USB PLL
        if with_usb_pll:
            self.submodules.usb_pll = usb_pll = ECP5PLL()
            usb_pll.register_clkin(clk25, 25e6)
            self.clock_domains.cd_usb_12 = ClockDomain()
            self.clock_domains.cd_usb_48 = ClockDomain()
            usb_pll.create_clkout(self.cd_usb_12, 12e6, margin=0)
            usb_pll.create_clkout(self.cd_usb_48, 48e6, margin=0)

        # SDRAM clock
        self.specials += DDROutput(1, 0, platform.request("sdram_clock"),
                                   ClockSignal("sys_ps"))

        # Prevent ESP32 from resetting FPGA
        self.comb += platform.request("wifi_gpio0").eq(1)
Exemplo n.º 25
0
    def __init__(self, platform, sys_clk_freq):
        self.clock_domains.cd_por = ClockDomain()
        self.clock_domains.cd_sys = ClockDomain()

        # Built in OSC
        self.submodules.hf_clk = NXOSCA()
        hf_clk_freq = 25e6
        self.hf_clk.create_hf_clk(self.cd_por, hf_clk_freq)

        # Power on reset
        por_count = Signal(16, reset=2**16-1)
        por_done  = Signal()
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        self.rst_n = platform.request("gsrn")
        self.specials += AsyncResetSynchronizer(self.cd_por, ~self.rst_n)

        # PLL
        self.submodules.sys_pll = sys_pll = NXPLL(platform=platform, create_output_port_clocks=True)
        sys_pll.register_clkin(self.cd_por.clk, hf_clk_freq)
        sys_pll.create_clkout(self.cd_sys, sys_clk_freq)
        self.specials += AsyncResetSynchronizer(self.cd_sys, ~self.sys_pll.locked | ~por_done )
Exemplo n.º 26
0
    def __init__(self, platform, use_rtio_clock=False):
        self.ibuf_disable = CSRStorage(reset=1)
        self.jreset = CSRStorage(reset=1)
        self.jref = Signal()
        self.refclk = Signal()
        self.clock_domains.cd_jesd = ClockDomain()

        refclk2 = Signal()
        refclk_pads = platform.request("dac_refclk", 0)
        platform.add_period_constraint(refclk_pads.p, 1e9 / self.refclk_freq)
        self.specials += [
            Instance("IBUFDS_GTE3",
                     i_CEB=self.ibuf_disable.storage,
                     p_REFCLK_HROW_CK_SEL=0b00,
                     i_I=refclk_pads.p,
                     i_IB=refclk_pads.n,
                     o_O=self.refclk,
                     o_ODIV2=refclk2),
            AsyncResetSynchronizer(self.cd_jesd, self.jreset.storage),
        ]

        if use_rtio_clock:
            self.cd_jesd.clk.attr.add("keep")
            self.comb += self.cd_jesd.clk.eq(ClockSignal("rtio"))
        else:
            self.specials += Instance("BUFG_GT",
                                      i_I=refclk2,
                                      o_O=self.cd_jesd.clk)

        jref = platform.request("dac_sysref")
        jref_se = Signal()
        jref_r = Signal()
        self.specials += [
            Instance("IBUFDS_IBUFDISABLE",
                     p_USE_IBUFDISABLE="TRUE",
                     p_SIM_DEVICE="ULTRASCALE",
                     i_IBUFDISABLE=self.ibuf_disable.storage,
                     i_I=jref.p,
                     i_IB=jref.n,
                     o_O=jref_se),
            # SYSREF normally meets s/h at the FPGA, except during margin
            # scan and before full initialization.
            # Be paranoid and use a double-register anyway.
            Instance("FD",
                     i_C=ClockSignal("jesd"),
                     i_D=jref_se,
                     o_Q=jref_r,
                     attr={("IOB", "TRUE")}),
            Instance("FD", i_C=ClockSignal("jesd"), i_D=jref_r, o_Q=self.jref)
        ]
Exemplo n.º 27
0
    def __init__(self,
                 platform,
                 sys_clk_freq,
                 with_usb_pll=False,
                 with_rst=True,
                 sdram_rate="1:1"):
        self.clock_domains.cd_sys = ClockDomain()
        if sdram_rate == "1:2":
            self.clock_domains.cd_sys2x = ClockDomain()
            self.clock_domains.cd_sys2x_ps = ClockDomain(reset_less=True)
        else:
            self.clock_domains.cd_sys_ps = ClockDomain(reset_less=True)

        # # #

        # Clk / Rst
        clk25 = platform.request("clk25")
        rst_n = 1 if not with_rst else platform.request("user_btn_n", 0)

        # PLL
        self.submodules.pll = pll = ECP5PLL()

        pll.register_clkin(clk25, 25e6)
        pll.create_clkout(self.cd_sys, sys_clk_freq)
        if sdram_rate == "1:2":
            pll.create_clkout(self.cd_sys2x, 2 * sys_clk_freq)
            pll.create_clkout(
                self.cd_sys2x_ps, 2 * sys_clk_freq,
                phase=180)  # Idealy 90° but needs to be increased.
        else:
            pll.create_clkout(
                self.cd_sys_ps, sys_clk_freq,
                phase=180)  # Idealy 90° but needs to be increased.
        self.specials += AsyncResetSynchronizer(self.cd_sys,
                                                ~pll.locked | ~rst_n)

        # USB PLL
        if with_usb_pll:
            self.submodules.usb_pll = usb_pll = ECP5PLL()
            usb_pll.register_clkin(clk25, 25e6)
            self.clock_domains.cd_usb_12 = ClockDomain()
            self.clock_domains.cd_usb_48 = ClockDomain()
            usb_pll.create_clkout(self.cd_usb_12, 12e6, margin=0)
            usb_pll.create_clkout(self.cd_usb_48, 48e6, margin=0)

        # SDRAM clock
        sdram_clk = ClockSignal("sys2x_ps" if sdram_rate ==
                                "1:2" else "sys_ps")
        self.specials += DDROutput(1, 0, platform.request("sdram_clock"),
                                   sdram_clk)
Exemplo n.º 28
0
    def __init__(self, clock_pads, pads, refclk_cd, with_hw_init_reset):
        self._reset = CSRStorage()

        # # #

        # RX/TX clocks

        self.clock_domains.cd_eth_rx = ClockDomain()
        self.clock_domains.cd_eth_tx = ClockDomain()

        # When no refclk_cd, use clock_pads.ref_clk as RMII reference clock.
        if refclk_cd is None:
            self.comb += self.cd_eth_rx.clk.eq(clock_pads.ref_clk)
            self.comb += self.cd_eth_tx.clk.eq(clock_pads.ref_clk)

        # Else use refclk_cd as RMII reference clock (provided by user design).
        else:
            self.comb += self.cd_eth_rx.clk.eq(ClockSignal(refclk_cd))
            self.comb += self.cd_eth_tx.clk.eq(ClockSignal(refclk_cd))
            # Drive clock_pads if provided.
            if clock_pads is not None:
                self.specials += DDROutput(0, 1, clock_pads.ref_clk,
                                           ClockSignal("eth_tx"))

        # Reset
        self.reset = reset = Signal()
        if with_hw_init_reset:
            self.submodules.hw_reset = LiteEthPHYHWReset()
            self.comb += reset.eq(self._reset.storage | self.hw_reset.reset)
        else:
            self.comb += reset.eq(self._reset.storage)
        if hasattr(pads, "rst_n"):
            self.comb += pads.rst_n.eq(~reset)
        self.specials += [
            AsyncResetSynchronizer(self.cd_eth_tx, reset),
            AsyncResetSynchronizer(self.cd_eth_rx, reset),
        ]
Exemplo n.º 29
0
    def __init__(self, platform, sys_clk_freq):
        self.rst = Signal()
        self.clock_domains.cd_init = ClockDomain()
        self.clock_domains.cd_por = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys = ClockDomain()
        self.clock_domains.cd_sys2x = ClockDomain(reset_less=True)
        self.clock_domains.cd_sys2x_i = ClockDomain(reset_less=True)

        # # #
        self.stop = Signal()
        self.reset = Signal()

        # Clk / Rst
        clk100 = platform.request("clk100")
        rst_n = platform.request("rst_n")

        # Power on reset
        por_count = Signal(16, reset=2**16 - 1)
        por_done = Signal()
        self.comb += self.cd_por.clk.eq(clk100)
        self.comb += por_done.eq(por_count == 0)
        self.sync.por += If(~por_done, por_count.eq(por_count - 1))

        # PLL
        self.submodules.pll = pll = ECP5PLL()
        self.comb += pll.reset.eq(~por_done | ~rst_n | self.rst)
        pll.register_clkin(clk100, 100e6)
        pll.create_clkout(self.cd_sys2x_i, 2 * sys_clk_freq)
        pll.create_clkout(self.cd_init, 25e6)
        self.specials += [
            Instance("ECLKSYNCB",
                     i_ECLKI=self.cd_sys2x_i.clk,
                     i_STOP=self.stop,
                     o_ECLKO=self.cd_sys2x.clk),
            Instance("CLKDIVF",
                     p_DIV="2.0",
                     i_ALIGNWD=0,
                     i_CLKI=self.cd_sys2x.clk,
                     i_RST=self.reset,
                     o_CDIVX=self.cd_sys.clk),
            AsyncResetSynchronizer(self.cd_sys, ~pll.locked | self.reset),
        ]

        # HDMI
        self.clock_domains.cd_hdmi = ClockDomain(reset_less=True)
        #pll.create_clkout(self.cd_hdmi, 148.5e6) # for terminal "1920x1080@60Hz"
        #pll.create_clkout(self.cd_hdmi, 160e6) # for terminal "1920x1080@60Hz"
        #pll.create_clkout(self.cd_hdmi, 80e6) # for terminal "1920x1080@30Hz"
        pll.create_clkout(self.cd_hdmi, 40e6)  # for terminal "800x600@60Hz"
Exemplo n.º 30
0
    def __init__(self,
                 platform,
                 sys_clk_freq,
                 with_usb_pll=False,
                 sdram_rate="1:1"):
        self.clock_domains.cd_sys = ClockDomain()
        if sdram_rate == "1:2":
            self.clock_domains.cd_sys2x = ClockDomain()
            self.clock_domains.cd_sys2x_ps = ClockDomain(reset_less=True)
        else:
            self.clock_domains.cd_sys_ps = ClockDomain(reset_less=True)

        # # #

        # Clk / Rst
        clk25 = platform.request("clk25")
        rst = platform.request("rst")

        # PLL
        self.submodules.pll = pll = ECP5PLL()
        self.comb += pll.reset.eq(rst)
        pll.register_clkin(clk25, 25e6)
        pll.create_clkout(self.cd_sys, sys_clk_freq)
        if sdram_rate == "1:2":
            pll.create_clkout(self.cd_sys2x, 2 * sys_clk_freq)
            pll.create_clkout(
                self.cd_sys2x_ps, 2 * sys_clk_freq,
                phase=180)  # Idealy 90° but needs to be increased.
        else:
            pll.create_clkout(self.cd_sys_ps, sys_clk_freq, phase=90)
        self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll.locked | rst)

        # USB PLL
        if with_usb_pll:
            self.submodules.usb_pll = usb_pll = ECP5PLL()
            usb_pll.register_clkin(clk25, 25e6)
            self.clock_domains.cd_usb_12 = ClockDomain()
            self.clock_domains.cd_usb_48 = ClockDomain()
            usb_pll.create_clkout(self.cd_usb_12, 12e6, margin=0)
            usb_pll.create_clkout(self.cd_usb_48, 48e6, margin=0)

        # SDRAM clock
        sdram_clk = ClockSignal("sys2x_ps" if sdram_rate ==
                                "1:2" else "sys_ps")
        self.specials += DDROutput(1, 0, platform.request("sdram_clock"),
                                   sdram_clk)

        # Prevent ESP32 from resetting FPGA
        self.comb += platform.request("wifi_gpio0").eq(1)