Skip to content

Commit 3ac60b5

Browse files
author
Marco Tassemeier
committed
Initial support for Xilinx KCU116
1 parent d666634 commit 3ac60b5

File tree

2 files changed

+546
-0
lines changed

2 files changed

+546
-0
lines changed
Lines changed: 354 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
#
2+
# This file is part of LiteX-Boards.
3+
#
4+
# Copyright (c) 2025 Marco Tassemeier <[email protected]>
5+
# SPDX-License-Identifier: BSD-2-Clause
6+
7+
from litex.build.generic_platform import *
8+
from litex.build.xilinx import XilinxUSPlatform, VivadoProgrammer
9+
10+
# IOs ----------------------------------------------------------------------------------------------
11+
_io = [
12+
# Clk / Rst
13+
("clk300", 0,
14+
Subsignal("p", Pins("K22"), IOStandard("DIFF_SSTL12")),
15+
Subsignal("n", Pins("K23"), IOStandard("DIFF_SSTL12"))
16+
),
17+
18+
("clk125", 0,
19+
Subsignal("p", Pins("G12"), IOStandard("LVDS_25")),
20+
Subsignal("n", Pins("F12"), IOStandard("LVDS_25"))
21+
),
22+
23+
("FPGA_EMCCLK", 0, Pins("N21"), IOStandard("LVCMOS18")),
24+
25+
("USER_MGT_CLK", 0,
26+
Subsignal("p", Pins("M7")),
27+
Subsignal("n", Pins("M6"))
28+
),
29+
30+
("CLK_74_25", 0,
31+
Subsignal("p", Pins("D11"), IOStandard("LVDS_25")),
32+
Subsignal("n", Pins("D10"), IOStandard("LVDS_25"))
33+
),
34+
35+
("cpu_reset", 0, Pins("B9"), IOStandard("LVCMOS33")),
36+
37+
# Leds
38+
("user_led", 0, Pins("C9"), IOStandard("LVCMOS33")),
39+
("user_led", 1, Pins("D9"), IOStandard("LVCMOS33")),
40+
("user_led", 2, Pins("E10"), IOStandard("LVCMOS33")),
41+
("user_led", 3, Pins("E11"), IOStandard("LVCMOS33")),
42+
("user_led", 4, Pins("F9"), IOStandard("LVCMOS33")),
43+
("user_led", 5, Pins("F10"), IOStandard("LVCMOS33")),
44+
("user_led", 6, Pins("G9"), IOStandard("LVCMOS33")),
45+
("user_led", 7, Pins("G10"), IOStandard("LVCMOS33")),
46+
47+
# Buttons
48+
("user_btn_c", 0, Pins("A9"), IOStandard("LVCMOS33")),
49+
("user_btn_n", 0, Pins("A10"), IOStandard("LVCMOS33")),
50+
("user_btn_s", 0, Pins("C11"), IOStandard("LVCMOS33")),
51+
("user_btn_w", 0, Pins("B10"), IOStandard("LVCMOS33")),
52+
("user_btn_e", 0, Pins("B11"), IOStandard("LVCMOS33")),
53+
54+
# DIP-Switches
55+
("user_dip_sw", 0, Pins("G11"), IOStandard("LVCMOS33")),
56+
("user_dip_sw", 1, Pins("H11"), IOStandard("LVCMOS33")),
57+
("user_dip_sw", 2, Pins("H9"), IOStandard("LVCMOS33")),
58+
("user_dip_sw", 3, Pins("J9"), IOStandard("LVCMOS33")),
59+
60+
# SMA
61+
("user_sma_clock", 0,
62+
Subsignal("p", Pins("J23"), IOStandard("DIFF_SSTL12")),
63+
Subsignal("n", Pins("J24"), IOStandard("DIFF_SSTL12"))
64+
),
65+
66+
("user_sma_gpio", 0,
67+
Subsignal("p", Pins("K25"), IOStandard("DIFF_SSTL12_DCI")),
68+
Subsignal("n", Pins("K26"), IOStandard("DIFF_SSTL12_DCI"))
69+
),
70+
71+
# I2C
72+
("i2c", 0,
73+
Subsignal("scl", Pins("AE13")),
74+
Subsignal("sda", Pins("AF13")),
75+
IOStandard("LVCMOS33")
76+
),
77+
78+
("i2c_hdmi", 0,
79+
Subsignal("scl", Pins("AD15")),
80+
Subsignal("sda", Pins("AE15")),
81+
IOStandard("LVCMOS33")
82+
),
83+
84+
# Serial
85+
("serial", 0,
86+
Subsignal("cts", Pins("Y13")),
87+
Subsignal("rts", Pins("AA13")),
88+
Subsignal("tx", Pins("W13")),
89+
Subsignal("rx", Pins("W12")),
90+
IOStandard("LVCMOS33")
91+
),
92+
93+
# SPIFlash
94+
("spiflash", 0, # clock needs to be accessed through primitive
95+
Subsignal("cs_n"), Pins("AA12"),
96+
Subsignal("dq"), Pins("AD11 AC12 AC11 AE11"),
97+
IOStandard("LVCMOS18")
98+
),
99+
100+
("spiflash", 1, # clock needs to be accessed through primitive
101+
Subsignal("cs_n"), Pins("U22"),
102+
Subsignal("dq"), Pins("N23 P23 R20 R21"),
103+
IOStandard("LVCMOS18")
104+
),
105+
106+
# HDMI
107+
("hdmi", 0,
108+
Subsignal("d", Pins(
109+
"V21 V22 T22 T23 W19 W20 Y22 Y23",
110+
"Y25 Y26 AA24 AA25 W25 W26 V23 W23",
111+
"V24 W24")),
112+
Subsignal("de", Pins("U20")),
113+
Subsignal("clk", Pins("P20")),
114+
Subsignal("vsync", Pins("U21")),
115+
Subsignal("hsync", Pins("V19")),
116+
Subsignal("spdif", Pins("T20")),
117+
Subsignal("spdif_out", Pins("U19")),
118+
IOStandard("LVCMOS18")
119+
),
120+
121+
# DDR4 SDRAM
122+
("ddram", 0,
123+
Subsignal("a", Pins(
124+
"D25 D23 D26 D24 E26 C26 G22 B25",
125+
"F22 C24 E25 F23 E23 B26"),
126+
IOStandard("SSTL12")),
127+
Subsignal("ba", Pins("H22 H21"), IOStandard("SSTL12")),
128+
Subsignal("bg", Pins("G26"), IOStandard("SSTL12")),
129+
Subsignal("ras_n", Pins("F24"), IOStandard("SSTL12")), # A16
130+
Subsignal("cas_n", Pins("F25"), IOStandard("SSTL12")), # A15
131+
Subsignal("we_n", Pins("H26"), IOStandard("SSTL12")), # A14
132+
Subsignal("cs_n", Pins("H23"), IOStandard("SSTL12")),
133+
Subsignal("act_n", Pins("J26"), IOStandard("SSTL12")),
134+
#Subsignal("ten", Pins(""), IOStandard("SSTL12")),
135+
Subsignal("alert_n", Pins("L24"), IOStandard("SSTL12")),
136+
Subsignal("par", Pins("J25"), IOStandard("SSTL12")),
137+
Subsignal("dm", Pins("A22 C18 H18 G15"), IOStandard("POD12_DCI")),
138+
Subsignal("dq", Pins(
139+
"C22 B24 C23 A24 D21 B22 E21 A25",
140+
"A19 C17 A20 B17 B20 A15 B19 B15",
141+
"F18 G21 F19 D20 E18 D19 G20 D18",
142+
"H17 D16 G16 D15 E15 C16 H16 G17"),
143+
IOStandard("POD12_DCI")),
144+
Subsignal("dqs_p", Pins("C21 A17 F20 E16"),
145+
IOStandard("DIFF_POD12_DCI")),
146+
Subsignal("dqs_n", Pins("B21 A18 E20 E17"),
147+
IOStandard("DIFF_POD12_DCI")),
148+
Subsignal("clk_p", Pins("G24"), IOStandard("DIFF_POD12")),
149+
Subsignal("clk_n", Pins("G25"), IOStandard("DIFF_POD12")),
150+
Subsignal("cke", Pins("M24"), IOStandard("SSTL12")),
151+
Subsignal("odt", Pins("H24"), IOStandard("SSTL12")),
152+
Subsignal("reset_n", Pins("L25"), IOStandard("LVCMOS12")),
153+
),
154+
155+
# PCIe
156+
("pcie_x1", 0,
157+
Subsignal("rst_n", Pins("T19"), IOStandard("LVCMOS18")),
158+
Subsignal("wake_n", Pins("P19"), IOStandard("LVCMOS18")),
159+
Subsignal("clk_p", Pins("V7")),
160+
Subsignal("clk_n", Pins("V6")),
161+
Subsignal("rx_p", Pins("P2")),
162+
Subsignal("rx_n", Pins("P1")),
163+
Subsignal("tx_p", Pins("R5")),
164+
Subsignal("tx_n", Pins("R4"))
165+
),
166+
167+
("pcie_x4", 0,
168+
Subsignal("rst_n", Pins("T19"), IOStandard("LVCMOS18")),
169+
Subsignal("wake_n", Pins("P19"), IOStandard("LVCMOS18")),
170+
Subsignal("clk_p", Pins("V7")),
171+
Subsignal("clk_n", Pins("V6")),
172+
Subsignal("rx_p", Pins("P2 T2 V2 Y2")),
173+
Subsignal("rx_n", Pins("P1 T1 V1 Y1")),
174+
Subsignal("tx_p", Pins("R5 U5 W5 AA5")),
175+
Subsignal("tx_n", Pins("R4 U4 W4 AA4"))
176+
),
177+
178+
("pcie_x8", 0,
179+
Subsignal("rst_n", Pins("T19"), IOStandard("LVCMOS18")),
180+
Subsignal("wake_n", Pins("P19"), IOStandard("LVCMOS18")),
181+
Subsignal("clk_p", Pins("V7")),
182+
Subsignal("clk_n", Pins("V6")),
183+
Subsignal("rx_p", Pins("P2 T2 V2 Y2 AB2 AD2 AE4 AF2")),
184+
Subsignal("rx_n", Pins("P1 T1 V1 Y1 AB1 AD1 AE3 AF1")),
185+
Subsignal("tx_p", Pins("R5 U5 W5 AA5 AC5 AD7 AE9 AF7")),
186+
Subsignal("tx_n", Pins("R4 U4 W4 AA4 AC4 AD6 AE8 AF6"))
187+
),
188+
189+
# SFP
190+
("sfp", 0,
191+
Subsignal("txp", Pins("N5")),
192+
Subsignal("txn", Pins("N4")),
193+
Subsignal("rxp", Pins("M2")),
194+
Subsignal("rxn", Pins("M1"))
195+
),
196+
("sfp_tx", 0,
197+
Subsignal("p", Pins("N5")),
198+
Subsignal("n", Pins("N4")),
199+
),
200+
("sfp_rx", 0,
201+
Subsignal("p", Pins("M2")),
202+
Subsignal("n", Pins("M1")),
203+
),
204+
("sfp_tx_disable_n", 0, Pins("AB14"), IOStandard("LVCMOS33")),
205+
206+
("sfp", 1,
207+
Subsignal("txp", Pins("L5")),
208+
Subsignal("txn", Pins("L4")),
209+
Subsignal("rxp", Pins("K2")),
210+
Subsignal("rxn", Pins("K1"))
211+
),
212+
("sfp_tx", 1,
213+
Subsignal("p", Pins("L5")),
214+
Subsignal("n", Pins("L4")),
215+
),
216+
("sfp_rx", 1,
217+
Subsignal("p", Pins("K2")),
218+
Subsignal("n", Pins("K1")),
219+
),
220+
("sfp_tx_disable_n", 1, Pins("AA14"), IOStandard("LVCMOS33")),
221+
222+
("sfp", 2,
223+
Subsignal("txp", Pins("J5")),
224+
Subsignal("txn", Pins("J4")),
225+
Subsignal("rxp", Pins("H2")),
226+
Subsignal("rxn", Pins("H1"))
227+
),
228+
("sfp_tx", 2,
229+
Subsignal("p", Pins("J5")),
230+
Subsignal("n", Pins("J4")),
231+
),
232+
("sfp_rx", 2,
233+
Subsignal("p", Pins("H2")),
234+
Subsignal("n", Pins("H1")),
235+
),
236+
("sfp_tx_disable_n", 2, Pins("AA15"), IOStandard("LVCMOS33")),
237+
238+
("sfp", 3,
239+
Subsignal("txp", Pins("G5")),
240+
Subsignal("txn", Pins("G4")),
241+
Subsignal("rxp", Pins("F2")),
242+
Subsignal("rxn", Pins("F1"))
243+
),
244+
("sfp_tx", 3,
245+
Subsignal("p", Pins("G5")),
246+
Subsignal("n", Pins("G4")),
247+
),
248+
("sfp_rx", 3,
249+
Subsignal("p", Pins("F2")),
250+
Subsignal("n", Pins("F1")),
251+
),
252+
("sfp_tx_disable_n", 3, Pins("Y15"), IOStandard("LVCMOS33")),
253+
254+
]
255+
256+
# Connectors ---------------------------------------------------------------------------------------
257+
_connectors = [
258+
("HPC", {
259+
"DP0_C2M_P" : "F7",
260+
"DP0_C2M_N" : "F6",
261+
"DP0_M2C_P" : "D2",
262+
"DP0_M2C_N" : "D1",
263+
"DP1_C2M_P" : "E5",
264+
"DP1_C2M_N" : "E4",
265+
"DP1_M2C_P" : "C4",
266+
"DP1_M2C_N" : "C3",
267+
"DP2_C2M_P" : "D7",
268+
"DP2_C2M_N" : "D6",
269+
"DP2_M2C_P" : "B2",
270+
"DP2_M2C_N" : "B1",
271+
"DP3_C2M_P" : "B7",
272+
"DP3_C2M_N" : "B6",
273+
"DP3_M2C_P" : "A4",
274+
"DP3_M2C_N" : "A3",
275+
"LA00_P_CC" : "AD20", # LVDS
276+
"LA00_N_CC" : "AE20", # LVDS
277+
"LA01_P_CC" : "AC19", # LVDS
278+
"LA01_N_CC" : "AD19", # LVDS
279+
"LA02_P" : "Y17", # LVDS
280+
"LA02_N" : "AA17", # LVDS
281+
"LA03_P" : "AB17", # LVDS
282+
"LA03_N" : "AC17", # LVDS
283+
"LA04_P" : "AA20", # LVDS
284+
"LA04_N" : "AB20", # LVDS
285+
"LA05_P" : "AA19", # LVDS
286+
"LA05_N" : "AB19", # LVDS
287+
"LA06_P" : "Y20", # LVDS
288+
"LA06_N" : "Y21", # LVDS
289+
"LA07_P" : "AD16", # LVDS
290+
"LA07_N" : "AE16", # LVDS
291+
"LA08_P" : "AE17", # LVDS
292+
"LA08_N" : "AF17", # LVDS
293+
"LA09_P" : "AC18", # LVDS
294+
"LA09_N" : "AD18", # LVDS
295+
"LA10_P" : "AF18", # LVDS
296+
"LA10_N" : "AF19", # LVDS
297+
"LA11_P" : "Y18", # LVDS
298+
"LA11_N" : "AA18", # LVDS
299+
"LA12_P" : "AC22", # LVDS
300+
"LA12_N" : "AC23", # LVDS
301+
"LA13_P" : "AD23", # LVDS
302+
"LA13_N" : "AE23", # LVDS
303+
"LA14_P" : "AE22", # LVDS
304+
"LA14_N" : "AF22", # LVDS
305+
"LA15_P" : "AB24", # LVDS
306+
"LA15_N" : "AC24", # LVDS
307+
"LA16_P" : "AD24", # LVDS
308+
"LA16_N" : "AD25", # LVDS
309+
"LA17_P_CC" : "AD21", # LVDS
310+
"LA17_N_CC" : "AE21", # LVDS
311+
"LA18_P_CC" : "AA22", # LVDS
312+
"LA18_N_CC" : "AB22", # LVDS
313+
"LA19_P" : "AC26", # LVDS
314+
"LA19_N" : "AD26", # LVDS
315+
"LA20_P" : "AF24", # LVDS
316+
"LA20_N" : "AF25", # LVDS
317+
"LA21_P" : "AB25", # LVDS
318+
"LA21_N" : "AB26", # LVDS
319+
"LA22_P" : "AE25", # LVDS
320+
"LA22_N" : "AE26", # LVDS
321+
"GBTCLK0_M2C_P" : "K7",
322+
"GBTCLK0_M2C_N" : "K6",
323+
"GBTCLK1_M2C_P" : "H7",
324+
"GBTCLK1_M2C_N" : "H6",
325+
"CLK0_M2C_P" : "AB21", # LVDS
326+
"CLK0_M2C_N" : "AC21", # LVDS
327+
"PG_M2C" : "H13" # LVCMOS33
328+
}),
329+
330+
("pmod0", "A14 B15 A12 A13 B12 C12 C13 C14"), # LVCMOS33
331+
("pmod1", "D13 D14 E12 E13 F13 F14 J14 J15") # LVCMOS33
332+
]
333+
334+
# Platform -----------------------------------------------------------------------------------------
335+
336+
class Platform(XilinxUSPlatform):
337+
default_clk_name = "clk125"
338+
default_clk_period = 1e9/125e6
339+
340+
def __init__(self, toolchain="vivado"):
341+
XilinxUSPlatform.__init__(self, "xcku5p-ffvb676-2-e", _io, _connectors, toolchain=toolchain)
342+
343+
def create_programmer(self):
344+
return VivadoProgrammer()
345+
346+
def do_finalize(self, fragment):
347+
XilinxUSPlatform.do_finalize(self, fragment)
348+
self.add_period_constraint(self.lookup_request("clk300", loose=True), 1e9/300e6)
349+
self.add_period_constraint(self.lookup_request("clk125", loose=True), 1e9/125e6)
350+
self.add_period_constraint(self.lookup_request("FPGA_EMCCLK", loose=True), 1e9/90e6)
351+
self.add_period_constraint(self.lookup_request("CLK_74_25", loose=True), 1e9/74.25e6)
352+
# DDR4 memory Internal Vref
353+
self.add_platform_command("set_property INTERNAL_VREF 0.84 [get_iobanks 66]")
354+
self.add_platform_command("set_property INTERNAL_VREF 0.84 [get_iobanks 67]")

0 commit comments

Comments
 (0)