Add Digilent Atlys Spartan-6 board.
[nmigen-boards.git] / nmigen_boards / atlys.py
1 import subprocess
2 import textwrap
3
4 from nmigen.build import *
5 from nmigen.vendor.xilinx_spartan_3_6 import *
6 from .dev import *
7
8
9 __all__ = ["AtlysPlatform"]
10
11
12 class AtlysPlatform(XilinxSpartan6Platform):
13 """Platform file for Digilent Atlys Spartan 6 board.
14 https://reference.digilentinc.com/reference/programmable-logic/atlys/start"""
15
16 device = "xc6slx45"
17 package = "csg324"
18 speed = "3"
19
20 def __init__(self, JP12="2V5"):
21 super().__init__()
22
23 assert JP12 in ["2V5", "3V3"]
24 self._JP12 = JP12
25
26 def bank2_iostandard(self):
27 return "LVCMOS25" if self._JP12 == "2V5" else "LVCMOS33"
28
29 default_clk = "clk100"
30 resources = [
31 Resource("clk100" , 0, Pins("L15", dir="i"), Attrs(IOSTANDARD="LVCMOS33"), Clock(100e6)), # GCLK
32
33 Resource("user_led", 0, Pins("U18", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD0
34 Resource("user_led", 1, Pins("M14", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD1
35 Resource("user_led", 2, Pins("N14", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD2
36 Resource("user_led", 3, Pins("L14", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD3
37 Resource("user_led", 4, Pins("M13", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD4
38 Resource("user_led", 5, Pins("D4", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD5
39 Resource("user_led", 6, Pins("P16", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), # LD6
40 Resource("user_led", 7, Pins("N12", dir="o"), Attrs(IOSTANDARD=bank2_iostandard)), # LD7
41
42 Resource("user_btn", 0, PinsN("T15", dir="i"), Attrs(IOSTANDARD=bank2_iostandard)), # RESET
43 Resource("reset" , 0, PinsN("T15", dir="i"), Attrs(IOSTANDARD=bank2_iostandard)), # RESET
44 Resource("user_btn", 1, Pins("N4", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # BTNU
45 Resource("user_btn", 2, Pins("P4", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # BTNL
46 Resource("user_btn", 3, Pins("P3", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # BTND
47 Resource("user_btn", 4, Pins("F6", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # BTNR
48 Resource("user_btn", 5, Pins("F5", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # BTNC
49
50 Resource("user_sw" , 0, Pins("A10", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), # SW0
51 Resource("user_sw" , 1, Pins("D14", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), # SW1
52 Resource("user_sw" , 2, Pins("C14", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), # SW2
53 Resource("user_sw" , 3, Pins("P15", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), # SW3
54 Resource("user_sw" , 4, Pins("P12", dir="i"), Attrs(IOSTANDARD=bank2_iostandard)), # SW4
55 Resource("user_sw" , 5, Pins("R5", dir="i"), Attrs(IOSTANDARD=bank2_iostandard)), # SW5
56 Resource("user_sw" , 6, Pins("T5", dir="i"), Attrs(IOSTANDARD=bank2_iostandard)), # SW6
57 Resource("user_sw" , 7, Pins("E4", dir="i"), Attrs(IOSTANDARD="LVCMOS18")), # SW7
58
59 UARTResource(0, rx="A16", tx="B16", attrs=Attrs(IOSTANDARD="LVCMOS33")), # J17/UART
60
61 Resource("ps2", 0, # PS/2 keyboard interface converted from J13 "HOST" USB connector
62 Subsignal("clk", Pins("P17", dir="i")),
63 Subsignal("dat", Pins("N15", dir="io")),
64 Attrs(IOSTANDARD="LVCMOS33"),
65 ),
66 Resource("ps2", 1, # PS/2 mouse interface converted from J13 "HOST" USB connector
67 Subsignal("clk", Pins("N18", dir="i")),
68 Subsignal("dat", Pins("P18", dir="io")),
69 Attrs(IOSTANDARD="LVCMOS33"),
70 ),
71
72 *SPIFlashResources(0,
73 cs="AE14", clk="AH18", mosi="AF14", miso="AF20", wp="AG21", hold="AG17",
74 attrs=Attrs(IOSTANDARD="LVCMOS25", SLEW="FAST"),
75 ),
76
77 Resource("ddr2", 0,
78 Subsignal("clk", DiffPairs("G3", "G1", dir="o"),
79 Attrs(IOSTANDARD="DIFF_SSTL18_II", IN_TERM="NONE")),
80 Subsignal("clk_en", Pins("H7", dir="o")),
81 Subsignal("we", PinsN("E3", dir="o")),
82 Subsignal("ras", PinsN("L5", dir="o")),
83 Subsignal("cas", PinsN("K5", dir="o")),
84 Subsignal("a", Pins("J7 J6 H5 L7 F3 H4 H3 H6 D2 D1 F4 D3 G6", dir="o")),
85 Subsignal("ba", Pins("F2 F1 E1", dir="o")),
86 Subsignal("dqs", DiffPairs("P2 L4", "P1 L3", dir="o"),
87 Attrs(IOSTANDARD="DIFF_SSTL18_II")),
88 Subsignal("dq", Pins("L2 L1 K2 K1 H2 H1 J3 J1 M3 M1 N2 N1 T2 T1 U2 U1", dir="io")),
89 Subsignal("dm", Pins("K4 K3", dir="o")),
90 Subsignal("odt", Pins("K6", dir="o")),
91 Attrs(IOSTANDARD="SSTL18_II", SLEW="FAST"),
92 ),
93
94 Resource("eth_gmii", 0,
95 Subsignal("rst", PinsN("G13", dir="o")),
96 Subsignal("int", PinsN("L16", dir="o")),
97 Subsignal("mdio", Pins("N17", dir="io")),
98 Subsignal("mdc", Pins("F16", dir="o")), # Max 8.3MHz
99 Subsignal("gtx_clk", Pins("L12", dir="o")),
100 Subsignal("tx_clk", Pins("K16", dir="i")),
101 Subsignal("tx_en", Pins("H15", dir="o")),
102 Subsignal("tx_er", Pins("G18", dir="o")),
103 Subsignal("tx_data", Pins("H16 H13 K14 K13 J13 G14 H12 K12", dir="o")),
104 Subsignal("rx_clk", Pins("K15", dir="i")),
105 Subsignal("rx_dv", Pins("F17", dir="i"), Attrs(PULLDOWN="TRUE")),
106 Subsignal("rx_er", Pins("F18", dir="i")),
107 Subsignal("rx_data", Pins("G16 H14 E16 F15 F14 E18 D16 D17", dir="i")),
108 Subsignal("col", Pins("C17", dir="i")),
109 Subsignal("crs", Pins("C18", dir="i")),
110 Attrs(IOSTANDARD="LVCMOS33")
111 ),
112 Resource("eth_rgmii", 0,
113 Subsignal("rst", PinsN("G13", dir="o")),
114 Subsignal("int", PinsN("L16", dir="o")),
115 Subsignal("mdio", Pins("N17", dir="io")),
116 Subsignal("mdc", Pins("F16", dir="o")), # Max 8.3MHz
117 Subsignal("tx_clk", Pins("L12", dir="o")),
118 Subsignal("tx_ctl", Pins("H15", dir="o")),
119 Subsignal("tx_data", Pins("H16 H13 K14 K13", dir="o")),
120 Subsignal("rx_clk", Pins("K15", dir="i")),
121 Subsignal("rx_ctl", Pins("F17", dir="i"), Attrs(PULLDOWN="TRUE")),
122 Subsignal("rx_data", Pins("G16 H14 E16 F15", dir="i")),
123 Attrs(IOSTANDARD="LVCMOS33")
124 ),
125 Resource("eth_mii", 0,
126 Subsignal("rst", PinsN("G13", dir="o")),
127 Subsignal("int", PinsN("L16", dir="o")),
128 Subsignal("mdio", Pins("N17", dir="io")),
129 Subsignal("mdc", Pins("F16", dir="o")), # Max 8.3MHz
130 Subsignal("tx_clk", Pins("K16", dir="i")),
131 Subsignal("tx_en", Pins("H15", dir="o")),
132 Subsignal("tx_er", Pins("G18", dir="o")),
133 Subsignal("tx_data", Pins("H16 H13 K14 K13", dir="o")),
134 Subsignal("rx_clk", Pins("K15", dir="i")),
135 Subsignal("rx_dv", Pins("F17", dir="i"), Attrs(PULLDOWN="TRUE")),
136 Subsignal("rx_er", Pins("F18", dir="i")),
137 Subsignal("rx_data", Pins("G16 H14 E16 F15", dir="i")),
138 Subsignal("col", Pins("C17", dir="i")),
139 Subsignal("crs", Pins("C18", dir="i")),
140 Attrs(IOSTANDARD="LVCMOS33")
141 ),
142 # Device does not support RMII
143 Resource("eth_tbi", 0,
144 Subsignal("rst", PinsN("G13", dir="o")),
145 Subsignal("int", PinsN("L16", dir="o")),
146 Subsignal("mdio", Pins("N17", dir="io")),
147 Subsignal("mdc", Pins("F16", dir="o")), # Max 8.3MHz
148 Subsignal("tx_clk", Pins("L12", dir="o")),
149 Subsignal("tx_data", Pins("H16 H13 K14 K13 J13 G14 H12 K12 H15 G18", dir="o")),
150 Subsignal("rx_clk", Pins("K15 L12", dir="i")),
151 Subsignal("rx_data", Pins("G16 H14 E16 F15 F14 E18 D16 D17 F17 F18", dir="i")),
152 Subsignal("lpbk", Pins("C17", dir="o"), Attrs(PULLDOWN="TRUE")),
153 Subsignal("comma", Pins("C18", dir="i")),
154 Attrs(IOSTANDARD="LVCMOS33")
155 ),
156 Resource("eth_rtbi", 0,
157 Subsignal("rst", PinsN("G13", dir="o")),
158 Subsignal("int", PinsN("L16", dir="o")),
159 Subsignal("mdio", Pins("N17", dir="io")),
160 Subsignal("mdc", Pins("F16", dir="o")), # Max 8.3MHz
161 Subsignal("tx_clk", Pins("L12", dir="o")),
162 Subsignal("tx_data", Pins("H16 H13 K14 K13 H15", dir="o")),
163 Subsignal("rx_clk", Pins("K15", dir="i")),
164 Subsignal("rx_data", Pins("G16 H14 E16 F15 F17", dir="i")),
165 Attrs(IOSTANDARD="LVCMOS33")
166 ),
167
168 Resource("hdmi", 0, # J1, input only due to on board buffer, HDMI A connector
169 Subsignal("scl", Pins("C13"), Attrs(IOSTANDARD="I2C")),
170 Subsignal("sda", Pins("A13"), Attrs(IOSTANDARD="I2C")),
171 Subsignal("clk", DiffPairs("D11", "C11", dir="i")),
172 Subsignal("d", DiffPairs("G9 B11 B12", "F9 A11 A12", dir="i")),
173 Attrs(IOSTANDARD="TMDS_33"),
174 ),
175 Resource("hdmi", 1, # J2, output only due to on board buffer, HDMI A connector
176 Subsignal("scl", Pins("D9"), Attrs(IOSTANDARD="I2C")),
177 Subsignal("sda", Pins("C9"), Attrs(IOSTANDARD="I2C")),
178 Subsignal("clk", DiffPairs("B6", "A6", dir="o")),
179 Subsignal("d", DiffPairs("D8 C7 B8", "C8 A7 A8", dir="o")),
180 Attrs(IOSTANDARD="TMDS_33"),
181 ),
182 Resource("hdmi", 2, # J3, input only due to on board buffer, HDMI A connector
183 Subsignal("scl", Pins("M16"), Attrs(IOSTANDARD="I2C")),
184 Subsignal("sda", Pins("M18"), Attrs(IOSTANDARD="I2C")),
185 Subsignal("clk", DiffPairs("H17", "H18", dir="i")),
186 Subsignal("d", DiffPairs("K17 L17 J16", "K18 L18 J18", dir="i")),
187 Attrs(IOSTANDARD="TMDS_33"),
188 ),
189 Resource("hdmi", 3, # JA, input/output as it is unbuffered, HDMI D connector
190 Subsignal("scl", Pins("C13"), Attrs(IOSTANDARD="I2C")),
191 Subsignal("sda", Pins("A13"), Attrs(IOSTANDARD="I2C")),
192 Subsignal("clk", DiffPairs("T9", "V9")),
193 Subsignal("d", DiffPairs("R3 T4 N5", "T3 V4 P6")),
194 Attrs(IOSTANDARD="TMDS_33"),
195 ),
196
197 Resource("ac97", 0,
198 Subsignal("clk", Pins("L13", dir="o")),
199 Subsignal("sync", Pins("U17", dir="o")),
200 Subsignal("reset", Pins("T17", dir="o")),
201 Subsignal("sdo", Pins("N18", dir="o")),
202 Subsignal("sdi", Pins("T18", dir="i")),
203 Attrs(IOSTANDARD="LVCMOS33")
204 ),
205 ]
206 connectors = [
207 Connector("pmod", 0, "T3 R3 P6 N5 - - V9 T9 V4 T4 - -"), # JB
208
209 Connector("vhdci", 0, # JC
210 "U16 - U15 U13 - M11 R11 - T12 N10 - M10 U11 - R10 - - - - U10 - R8 M8 - U8 U7 - N7 T6 - R7 N6 - U5 "
211 "V16 - V15 V13 - N11 T11 - V12 P11 - N9 V11 - T10 - - - - V10 - T8 N8 - V8 V7 - P8 V6 - T7 P7 - V5 "
212 ),
213 ]
214
215 def toolchain_program(self, products, name):
216 with products.extract("{}.bit".format(name)) as bitfile:
217 cmd = textwrap.dedent("""
218 setMode -bscan
219 setCable -port auto
220 addDevice -p 1 -file "{}"
221 program -p 1
222 exit
223 """).format(bitfile).encode('utf-8')
224 subprocess.run(["impact", "-batch"], input=cmd, check=True)
225
226
227 if __name__ == "__main__":
228 from ._blinky import Blinky
229 AtlysPlatform().build(Blinky, do_program=True)