Skip to content
Snippets Groups Projects
zcu104.py 4.49 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 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.soc_sdram import *
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)
        pll.create_clkout(self.cd_idelay, 500e6, with_reset=False)
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),
            AsyncResetSynchronizer(self.cd_idelay, ~pll.locked),
        self.submodules.idelayctrl = USIDELAYCTRL(cd_ref=self.cd_idelay, cd_sys=self.cd_sys)
Piotr Binkowski's avatar
Piotr Binkowski committed

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

Piotr Binkowski's avatar
Piotr Binkowski committed
    def __init__(self, sys_clk_freq=int(125e6), **kwargs):
        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,
Piotr Binkowski's avatar
Piotr Binkowski committed
            self.add_csr("ddrphy")
            self.add_sdram("sdram",
                phy                     = self.ddrphy,
                module                  = MTA4ATF51264HZ(sys_clk_freq, "1:4"),
                origin                  = self.mem_map["main_ram"],
                size                    = kwargs.get("max_sdram_size", 0x40000000),
                l2_cache_size           = kwargs.get("l2_size", 8192),
                l2_cache_min_data_width = kwargs.get("min_l2_data_width", 128),
                l2_cache_reverse        = True
            )
Piotr Binkowski's avatar
Piotr Binkowski committed

            self.submodules.i2c = I2CMaster(platform.request("i2c"))
Jędrzej Boczar's avatar
Jędrzej Boczar committed
            self.add_csr("i2c")

        # Leds -------------------------------------------------------------------------------------
        self.submodules.leds = LedChaser(
            pads         = platform.request_all("user_led"),
            sys_clk_freq = sys_clk_freq)
        self.add_csr("leds")

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")
Piotr Binkowski's avatar
Piotr Binkowski committed
    builder_args(parser)
    soc_sdram_args(parser)
    args = parser.parse_args()

    soc = BaseSoC(**soc_sdram_argdict(args))
    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()