9dfd950a80322e5aa99b3aaa211d740a049be8c6
[nmigen-boards.git] / nmigen_boards / icebreaker.py
1 import os
2 import subprocess
3
4 from nmigen.build import *
5 from nmigen.vendor.lattice_ice40 import *
6 from .dev import *
7
8
9 __all__ = ["ICEBreakerPlatform"]
10
11
12 class ICEBreakerPlatform(LatticeICE40Platform):
13 device = "iCE40UP5K"
14 package = "SG48"
15 default_clk = "clk12"
16 resources = [
17 Resource("clk12", 0, Pins("35", dir="i"),
18 Clock(12e6), Attrs(GLOBAL=True, IO_STANDARD="SB_LVCMOS33")),
19
20 Resource("user_led", 0, PinsN("11", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS33")),
21 Resource("user_led", 1, PinsN("37", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS33")),
22 # Color-specific aliases
23 Resource("user_ledr", 0, PinsN("11", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS33")),
24 Resource("user_ledg", 0, PinsN("37", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS33")),
25
26 Resource("user_btn", 0, PinsN("10", dir="i"), Attrs(IO_STANDARD="SB_LVCMOS33")),
27
28 UARTResource(0,
29 rx="6", tx="9",
30 attrs=Attrs(IO_STANDARD="SB_LVTTL", PULLUP=1)
31 ),
32
33 *SPIFlashResources(0,
34 cs="16", clk="15", mosi="14", miso="17", wp="12", hold="13",
35 attrs=Attrs(IO_STANDARD="SB_LVCMOS33")
36 ),
37 ]
38 connectors = [
39 Connector("pmod", 0, " 4 2 47 45 - - 3 48 46 44 - -"), # PMOD1A
40 Connector("pmod", 1, "43 38 34 31 - - 42 36 32 28 - -"), # PMOD1B
41 Connector("pmod", 2, "27 25 21 19 - - 26 23 20 18 - -"), # PMOD2
42 ]
43 # The attached LED/button section can be either used standalone or as a PMOD.
44 # Attach to platform using:
45 # p.add_resources(p.break_off_pmod)
46 # pmod_btn = plat.request("user_btn")
47 break_off_pmod = [
48 Resource("user_btn", 1, Pins("9", dir="i", conn=("pmod", 2)),
49 Attrs(IO_STANDARD="SB_LVCMOS33")),
50 Resource("user_btn", 2, Pins("4", dir="i", conn=("pmod", 2)),
51 Attrs(IO_STANDARD="SB_LVCMOS33")),
52 Resource("user_btn", 3, Pins("10", dir="i", conn=("pmod", 2)),
53 Attrs(IO_STANDARD="SB_LVCMOS33")),
54
55 Resource("user_led", 2, Pins("7", dir="o", conn=("pmod", 2)),
56 Attrs(IO_STANDARD="SB_LVCMOS33")),
57 Resource("user_led", 3, Pins("1", dir="o", conn=("pmod", 2)),
58 Attrs(IO_STANDARD="SB_LVCMOS33")),
59 Resource("user_led", 4, Pins("2", dir="o", conn=("pmod", 2)),
60 Attrs(IO_STANDARD="SB_LVCMOS33")),
61 Resource("user_led", 5, Pins("8", dir="o", conn=("pmod", 2)),
62 Attrs(IO_STANDARD="SB_LVCMOS33")),
63 Resource("user_led", 6, Pins("3", dir="o", conn=("pmod", 2)),
64 Attrs(IO_STANDARD="SB_LVCMOS33")),
65
66 # Color-specific aliases
67 Resource("user_ledr", 1, Pins("7", dir="o", conn=("pmod", 2)),
68 Attrs(IO_STANDARD="SB_LVCMOS33")),
69 Resource("user_ledg", 1, Pins("1", dir="o", conn=("pmod", 2)),
70 Attrs(IO_STANDARD="SB_LVCMOS33")),
71 Resource("user_ledg", 2, Pins("2", dir="o", conn=("pmod", 2)),
72 Attrs(IO_STANDARD="SB_LVCMOS33")),
73 Resource("user_ledg", 3, Pins("8", dir="o", conn=("pmod", 2)),
74 Attrs(IO_STANDARD="SB_LVCMOS33")),
75 Resource("user_ledg", 4, Pins("3", dir="o", conn=("pmod", 2)),
76 Attrs(IO_STANDARD="SB_LVCMOS33"))
77 ]
78
79 def toolchain_program(self, products, name):
80 iceprog = os.environ.get("ICEPROG", "iceprog")
81 with products.extract("{}.bin".format(name)) as bitstream_filename:
82 subprocess.check_call([iceprog, bitstream_filename])
83
84
85 if __name__ == "__main__":
86 from ._blinky import Blinky
87 p = ICEBreakerPlatform()
88 p.add_resources(p.break_off_pmod)
89 p.build(Blinky(), do_program=True)