| #!/usr/bin/env python3 |
| |
| import os |
| import argparse |
| |
| from litex_boards.targets.arty import _CRG |
| from liteeth.phy.mii import LiteEthPHYMII |
| from litex.soc.cores.led import LedChaser |
| from litex_boards.platforms import arty |
| from litex.soc.integration.soc_core import SoCCore |
| from litex.soc.integration.builder import Builder |
| from litex.soc.integration.soc_core import soc_core_args, soc_core_argdict |
| from litex.build.xilinx.vivado import vivado_build_args, vivado_build_argdict |
| |
| from litedram.modules import MT41K128M16 |
| from litedram.phy import s7ddrphy |
| |
| |
| class BaseSoC(SoCCore): |
| def __init__( |
| self, |
| toolchain="vivado", |
| sys_clk_freq=int(80e6), |
| with_ethernet=False, |
| with_ram=False, |
| board_variant="a7-35", |
| **kwargs |
| ): |
| |
| platform = arty.Platform(variant=board_variant, toolchain=toolchain) |
| SoCCore.__init__( |
| self, |
| platform, |
| sys_clk_freq, |
| ident="LiteX SoC on Arty A7", |
| ident_version=False, |
| **kwargs |
| ) |
| |
| self.submodules.crg = _CRG(platform, sys_clk_freq) |
| |
| # DDR3 SDRAM ------------------------------------------------------------------------------- |
| if with_ram: |
| self.submodules.ddrphy = s7ddrphy.A7DDRPHY( |
| platform.request("ddram"), |
| memtype="DDR3", |
| nphases=4, |
| sys_clk_freq=sys_clk_freq |
| ) |
| self.add_csr("ddrphy") |
| self.add_sdram( |
| "sdram", |
| phy=self.ddrphy, |
| module=MT41K128M16(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 |
| ) |
| |
| if with_ethernet: |
| self.submodules.ethphy = LiteEthPHYMII( |
| clock_pads=self.platform.request("eth_clocks"), |
| pads=self.platform.request("eth") |
| ) |
| self.add_csr("ethphy") |
| self.add_ethernet(phy=self.ethphy) |
| |
| self.submodules.leds = LedChaser( |
| pads=platform.request_all("user_led"), sys_clk_freq=sys_clk_freq |
| ) |
| self.add_csr("leds") |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description="LiteX SoC on Arty A7") |
| parser.add_argument("--load", action="store_true", help="Load bitstream") |
| parser.add_argument("--build", action="store_true", help="Build bitstream") |
| parser.add_argument("--build-name", default="top", help="Build name") |
| parser.add_argument( |
| "--toolchain", |
| default="vivado", |
| help="Gateware toolchain to use, vivado or symbiflow (default)" |
| ) |
| parser.add_argument( |
| "--with-ethernet", action="store_true", help="Enable Ethernet support" |
| ) |
| parser.add_argument( |
| "--with-ram", action="store_true", help="Enable Main RAM" |
| ) |
| parser.add_argument( |
| "--board", default="a7-35", help="Specifies Arty Board version" |
| ) |
| parser.add_argument("--builddir", help="Build directory") |
| |
| soc_core_args(parser) |
| vivado_build_args(parser) |
| args = parser.parse_args() |
| |
| if args.board not in ["a7-35", "a7-100"]: |
| raise ValueError("Unsupported device variant!") |
| |
| soc = BaseSoC( |
| toolchain=args.toolchain, |
| sys_clk_freq=int(80e6), |
| with_ethernet=args.with_ethernet, |
| with_ram=args.with_ram, |
| board_variant=args.board, |
| **soc_core_argdict(args) |
| ) |
| |
| builder = Builder(soc, output_dir=args.builddir) |
| builder_kwargs = vivado_build_argdict( |
| args |
| ) if args.toolchain == "vivado" else {} |
| builder.build(**builder_kwargs, run=args.build, build_name=args.build_name) |
| |
| if args.load: |
| prog = soc.platform.create_programmer() |
| prog.load_bitstream( |
| os.path.join(builder.gateware_dir, soc.build_name + ".bit") |
| ) |
| |
| |
| if __name__ == "__main__": |
| main() |