Skip to content
Snippets Groups Projects
xilinx_zcu104.py 4.38 KiB
Newer Older
Piotr Binkowski's avatar
Piotr Binkowski committed
#!/usr/bin/env python3
#
# This file is part of LiteX-Boards.
#
# Copyright (c) 2020 Antmicro <www.antmicro.com>
# Copyright (c) 2019 David Shah <dave@ds0.me>
# SPDX-License-Identifier: BSD-2-Clause
Piotr Binkowski's avatar
Piotr Binkowski committed
import argparse

from migen import *
from migen.genlib.resetsync import AsyncResetSynchronizer
Piotr Binkowski's avatar
Piotr Binkowski committed

from litex_boards.platforms import zcu104

from litex.soc.cores.clock import *
from litex.soc.integration.soc_core import *
Piotr Binkowski's avatar
Piotr Binkowski committed
from litex.soc.integration.builder import *
from litex.soc.cores.led import LedChaser
Jędrzej Boczar's avatar
Jędrzej Boczar committed
from litex.soc.cores.bitbang import I2CMaster
Piotr Binkowski's avatar
Piotr Binkowski committed

from litedram.modules import MTA4ATF51264HZ
Piotr Binkowski's avatar
Piotr Binkowski committed
from litedram.phy import usddrphy

# CRG ----------------------------------------------------------------------------------------------

class _CRG(Module):
    def __init__(self, platform, sys_clk_freq):
Piotr Binkowski's avatar
Piotr Binkowski committed
        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()
Piotr Binkowski's avatar
Piotr Binkowski committed

        self.submodules.pll = pll = USMMCM(speedgrade=-2)
Piotr Binkowski's avatar
Piotr Binkowski committed
        pll.register_clkin(platform.request("clk125"), 125e6)
        pll.create_clkout(self.cd_pll4x, sys_clk_freq*4, buf=None, with_reset=False)
        platform.add_false_path_constraints(self.cd_sys.clk, pll.clkin) # Ignore sys_clk to pll.clkin path created by SoC's rst.
Piotr Binkowski's avatar
Piotr Binkowski committed

        self.specials += [
            Instance("BUFGCE_DIV", name="main_bufgce_div",
                p_BUFGCE_DIVIDE=4,
                i_CE=1, i_I=self.cd_pll4x.clk, o_O=self.cd_sys.clk),
            Instance("BUFGCE", name="main_bufgce",
                i_CE=1, i_I=self.cd_pll4x.clk, o_O=self.cd_sys4x.clk),
        ]

        self.submodules.idelayctrl = USIDELAYCTRL(cd_ref=self.cd_idelay, cd_sys=self.cd_sys)
Piotr Binkowski's avatar
Piotr Binkowski committed

# BaseSoC ------------------------------------------------------------------------------------------

    def __init__(self, sys_clk_freq=int(125e6), with_led_chaser=True, **kwargs):
Piotr Binkowski's avatar
Piotr Binkowski committed
        platform = zcu104.Platform()

        # SoCCore ----------------------------------------------------------------------------------
        SoCCore.__init__(self, platform, sys_clk_freq,
            ident          = "LiteX SoC on ZCU104",
            ident_version  = True,
            **kwargs)
Piotr Binkowski's avatar
Piotr Binkowski committed

        # CRG --------------------------------------------------------------------------------------
        self.submodules.crg = _CRG(platform, sys_clk_freq)

        # DDR4 SDRAM -------------------------------------------------------------------------------
        if not self.integrated_main_ram_size:
            self.submodules.ddrphy = usddrphy.USPDDRPHY(platform.request("ddram"),
Piotr Binkowski's avatar
Piotr Binkowski committed
                memtype          = "DDR4",
                sys_clk_freq     = sys_clk_freq,
                phy           = self.ddrphy,
                module        = MTA4ATF51264HZ(sys_clk_freq, "1:4"),
                size          = 0x40000000,
                l2_cache_size = kwargs.get("l2_size", 8192)
Piotr Binkowski's avatar
Piotr Binkowski committed

        # Leds -------------------------------------------------------------------------------------
        if with_led_chaser:
            self.submodules.leds = LedChaser(
                pads         = platform.request_all("user_led"),
                sys_clk_freq = sys_clk_freq)
Piotr Binkowski's avatar
Piotr Binkowski committed
# Build --------------------------------------------------------------------------------------------

def main():
    parser = argparse.ArgumentParser(description="LiteX SoC on ZCU104")
    parser.add_argument("--build",        action="store_true", help="Build bitstream")
    parser.add_argument("--load",         action="store_true", help="Load bitstream")
    parser.add_argument("--sys-clk-freq", default=125e6,       help="System clock frequency (default: 125MHz)")
Piotr Binkowski's avatar
Piotr Binkowski committed
    builder_args(parser)
Piotr Binkowski's avatar
Piotr Binkowski committed
    args = parser.parse_args()

    soc = BaseSoC(
        sys_clk_freq = int(float(args.sys_clk_freq)),
Piotr Binkowski's avatar
Piotr Binkowski committed
    builder = Builder(soc, **builder_argdict(args))
    builder.build(run=args.build)
Piotr Binkowski's avatar
Piotr Binkowski committed

    if args.load:
        prog = soc.platform.create_programmer()
        prog.load_bitstream(os.path.join(builder.gateware_dir, soc.build_name + ".bit"))
Piotr Binkowski's avatar
Piotr Binkowski committed

if __name__ == "__main__":
    main()