1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
import os
import subprocess
import shutil
from amaranth.build import *
from amaranth.vendor.lattice_ecp5 import *
from .resources import *
__all__ = ["OrangeCrabR0_2Platform"]
class OrangeCrabR0_2Platform(LatticeECP5Platform):
device = "LFE5U-25F"
package = "MG285"
speed = "8"
default_clk = "clk"
resources = [
Resource("clk", 0, Pins("A9", dir="i"),
Clock(48e6), Attrs(IO_TYPE="LVCMOS33")),
# Used to reload FPGA configuration.
# Can enter USB bootloader by assigning button 0 to program.
Resource("program", 0, PinsN("V17", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
RGBLEDResource(0,
r="K4", g="M3", b="J3", invert=True,
attrs=Attrs(IO_TYPE="LVCMOS33")),
*ButtonResources(
pins={0: "J17" }, invert=True,
attrs=Attrs(IO_TYPE="SSTL135_I")),
*SPIFlashResources(0,
cs_n="U17", clk="U16", cipo="T18", copi="U18", wp_n="R18", hold_n="N18",
attrs=Attrs(IO_TYPE="LVCMOS33"),
),
Resource("ddr3", 0,
Subsignal("rst", PinsN("L18", dir="o")),
Subsignal("clk", DiffPairs("J18", "K18", dir="o"), Attrs(IO_TYPE="SSTL135D_I")),
Subsignal("clk_en", Pins("D18", dir="o")),
Subsignal("cs", PinsN("A12", dir="o")),
Subsignal("we", PinsN("B12", dir="o")),
Subsignal("ras", PinsN("C12", dir="o")),
Subsignal("cas", PinsN("D13", dir="o")),
Subsignal("a", Pins("C4 D2 D3 A3 A4 D4 C3 B2 B1 D1 A7 C2 B6 C1 A2 C7", dir="o")),
Subsignal("ba", Pins("P5 N3 M3", dir="o")),
Subsignal("dqs", DiffPairs("G18 H17", "B15 A16", dir="io"),
Attrs(IO_TYPE="SSTL135D_I", TERMINATION="OFF",
DIFFRESISTOR="100")),
Subsignal("dq", Pins("C17 D15 B17 C16 A15 B13 A17 A13 F17 F16 G15 F15 J16 C18 H16 F18",
dir="io"), Attrs(TERMINATION="75")),
Subsignal("dm", Pins("G16 D16", dir="o")),
Subsignal("odt", Pins("C13", dir="o")),
Attrs(IO_TYPE="SSTL135_I", SLEWRATE="FAST")
),
Resource("ddr3_pseudo_power", 0,
# pseudo power pins, leave these at their default value
Subsignal("vcc_virtual", PinsN("K16 D17 K15 K17 B18 C6", dir="o")),
Subsignal("gnd_virtual", Pins("L15 L16", dir="o")),
Attrs(IO_TYPE="SSTL135_II", SLEWRATE="FAST")
),
Resource("adc", 0,
Subsignal("ctrl", Pins("G1 F1", dir="o")),
Subsignal("mux", Pins("F4 F3 F2 H1", dir="o")),
Subsignal("sense", DiffPairs("H3", "G3", dir="i"), Attrs(IO_TYPE="LVCMOS33D")),
Attrs(IO_TYPE="LVCMOS33")
),
*SDCardResources(0,
dat0="J1", dat1="K3", dat2="L3", dat3="M1", clk="K1", cmd="K2", cd="L1",
attrs=Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")
),
DirectUSBResource(0, d_p="N1", d_n="M2", pullup="N2", attrs=Attrs(IO_TYPE="LVCMOS33"))
]
connectors = [
Connector("io", 0, {
"0": "N17",
"1": "M18",
"5": "B10",
"6": "B9",
"9": "C8",
"10": "B8",
"11": "A8",
"12": "H2",
"13": "J2",
"a0": "L4",
"a1": "N3",
"a2": "N4",
"a3": "H4",
"a4": "G4",
"cipo": "N15",
"copi": "N16",
"sck": "R17",
"scl": "C9",
"sda": "C10"
})
]
@property
def required_tools(self):
return super().required_tools + [
"dfu-suffix"
]
@property
def command_templates(self):
return super().command_templates + [
r"""
{{invoke_tool("dfu-suffix")}}
-v 1209 -p 5af0 -a {{name}}.bit
"""
]
def toolchain_prepare(self, fragment, name, **kwargs):
overrides = dict(ecppack_opts="--compress --freq 38.8")
overrides.update(kwargs)
return super().toolchain_prepare(fragment, name, **overrides)
def toolchain_program(self, products, name):
dfu_util = os.environ.get("DFU_UTIL", "dfu-util")
with products.extract("{}.bit".format(name)) as bitstream_filename:
subprocess.check_call([dfu_util, "-D", bitstream_filename])
if __name__ == "__main__":
from .test.blinky import *
OrangeCrabR0_2Platform().build(Blinky(), do_program=True)
|