boards/plaforms: add FMC LPC connector to nexys_video
[litex.git] / litex / boards / platforms / nexys_video.py
1 # This file is Copyright (c) 2015 Florent Kermarrec <florent@enjoy-digital.fr>
2 # License: BSD
3
4 from litex.build.generic_platform import *
5 from litex.build.xilinx import XilinxPlatform, XC3SProg, VivadoProgrammer
6
7 _io = [
8 ("user_led", 0, Pins("T14"), IOStandard("LVCMOS25")),
9 ("user_led", 1, Pins("T15"), IOStandard("LVCMOS25")),
10 ("user_led", 2, Pins("T16"), IOStandard("LVCMOS25")),
11 ("user_led", 3, Pins("U16"), IOStandard("LVCMOS25")),
12 ("user_led", 4, Pins("V15"), IOStandard("LVCMOS25")),
13 ("user_led", 5, Pins("W16"), IOStandard("LVCMOS25")),
14 ("user_led", 6, Pins("W15"), IOStandard("LVCMOS25")),
15 ("user_led", 7, Pins("Y13"), IOStandard("LVCMOS25")),
16
17 ("user_sw", 0, Pins("E22"), IOStandard("LVCMOS12")),
18 ("user_sw", 1, Pins("F21"), IOStandard("LVCMOS12")),
19 ("user_sw", 2, Pins("G21"), IOStandard("LVCMOS12")),
20 ("user_sw", 3, Pins("G22"), IOStandard("LVCMOS12")),
21 ("user_sw", 4, Pins("H17"), IOStandard("LVCMOS12")),
22 ("user_sw", 5, Pins("J16"), IOStandard("LVCMOS12")),
23 ("user_sw", 6, Pins("K13"), IOStandard("LVCMOS12")),
24 ("user_sw", 7, Pins("M17"), IOStandard("LVCMOS12")),
25
26
27 ("user_btn", 0, Pins("B22"), IOStandard("LVCMOS12")),
28 ("user_btn", 1, Pins("D22"), IOStandard("LVCMOS12")),
29 ("user_btn", 2, Pins("C22"), IOStandard("LVCMOS12")),
30 ("user_btn", 3, Pins("D14"), IOStandard("LVCMOS12")),
31 ("user_btn", 4, Pins("F15"), IOStandard("LVCMOS12")),
32 ("user_btn", 5, Pins("G4"), IOStandard("LVCMOS12")),
33
34 ("oled", 0,
35 Subsignal("dc", Pins("W22")),
36 Subsignal("res", Pins("U21")),
37 Subsignal("sclk", Pins("W21")),
38 Subsignal("sdin", Pins("Y22")),
39 Subsignal("vbat", Pins("P20")),
40 Subsignal("vdd", Pins("V22")),
41 IOStandard("LVCMOS33")
42 ),
43
44 ("clk100", 0, Pins("R4"), IOStandard("LVCMOS33")),
45
46 ("cpu_reset", 0, Pins("G4"), IOStandard("LVCMOS15")),
47
48 ("serial", 0,
49 Subsignal("tx", Pins("AA19")),
50 Subsignal("rx", Pins("V18")),
51 IOStandard("LVCMOS33"),
52 ),
53
54 ("ddram", 0,
55 Subsignal("a", Pins(
56 "M2 M5 M3 M1 L6 P1 N3 N2",
57 "M6 R1 L5 N5 N4 P2 P6"),
58 IOStandard("SSTL15")),
59 Subsignal("ba", Pins("L3 K6 L4"), IOStandard("SSTL15")),
60 Subsignal("ras_n", Pins("J4"), IOStandard("SSTL15")),
61 Subsignal("cas_n", Pins("K3"), IOStandard("SSTL15")),
62 Subsignal("we_n", Pins("L1"), IOStandard("SSTL15")),
63 Subsignal("dm", Pins("G3 F1"), IOStandard("SSTL15")),
64 Subsignal("dq", Pins(
65 "G2 H4 H5 J1 K1 H3 H2 J5",
66 "E3 B2 F3 D2 C2 A1 E2 B1"),
67 IOStandard("SSTL15"),
68 Misc("IN_TERM=UNTUNED_SPLIT_50")),
69 Subsignal("dqs_p", Pins("K2 E1"), IOStandard("DIFF_SSTL15")),
70 Subsignal("dqs_n", Pins("J2 D1"), IOStandard("DIFF_SSTL15")),
71 Subsignal("clk_p", Pins("P5"), IOStandard("DIFF_SSTL15")),
72 Subsignal("clk_n", Pins("P4"), IOStandard("DIFF_SSTL15")),
73 Subsignal("cke", Pins("J6"), IOStandard("SSTL15")),
74 Subsignal("odt", Pins("K4"), IOStandard("SSTL15")),
75 Subsignal("reset_n", Pins("G1"), IOStandard("SSTL15")),
76 Misc("SLEW=FAST"),
77 ),
78
79 ("eth_clocks", 0,
80 Subsignal("tx", Pins("AA14")),
81 Subsignal("rx", Pins("V13")),
82 IOStandard("LVCMOS25")
83 ),
84 ("eth", 0,
85 Subsignal("rst_n", Pins("U7"), IOStandard("LVCMOS33")),
86 Subsignal("int_n", Pins("Y14")),
87 Subsignal("mdio", Pins("Y16")),
88 Subsignal("mdc", Pins("AA16")),
89 Subsignal("rx_ctl", Pins("W10")),
90 Subsignal("rx_data", Pins("AB16 AA15 AB15 AB11")),
91 Subsignal("tx_ctl", Pins("V10")),
92 Subsignal("tx_data", Pins("Y12 W12 W11 Y11")),
93 IOStandard("LVCMOS25")
94 ),
95
96 ("hdmi_in", 0,
97 Subsignal("clk_p", Pins("V4"), IOStandard("TMDS_33")),
98 Subsignal("clk_n", Pins("W4"), IOStandard("TMDS_33")),
99 Subsignal("data0_p", Pins("Y3"), IOStandard("TMDS_33")),
100 Subsignal("data0_n", Pins("AA3"), IOStandard("TMDS_33")),
101 Subsignal("data1_p", Pins("W2"), IOStandard("TMDS_33")),
102 Subsignal("data1_n", Pins("Y2"), IOStandard("TMDS_33")),
103 Subsignal("data2_p", Pins("U2"), IOStandard("TMDS_33")),
104 Subsignal("data2_n", Pins("V2"), IOStandard("TMDS_33")),
105 Subsignal("scl", Pins("Y4"), IOStandard("LVCMOS33")),
106 Subsignal("sda", Pins("AB5"), IOStandard("LVCMOS33")),
107 Subsignal("cec", Pins("AA5"), IOStandard("LVCMOS33")), # FIXME
108 Subsignal("txen", Pins("R3"), IOStandard("LVCMOS33")), # FIXME
109 Subsignal("hpa", Pins("AB12"), IOStandard("LVCMOS25")), # FIXME
110 ),
111
112 ("hdmi_out", 0,
113 Subsignal("clk_p", Pins("T1"), IOStandard("TMDS_33")),
114 Subsignal("clk_n", Pins("U1"), IOStandard("TMDS_33")),
115 Subsignal("data0_p", Pins("W1"), IOStandard("TMDS_33")),
116 Subsignal("data0_n", Pins("Y1"), IOStandard("TMDS_33")),
117 Subsignal("data1_p", Pins("AA1"), IOStandard("TMDS_33")),
118 Subsignal("data1_n", Pins("AB1"), IOStandard("TMDS_33")),
119 Subsignal("data2_p", Pins("AB3"), IOStandard("TMDS_33")),
120 Subsignal("data2_n", Pins("AB2"), IOStandard("TMDS_33")),
121 Subsignal("scl", Pins("U3"), IOStandard("LVCMOS33")),
122 Subsignal("sda", Pins("V3"), IOStandard("LVCMOS33")),
123 Subsignal("cec", Pins("AA4"), IOStandard("LVCMOS33")), # FIXME
124 Subsignal("hdp", Pins("AB13"), IOStandard("LVCMOS25")), # FIXME
125 ),
126 ]
127
128 _connectors = [
129 ("LPC", {
130 "GBTCLK0_M2C_P": "F10",
131 "GBTCLK0_M2C_N": "E10",
132 "LA01_CC_P": "J20",
133 "LA01_CC_N": "J21",
134 "LA05_P": "M21",
135 "LA05_N": "L21",
136 "LA09_P": "H20",
137 "LA09_N": "G20",
138 "LA13_P": "K17",
139 "LA13_N": "J17",
140 "LA17_CC_P": "B17",
141 "LA17_CC_N": "B18",
142 "LA23_P": "B21",
143 "LA23_N": "A21",
144 "LA26_P": "F18",
145 "LA26_N": "E18",
146 "CLK0_M2C_P": "J19",
147 "CLK0_M2C_N": "A19",
148 "LA02_P": "M18",
149 "LA02_N": "L18",
150 "LA04_P": "N20",
151 "LA04_N": "M20",
152 "LA07_P": "M13",
153 "LA07_N": "L13",
154 "LA11_P": "L14",
155 "LA11_N": "L15",
156 "LA15_P": "L16",
157 "LA15_N": "K16",
158 "LA19_P": "A18",
159 "LA19_N": "A19",
160 "LA21_P": "E19",
161 "LA21_N": "D19",
162 "LA24_P": "B15",
163 "LA24_N": "B16",
164 "LA28_P": "C13",
165 "LA28_N": "B13",
166 "LA30_P": "A13",
167 "LA30_N": "A14",
168 "LA32_P": "A15",
169 "LA32_N": "A16",
170 "LA06_P": "N22",
171 "LA06_N": "M22",
172 "LA10_P": "K21",
173 "LA10_N": "K22",
174 "LA14_P": "J22",
175 "LA14_N": "H22",
176 "LA18_CC_P": "D17",
177 "LA18_CC_N": "C17",
178 "LA27_P": "B20",
179 "LA27_N": "A20",
180 "CLK1_M2C_P": "C18",
181 "CLK1_M2C_N": "C19",
182 "LA00_CC_P": "K18",
183 "LA00_CC_N": "K19",
184 "LA03_P": "N18",
185 "LA03_N": "N19",
186 "LA08_P": "M15",
187 "LA08_N": "M16",
188 "LA12_P": "L19",
189 "LA12_N": "L20",
190 "LA16_P": "G17",
191 "LA16_N": "G18",
192 "LA20_P": "F19",
193 "LA20_N": "F20",
194 "LA22_P": "E21",
195 "LA22_N": "D21",
196 "LA25_P": "F16",
197 "LA25_N": "E17",
198 "LA29_P": "C14",
199 "LA29_N": "C15",
200 "LA31_P": "E13",
201 "LA31_N": "E14",
202 "LA33_P": "F13",
203 "LA33_N": "F14",
204 }
205 )
206 ]
207
208 class Platform(XilinxPlatform):
209 default_clk_name = "clk100"
210 default_clk_period = 10.0
211
212 def __init__(self, toolchain="vivado", programmer="vivado"):
213 XilinxPlatform.__init__(self, "xc7a200t-sbg484-1", _io, _connectors,
214 toolchain=toolchain)
215 self.toolchain.bitstream_commands = \
216 ["set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]"]
217 self.toolchain.additional_commands = \
218 ["write_cfgmem -force -format bin -interface spix4 -size 16 "
219 "-loadbit \"up 0x0 {build_name}.bit\" -file {build_name}.bin"]
220 self.programmer = programmer
221 self.add_platform_command("set_property INTERNAL_VREF 0.750 [get_iobanks 35]")
222
223
224 def create_programmer(self):
225 if self.programmer == "xc3sprog":
226 return XC3SProg("nexys4")
227 elif self.programmer == "vivado":
228 return VivadoProgrammer(flash_part="n25q128-3.3v-spi-x1_x2_x4")
229 else:
230 raise ValueError("{} programmer is not supported"
231 .format(self.programmer))
232
233 def do_finalize(self, fragment):
234 XilinxPlatform.do_finalize(self, fragment)
235 try:
236 self.add_period_constraint(self.lookup_request("eth_clocks").rx, 8.0)
237 except ConstraintError:
238 pass