|
| 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