7 import litex_boards
.targets
.versa_ecp5
as versa_ecp5
8 import litex_boards
.targets
.ulx3s
as ulx3s
9 #import litex_boards.targets.arty as arty
10 import digilent_arty
as arty
12 from litex
.build
.lattice
.trellis
import trellis_args
, trellis_argdict
14 from litex
.soc
.integration
.soc_sdram
import (soc_sdram_args
,
16 from litex
.soc
.integration
.builder
import (Builder
, builder_args
,
19 from libresoc
import LibreSoC
20 from microwatt
import Microwatt
23 from litex
.soc
.integration
.soc
import SoCCSRHandler
24 SoCCSRHandler
.supported_address_width
.append(12)
28 # ----------------------------------------------------------------------------
30 from litex
.build
.generic_platform
import Subsignal
, Pins
, IOStandard
32 class VersaECP5TestSoC(versa_ecp5
.BaseSoC
):
33 def __init__(self
, sys_clk_freq
=int(16e6
), **kwargs
):
34 kwargs
["integrated_rom_size"] = 0x10000
35 #kwargs["integrated_main_ram_size"] = 0x1000
36 kwargs
["csr_data_width"] = 32
37 kwargs
['csr_address_width'] = 15 # limit to 0x8000
41 versa_ecp5
.BaseSoC
.__init
__(self
,
42 sys_clk_freq
= sys_clk_freq
,
43 cpu_type
= "external",
45 cpu_variant
= "standardjtagnoirq",
50 # (thanks to daveshah for this tip)
51 # use platform.add_extension to first define the pins
52 # https://github.com/daveshah1/linux-on-litex-vexriscv/commit/dc97bac3aeb04cfbf5116a6c7e324ce849391770#diff-2353956cb1116676bd6b96769c8ebf7b4b86c16c47511eb2888d0dd2a979e09eR117-R134
54 # define the pins, add as an extension, *then* request it
57 Subsignal("tdi", Pins("B19"), IOStandard("LVCMOS33")),
58 Subsignal("tms", Pins("B12"), IOStandard("LVCMOS33")),
59 Subsignal("tck", Pins("B9"), IOStandard("LVCMOS33")),
60 Subsignal("tdo", Pins("E6"), IOStandard("LVCMOS33")),
63 self
.platform
.add_extension(jtag_ios
)
64 jtag
= self
.platform
.request("jtag")
66 # wire the pins up to CPU JTAG
67 self
.comb
+= self
.cpu
.jtag_tck
.eq(jtag
.tck
)
68 self
.comb
+= self
.cpu
.jtag_tms
.eq(jtag
.tms
)
69 self
.comb
+= self
.cpu
.jtag_tdi
.eq(jtag
.tdi
)
70 self
.comb
+= jtag
.tdo
.eq(self
.cpu
.jtag_tdo
)
73 #self.add_constant("MEMTEST_BUS_SIZE", 256//16)
74 #self.add_constant("MEMTEST_DATA_SIZE", 256//16)
75 #self.add_constant("MEMTEST_ADDR_SIZE", 256//16)
77 #self.add_constant("MEMTEST_BUS_DEBUG", 1)
78 #self.add_constant("MEMTEST_ADDR_DEBUG", 1)
79 #self.add_constant("MEMTEST_DATA_DEBUG", 1)
82 class ULX3S85FTestSoC(ulx3s
.BaseSoC
):
83 def __init__(self
, sys_clk_freq
=int(16e6
), **kwargs
):
84 kwargs
["integrated_rom_size"] = 0x10000
85 #kwargs["integrated_main_ram_size"] = 0x1000
86 kwargs
["csr_data_width"] = 32
87 kwargs
['csr_address_width'] = 15 # limit to 0x8000
91 ulx3s
.BaseSoC
.__init
__(self
,
92 sys_clk_freq
= sys_clk_freq
,
93 cpu_type
= "external",
95 cpu_variant
= "standardjtag",
100 # get 4 arbitrarily assinged logical pins, each gpio has
101 # 2 distinct physical single non-differential pins p and n
102 gpio0
= self
.platform
.request("gpio", 0)
103 gpio1
= self
.platform
.request("gpio", 1)
105 # assign p, n litex 'subsignals' of each gpio to jtag pins
111 # wire the pins up to CPU JTAG
112 self
.comb
+= self
.cpu
.jtag_tdi
.eq(jtag_tdi
)
113 self
.comb
+= self
.cpu
.jtag_tms
.eq(jtag_tms
)
114 self
.comb
+= self
.cpu
.jtag_tdi
.eq(jtag_tdi
)
115 self
.comb
+= jtag_tdo
.eq(self
.cpu
.jtag_tdo
)
118 class ArtyTestSoC(arty
.BaseSoC
):
119 def __init__(self
, sys_clk_freq
=int(100e6
), **kwargs
):
120 kwargs
["integrated_rom_size"] = 0x10000
121 #kwargs["integrated_main_ram_size"] = 0x1000
122 kwargs
["csr_data_width"] = 32
123 kwargs
['csr_address_width'] = 15 # limit to 0x8000
124 kwargs
["l2_size"] = 0
125 #bus_data_width = 16,
127 arty
.BaseSoC
.__init
__(self
,
128 sys_clk_freq
= sys_clk_freq
,
129 cpu_type
= "external",
131 cpu_variant
= "standardjtag",
132 #cpu_cls = Microwatt,
134 toolchain
= "symbiflow",
139 # ----------------------------------------------------------------------------
142 parser
= argparse
.ArgumentParser(description
="LiteX SoC with LibreSoC " \
143 "CPU on Versa ECP5 or ULX3S LFE5U85F")
144 parser
.add_argument("--build", action
="store_true", help="Build bitstream")
145 parser
.add_argument("--load", action
="store_true", help="Load bitstream")
146 parser
.add_argument("--sys-clk-freq", default
=int(16e6
),
147 help="System clock frequency (default=16MHz)")
148 parser
.add_argument("--fpga", default
="versa_ecp5", help="FPGA target " \
149 "to build for/load to")
150 parser
.add_argument("--load-from", default
=None, help="svf to load, disables build")
151 parser
.add_argument("--toolchain", default
="trellis", help="Gateware toolchain to use, trellis (default) or diamond")
154 soc_sdram_args(parser
)
156 args
= parser
.parse_args()
159 if args
.fpga
== "versa_ecp5":
160 soc
= VersaECP5TestSoC(sys_clk_freq
=int(float(args
.sys_clk_freq
)),
161 **soc_sdram_argdict(args
))
163 elif args
.fpga
== "ulx3s85f":
164 soc
= ULX3S85FTestSoC(sys_clk_freq
=int(float(args
.sys_clk_freq
)),
165 **soc_sdram_argdict(args
))
167 elif args
.fpga
== "artya7100t":
168 soc
= ArtyTestSoC(sys_clk_freq
=int(float(args
.sys_clk_freq
)),
169 **soc_sdram_argdict(args
))
173 soc
= VersaECP5TestSoC(sys_clk_freq
=int(float(args
.sys_clk_freq
)),
174 **soc_sdram_argdict(args
))
176 if args
.load_from
== None:
177 builder
= Builder(soc
, **builder_argdict(args
))
178 builder_kargs
= trellis_argdict(args
) \
179 if args
.toolchain
== "trellis" else {}
180 builder
.build(**builder_kargs
, run
=args
.build
)
183 prog
= soc
.platform
.create_programmer()
184 prog
.load_bitstream(os
.path
.join(builder
.gateware_dir
,
185 soc
.build_name
+ loadext
))
187 if args
.load
or args
.build
:
188 print("--load-from is incompatible with --load and --build",
191 prog
= soc
.platform
.create_programmer()
192 prog
.load_bitstream(args
.load_from
)
194 if __name__
== "__main__":