6 from migen
.genlib
.resetsync
import AsyncResetSynchronizer
8 from litex
.boards
.platforms
import ulx3s
10 from litex
.soc
.integration
.soc_sdram
import *
11 from litex
.soc
.integration
.builder
import *
13 from litedram
.modules
import MT48LC16M16
14 from litedram
.phy
import GENSDRPHY
18 def __init__(self
, platform
):
19 self
.clock_domains
.cd_sys
= ClockDomain()
20 self
.clock_domains
.cd_sys_ps
= ClockDomain()
24 clk25
= platform
.request("clk25")
25 rst
= platform
.request("rst")
28 # FIXME: AsyncResetSynchronizer needs FD1S3BX support.
29 #self.specials += AsyncResetSynchronizer(self.cd_sys, rst)
30 self
.comb
+= self
.cd_sys
.rst
.eq(rst
)
31 self
.comb
+= self
.cd_sys_ps
.rst
.eq(rst
)
34 sdram_ps_clk
= Signal()
36 self
.specials
+= Instance(
57 p_OUTDIVIDER_MUXB
="DIVB",
58 p_CLKOS_ENABLE
="ENABLED",
59 p_CLKOP_ENABLE
="ENABLED",
64 p_FEEDBK_PATH
="CLKOP",
65 attr
=[("ICP_CURRENT", "6"), ("LPF_RESISTOR", "16"), ("MFG_ENABLE_FILTEROPAMP", "1"), ("MFG_GMCREF_SEL", "2")]
68 self
.comb
+= self
.cd_sys
.clk
.eq(sys_clk
)
69 self
.comb
+= self
.cd_sys_ps
.clk
.eq(sdram_ps_clk
)
70 sdram_clock
= platform
.request("sdram_clock")
71 self
.comb
+= sdram_clock
.eq(sys_clk
)
73 # Stop ESP32 from resetting FPGA
74 wifi_gpio0
= platform
.request("wifi_gpio0")
75 self
.comb
+= wifi_gpio0
.eq(1)
77 ext0p
= platform
.request("ext0p")
78 self
.comb
+= ext0p
.eq(sdram_ps_clk
)
79 ext1p
= platform
.request("ext1p")
80 self
.comb
+= ext1p
.eq(self
.cd_sys
.clk
)
83 class BaseSoC(SoCSDRAM
):
84 def __init__(self
, **kwargs
):
85 platform
= ulx3s
.Platform(toolchain
="prjtrellis")
86 sys_clk_freq
= int(50e6
)
87 SoCSDRAM
.__init
__(self
, platform
, clk_freq
=sys_clk_freq
,
89 integrated_rom_size
=0x8000,
92 self
.submodules
.crg
= _CRG(platform
)
94 if not self
.integrated_main_ram_size
:
95 self
.submodules
.sdrphy
= GENSDRPHY(platform
.request("sdram"))
96 sdram_module
= MT48LC16M16(sys_clk_freq
, "1:1")
97 self
.register_sdram(self
.sdrphy
,
98 sdram_module
.geom_settings
,
99 sdram_module
.timing_settings
)
103 parser
= argparse
.ArgumentParser(description
="LiteX SoC port to the ULX3S")
105 soc_sdram_args(parser
)
106 args
= parser
.parse_args()
108 soc
= BaseSoC(**soc_sdram_argdict(args
))
109 builder
= Builder(soc
, **builder_argdict(args
))
113 if __name__
== "__main__":