3 # This file is Copyright (c) 2013-2014 Sebastien Bourdeauducq <sb@m-labs.hk>
4 # This file is Copyright (c) 2014-2019 Florent Kermarrec <florent@enjoy-digital.fr>
5 # This file is Copyright (c) 2014 Yann Sionneau <ys@m-labs.hk>
10 from fractions
import Fraction
13 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
15 from litex
.build
.io
import DDROutput
17 from litex
.boards
.platforms
import minispartan6
19 from litex
.soc
.cores
.clock
import *
20 from litex
.soc
.integration
.soc_core
import *
21 from litex
.soc
.integration
.soc_sdram
import *
22 from litex
.soc
.integration
.builder
import *
23 from litex
.soc
.cores
.led
import LedChaser
25 from litedram
.modules
import AS4C16M16
26 from litedram
.phy
import GENSDRPHY
28 # CRG ----------------------------------------------------------------------------------------------
31 def __init__(self
, platform
, clk_freq
):
32 self
.clock_domains
.cd_sys
= ClockDomain()
33 self
.clock_domains
.cd_sys_ps
= ClockDomain(reset_less
=True)
37 self
.submodules
.pll
= pll
= S6PLL(speedgrade
=-1)
38 pll
.register_clkin(platform
.request("clk32"), 32e6
)
39 pll
.create_clkout(self
.cd_sys
, clk_freq
)
40 pll
.create_clkout(self
.cd_sys_ps
, clk_freq
, phase
=90)
43 self
.specials
+= DDROutput(1, 0, platform
.request("sdram_clock"), ClockSignal("sys_ps"))
45 # BaseSoC ------------------------------------------------------------------------------------------
47 class BaseSoC(SoCCore
):
48 def __init__(self
, sys_clk_freq
=int(80e6
), **kwargs
):
49 platform
= minispartan6
.Platform()
51 # SoCCore ----------------------------------------------------------------------------------
52 SoCCore
.__init
__(self
, platform
, clk_freq
=sys_clk_freq
, **kwargs
)
54 # CRG --------------------------------------------------------------------------------------
55 self
.submodules
.crg
= _CRG(platform
, sys_clk_freq
)
57 # SDR SDRAM --------------------------------------------------------------------------------
58 if not self
.integrated_main_ram_size
:
59 self
.submodules
.sdrphy
= GENSDRPHY(platform
.request("sdram"))
60 self
.add_sdram("sdram",
62 module
= AS4C16M16(sys_clk_freq
, "1:1"),
63 origin
= self
.mem_map
["main_ram"],
64 size
= kwargs
.get("max_sdram_size", 0x40000000),
65 l2_cache_size
= kwargs
.get("l2_size", 8192),
66 l2_cache_min_data_width
= kwargs
.get("min_l2_data_width", 128),
67 l2_cache_reverse
= True
70 # Leds -------------------------------------------------------------------------------------
71 self
.submodules
.leds
= LedChaser(
72 pads
= Cat(*[platform
.request("user_led", i
) for i
in range(8)]),
73 sys_clk_freq
= sys_clk_freq
)
76 # Build --------------------------------------------------------------------------------------------
79 parser
= argparse
.ArgumentParser(description
="LiteX SoC on MiniSpartan6")
80 parser
.add_argument("--build", action
="store_true", help="Build bitstream")
81 parser
.add_argument("--load", action
="store_true", help="Load bitstream")
83 soc_sdram_args(parser
)
84 args
= parser
.parse_args()
86 soc
= BaseSoC(**soc_sdram_argdict(args
))
87 builder
= Builder(soc
, **builder_argdict(args
))
88 builder
.build(run
=args
.build
)
91 prog
= soc
.platform
.create_programmer()
92 prog
.load_bitstream(os
.path
.join(builder
.gateware_dir
, soc
.build_name
+ ".bit"))
94 if __name__
== "__main__":