|  | #!/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() |