|
| 1 | +import os |
| 2 | +import subprocess |
| 3 | + |
| 4 | +from amaranth.build import * |
| 5 | +from amaranth.vendor import XilinxPlatform |
| 6 | +from .resources import * |
| 7 | + |
| 8 | + |
| 9 | +__all__ = ["AX7325BPlatform"] |
| 10 | + |
| 11 | + |
| 12 | +class AX7325BPlatform(XilinxPlatform): |
| 13 | + """ |
| 14 | + https://www.en.alinx.com/Product/FPGA-Development-Boards/Kintex-7/AX7325B.html |
| 15 | +
|
| 16 | + Power Supply Function |
| 17 | +
|
| 18 | + POWER |
| 19 | + +1.0V FPGA core voltage |
| 20 | + +3.3V FPGA Bank0, Bank14, Bank15, QSIP FLASH, Clock Crystal, SD Card, SFP Optical Module |
| 21 | + +1.8V Gigabit Ethernet, HDMI, USB |
| 22 | + +1.5V DDR3, SODIMM, FPGA Bank33, Bank34, Bank35, VADJ(+2.5V) FPGA Bank12, Bank13, FMC |
| 23 | + VREF, VTT (+0.75V) DDR3, SODIMM |
| 24 | + MGTAVCC(+1.0V) FPGA Bank115, Bank116, Bank117, Bank118 |
| 25 | + MGTAVTT(+1.2V) FPGA Bank115, Bank116, Bank117, Bank118 |
| 26 | + MGT_1.8V (+1.2V) FPGA GTX auxiliary voltage |
| 27 | + """ |
| 28 | + device = "xc7k325t" |
| 29 | + package = "ffg900" |
| 30 | + speed = "2" |
| 31 | + default_clk = "clk" |
| 32 | + resources = [ |
| 33 | + Resource("clk", 0, DiffPairs("AE10", "AF10", dir="i"), Clock(200e6), Attrs(IOSTANDARD="LVDS")), |
| 34 | + Resource("clk0", 0, DiffPairs("F20", "E20", dir="i"), Clock(200e6), Attrs(IOSTANDARD="LVDS")), |
| 35 | + Resource("clk_sfp", 0, DiffPairs("G8", "G7", dir="i"), Clock(156.25e6), Attrs(IOSTANDARD="LVDS")), |
| 36 | + Resource("clk_qsfp", 0, DiffPairs("C8", "C7", dir="i"), Clock(125e6), Attrs(IOSTANDARD="LVDS")), |
| 37 | + *LEDResources(pins="A22 C19 B19 E18", attrs=Attrs(IOSTANDARD="LVCMOS15")), |
| 38 | + DDR3Resource(0, |
| 39 | + rst_n="Y11", |
| 40 | + clk_p="AG10", |
| 41 | + clk_n="AH10", |
| 42 | + clk_en="AD12", |
| 43 | + cs_n="AF11", |
| 44 | + we_n="AD9", |
| 45 | + ras_n="AE9", |
| 46 | + cas_n="AE11", |
| 47 | + a="AA12 AB12 AA8 AB8 AB9 AC9 AB13 Y10 AA11 AA10 AA13 AD8 AB10 AC10 AJ9", |
| 48 | + ba="AE8 AC12 AC11", |
| 49 | + dqs_p="Y19 AJ18 AH16 AC16 AH7 AG4 AG2 AD2", |
| 50 | + dqs_n="Y18 AK18 AJ16 AC15 AJ7 AG3 AH1 AD1", |
| 51 | + dq="""AD18 AB18 AD17 AB19 AD16 AC19 AE18 AB17 |
| 52 | + AG19 AK19 AD19 AJ19 AF18 AH19 AE19 AG18 |
| 53 | + AK15 AJ17 AH15 AF15 AG14 AH17 AG15 AK16 |
| 54 | + AE15 Y16 AC14 AA15 AA17 AD14 AA16 AB15 |
| 55 | + AK6 AJ8 AJ6 AF8 AK4 AK8 AK5 AG7 |
| 56 | + AE4 AF1 AE5 AE1 AF6 AE3 AF5 AF2 |
| 57 | + AH4 AJ2 AH5 AJ4 AH2 AK1 AH6 AJ1 |
| 58 | + AC2 AC5 AD3 AC7 AE6 AD6 AC1 AC4""", |
| 59 | + dm="AA18 AF17 AE16 Y15 AF7 AF3 AJ3 AD4", |
| 60 | + odt="AD11", |
| 61 | + diff_attrs=Attrs(IOSTANDARD="LVDS"), |
| 62 | + attrs=Attrs(IOSTANDARD="LVCMOS15")), |
| 63 | + DDR3Resource(1, |
| 64 | + # "sodimm", |
| 65 | + rst_n="F17", |
| 66 | + #clk_p="D17 E19", |
| 67 | + clk_p="D17", |
| 68 | + #clk_n="D18 D19", |
| 69 | + clk_n="D18", |
| 70 | + #clk_en="L17 G17", |
| 71 | + clk_en="L17", |
| 72 | + #cs_n="F22 C21", |
| 73 | + cs_n="F22", |
| 74 | + we_n="H21", |
| 75 | + ras_n="G20", |
| 76 | + cas_n="K20", |
| 77 | + a="F21 D21 E21 F18 H17 B17 J19 C17 J18 C16 K19 G18 K18 G22 D16 L18", |
| 78 | + ba="H19 H20 J17", |
| 79 | + dqs_p="L12 J16 C12 D14 F25 B28 C29 G27", |
| 80 | + dqs_n="L13 H16 B12 C14 E25 A28 B29 F27", |
| 81 | + dq="""L15 K14 J14 L11 K15 L16 J13 K16 |
| 82 | + J12 J11 H15 G14 H11 H12 G13 G15 |
| 83 | + D12 A11 D13 E13 F11 E11 A12 F12 |
| 84 | + B13 A13 B15 C15 B14 A15 E15 F15 |
| 85 | + A23 D24 E24 E26 E23 B23 D23 G23 |
| 86 | + B24 C24 C26 A27 A25 A26 B27 D26 |
| 87 | + D27 A30 C30 D29 C27 B30 E29 E28 |
| 88 | + F28 F30 H30 G28 H24 G29 H27 H26""", |
| 89 | + dm="K13 H14 D11 E14 F26 C25 D28 G30", |
| 90 | + #odt="D22 H22", |
| 91 | + odt="D22", |
| 92 | + diff_attrs=Attrs(IOSTANDARD="LVDS"), |
| 93 | + attrs=Attrs(IOSTANDARD="LVCMOS15")), |
| 94 | + # QSPI Flash |
| 95 | + *SPIFlashResources(0, |
| 96 | + cs_n="U19", clk="B10", copi="P24", cipo="R25", wp_n="R20", hold_n="R21", |
| 97 | + attrs=Attrs(IOSTANDARD="LVCMOS33") |
| 98 | + ), |
| 99 | + UARTResource(0, |
| 100 | + rx="AJ26", tx="AK26", |
| 101 | + attrs=Attrs(IOSTANDARD="LVCMOS33") |
| 102 | + ), |
| 103 | + # 4x SFP (BANK117, ref clock 156.25MHz) |
| 104 | + Resource("sfp", 0, |
| 105 | + Subsignal("tx", DiffPairs(p="K2", n="K1", dir="o")), |
| 106 | + Subsignal("rx", DiffPairs(p="K6", n="K5", dir="i")), |
| 107 | + Subsignal("tx_dis", Pins("T28", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 108 | + Subsignal("loss", Pins("R28", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 109 | + ), |
| 110 | + Resource("sfp", 1, |
| 111 | + Subsignal("tx", DiffPairs(p="J4", n="J3", dir="o")), |
| 112 | + Subsignal("rx", DiffPairs(p="H6", n="H5", dir="i")), |
| 113 | + Subsignal("tx_dis", Pins("T28", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 114 | + Subsignal("loss", Pins("T26", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 115 | + ), |
| 116 | + Resource("sfp", 2, |
| 117 | + Subsignal("tx", DiffPairs(p="H2", n="H1", dir="o")), |
| 118 | + Subsignal("rx", DiffPairs(p="G4", n="G3", dir="i")), |
| 119 | + Subsignal("tx_dis", Pins("U28", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 120 | + Subsignal("loss", Pins("U27", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 121 | + ), |
| 122 | + Resource("sfp", 3, |
| 123 | + Subsignal("tx", DiffPairs(p="F2", n="F1", dir="o")), |
| 124 | + Subsignal("rx", DiffPairs(p="F6", n="F5", dir="i")), |
| 125 | + Subsignal("tx_dis", Pins("U25", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 126 | + Subsignal("loss", Pins("A18", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 127 | + ), |
| 128 | + # QSFP+ (BANK118, ref clock 125MHz) |
| 129 | + Resource("qsfp", 0, |
| 130 | + Subsignal("tx", DiffPairs(p="D2 B2 C4 A4", n="D1 B1 C3 A3", dir="o")), |
| 131 | + Subsignal("rx", DiffPairs(p="E4 B6 D6 A8", n="E3 B5 D5 A7", dir="i")), |
| 132 | + Subsignal("modsel", PinsN("R30", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 133 | + Subsignal("rst", PinsN("U30", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 134 | + Subsignal("modprs", PinsN("U22", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 135 | + Subsignal("int", PinsN("R24", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 136 | + Subsignal("lpmode", Pins("V26", dir="o"), Attrs(IOSTANDARD="LVCMOS33")), |
| 137 | + Subsignal("scl", Pins("A20", dir="io"), Attrs(IOSTANDARD="LVCMOS33")), |
| 138 | + Subsignal("sda", Pins("A21", dir="io"), Attrs(IOSTANDARD="LVCMOS33")), |
| 139 | + ), |
| 140 | + # PCIe x8 (BANK115, BANK116) |
| 141 | + Resource("pcie", 0, |
| 142 | + Subsignal("rst", PinsN("B18", dir="i"), Attrs(IOSTANDARD="LVCMOS33")), |
| 143 | + Subsignal("rx", DiffPairs(p="M6 P6 R4 T6 V6 W4 Y6 AA4", |
| 144 | + n="M5 P5 R3 T5 V5 W3 Y5 AA3", dir="i")), |
| 145 | + Subsignal("tx", DiffPairs(p="L4 M2 N4 P2 T2 U4 V2 Y2", |
| 146 | + n="L3 M1 N3 P1 T1 U3 V1 Y1", dir="o")), |
| 147 | + ), |
| 148 | + Resource("temperature", 0, |
| 149 | + Subsignal("scl", Pins("P23", dir="i")), |
| 150 | + Subsignal("sda", Pins("N25", dir="i")), |
| 151 | + Attrs(IOSTANDARD="LVCMOS33") |
| 152 | + ), |
| 153 | + *SDCardResources(0, clk="AH21", cmd="AJ21", dat0="AJ22", dat1="AJ23", |
| 154 | + dat2="AG20", dat3="AH20", cd="AE20", |
| 155 | + attrs=Attrs(IOSTANDARD="LVCMOS25")), |
| 156 | + *ButtonResources(pins="AG27 AG28", attrs=Attrs(IOSTANDARD="LVCMOS25")), |
| 157 | + ] |
| 158 | + connectors = [ |
| 159 | + # FMC LPC connector (BANK12, BANK13, VADJ=2.5V) |
| 160 | + Connector("fmc", 0, |
| 161 | + {"clk0_p": "AD23", |
| 162 | + "clk0_n": "AE24", |
| 163 | + "clk1_p": "AG29", |
| 164 | + "clk1_n": "AH29", |
| 165 | + "la00_cc_p": "AF22", |
| 166 | + "la00_cc_n": "AG23", |
| 167 | + "la01_cc_p": "AG24", |
| 168 | + "la01_cc_n": "AH24", |
| 169 | + "la02_p": "AK23", |
| 170 | + "la02_n": "AK24", |
| 171 | + "la03_p": "AJ24", |
| 172 | + "la03_n": "AK25", |
| 173 | + "la04_p": "AG25", |
| 174 | + "la04_n": "AH25", |
| 175 | + "la05_p": "AE23", |
| 176 | + "la05_n": "AF23", |
| 177 | + "la06_p": "AG22", |
| 178 | + "la06_n": "AH22", |
| 179 | + "la07_p": "AC24", |
| 180 | + "la07_n": "AD24", |
| 181 | + "la08_p": "AE25", |
| 182 | + "la08_n": "AF25", |
| 183 | + "la09_p": "AC22", |
| 184 | + "la09_n": "AD22", |
| 185 | + "la10_p": "AD21", |
| 186 | + "la10_n": "AE21", |
| 187 | + "la11_p": "AB22", |
| 188 | + "la11_n": "AB23", |
| 189 | + "la12_p": "AB24", |
| 190 | + "la12_n": "AC25", |
| 191 | + "la13_p": "AC20", |
| 192 | + "la13_n": "AC21", |
| 193 | + "la14_p": "Y21", |
| 194 | + "la14_n": "AA21", |
| 195 | + "la15_p": "Y23", |
| 196 | + "la15_n": "Y24", |
| 197 | + "la16_p": "AA22", |
| 198 | + "la16_n": "AA23", |
| 199 | + "la17_cc_p": "AE28", |
| 200 | + "la17_cc_n": "AF28", |
| 201 | + "la18_cc_p": "AB27", |
| 202 | + "la18_cc_n": "AC27", |
| 203 | + "la19_p": "AK29", |
| 204 | + "la19_n": "AK30", |
| 205 | + "la20_p": "AJ27", |
| 206 | + "la20_n": "AK28", |
| 207 | + "la21_p": "AG30", |
| 208 | + "la21_n": "AH30", |
| 209 | + "la22_p": "AJ28", |
| 210 | + "la22_n": "AJ29", |
| 211 | + "la23_p": "AA27", |
| 212 | + "la23_n": "AB28", |
| 213 | + "la24_p": "AD29", |
| 214 | + "la24_n": "AE29", |
| 215 | + "la25_p": "AE30", |
| 216 | + "la25_n": "AF30", |
| 217 | + "la26_p": "Y28", |
| 218 | + "la26_n": "AA28", |
| 219 | + "la27_p": "Y26", |
| 220 | + "la27_n": "AA26", |
| 221 | + "la28_p": "AC29", |
| 222 | + "la28_n": "AC30", |
| 223 | + "la29_p": "AD27", |
| 224 | + "la29_n": "AD28", |
| 225 | + "la30_p": "Y30", |
| 226 | + "la30_n": "AA30", |
| 227 | + "la31_p": "AB29", |
| 228 | + "la31_n": "AB30", |
| 229 | + "la32_p": "W27", |
| 230 | + "la32_n": "W28", |
| 231 | + "la33_p": "W29", |
| 232 | + "la33_n": "Y29", |
| 233 | + "scl": "A16", |
| 234 | + "sda": "A17"}), |
| 235 | + # J16 Expansion Header (active pins only, numbered by header pin) |
| 236 | + Connector("j16", 0, |
| 237 | + { "3": "J24", "4": "J23", |
| 238 | + "5": "J22", "6": "J21", |
| 239 | + "7": "J26", "8": "K26", |
| 240 | + "9": "K30", "10": "L30", |
| 241 | + "11": "L28", "12": "M28", |
| 242 | + "13": "M27", "14": "N27", |
| 243 | + "15": "N30", "16": "N29", |
| 244 | + "17": "L27", "18": "L26", |
| 245 | + "19": "J28", "20": "J27", |
| 246 | + "21": "H29", "22": "J29", |
| 247 | + "23": "K29", "24": "K28", |
| 248 | + "25": "L20", "26": "M20", |
| 249 | + "27": "K21", "28": "L21", |
| 250 | + "29": "L23", "30": "L22", |
| 251 | + "31": "K24", "32": "K23", |
| 252 | + "33": "K25", "34": "L25", |
| 253 | + "35": "M29", "36": "M19"}), |
| 254 | + ] |
| 255 | + |
| 256 | + def toolchain_program(self, product, name): |
| 257 | + # openfpgaloader |
| 258 | + openfpgaloader = os.environ.get("OPENFPGALOADER", "openFPGALoader") |
| 259 | + with product.extract("{}.bin".format(name)) as fn: |
| 260 | + # included with board |
| 261 | + subprocess.check_call([openfpgaloader, "-c", "ft232", fn]) |
| 262 | + |
| 263 | + |
| 264 | +if __name__ == "__main__": |
| 265 | + from .test.blinky import * |
| 266 | + AX7325BPlatform().build(Blinky(), do_program=True) |
0 commit comments