Skip to content
Snippets Groups Projects
zcu104.py 4.45 KiB
Newer Older
  • Learn to ignore specific revisions
  • Piotr Binkowski's avatar
    Piotr Binkowski committed
    #!/usr/bin/env python3
    
    # This file is Copyright (c) 2020 Antmicro <www.antmicro.com>
    
    # This file is Copyright (c) 2019 David Shah <dave@ds0.me>
    # License: BSD
    
    
    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):
            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_clk500 = ClockDomain()
    
    Piotr Binkowski's avatar
    Piotr Binkowski committed
    
            self.submodules.pll = pll = USMMCM(speedgrade=-2)
            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_clk500, 500e6, with_reset=False)
    
            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_clk500, ~pll.locked),
            ]
    
    
            self.submodules.idelayctrl = USIDELAYCTRL(cd_ref=self.cd_clk500, 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
                    iodelay_clk_freq = 500e6,
    
                    cmd_latency      = 1)
    
    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         = Cat(*[platform.request("user_led", i) for i in range(4)]),
                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()