| 
 | 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(156e6), 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="LVCMOS33")),  | 
 | 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="AB12 AA8 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("sodimm",  | 
 | 64 | +            rst_n="F17",  | 
 | 65 | +            clk_p="D17 E19",  | 
 | 66 | +            clk_n="D18 D19",  | 
 | 67 | +            clk_en="L17 G17",  | 
 | 68 | +            cs_n="F22 C21",  | 
 | 69 | +            we_n="H21",  | 
 | 70 | +            ras_n="G20",  | 
 | 71 | +            cas_n="K20",  | 
 | 72 | +            a="F21 D21 E21 F18 H17 B17 J19 C17 J18 C16 K19 G18 K18 G22 D16 L18",  | 
 | 73 | +            ba="H19 H20 J17",  | 
 | 74 | +            dqs_p="L12 J16 C12 D14 F25 B28 C29 G27",  | 
 | 75 | +            dqs_n="L13 H16 B12 C14 E25 A28 B29 F27",  | 
 | 76 | +            dq="""L15 K14 J14 L11 K15 L16 J13 K16  | 
 | 77 | +                  J12 J11 H15 G14 H11 H12 G13 G15  | 
 | 78 | +                  D12 A11 D13 E13 F11 E11 A12 F12  | 
 | 79 | +                  B13 A13 B15 C15 B14 A15 E15 F15  | 
 | 80 | +                  A23 D24 E24 E26 E23 B23 D23 G23  | 
 | 81 | +                  B24 C24 C26 A27 A25 A26 B27 D26  | 
 | 82 | +                  D27 A30 C30 D29 C27 B30 E29 E28  | 
 | 83 | +                  F28 F30 H30 G28 H24 G29 H27 H26""",  | 
 | 84 | +            dm="K13 H14 D11 E14 F26 C25 D28 G30",  | 
 | 85 | +            odt="D22 H22",  | 
 | 86 | +            diff_attrs=Attrs(IOSTANDARD="LVDS"),  | 
 | 87 | +            attrs=Attrs(IOSTANDARD="LVCMOS15")),  | 
 | 88 | +        # TODO QSPI Flash  | 
 | 89 | +        # CCLK B10  | 
 | 90 | +        # CE_B U19  | 
 | 91 | +        # D0 P24  | 
 | 92 | +        # D1 R25  | 
 | 93 | +        # D2 R20  | 
 | 94 | +        # D3 R21  | 
 | 95 | +        # *SPIFlashResources(0,  | 
 | 96 | +        #     cs_n="", clk="", copi="", cipo="", wp_n="", hold_n="",  | 
 | 97 | +        #     attrs=Attrs(IOSTANDARD="LVCMOS33")  | 
 | 98 | +        # ),  | 
 | 99 | +        UARTResource(0,  | 
 | 100 | +            rx="AJ26", tx="AK26",  | 
 | 101 | +            attrs=Attrs(IOSTANDARD="LVCMOS33")  | 
 | 102 | +        ),  | 
 | 103 | +        # TODO: 4x SFP  | 
 | 104 | +        # SFP1_TX_P K2  | 
 | 105 | +        # SFP1_TX_N K1  | 
 | 106 | +        # SFP1_RX_P K6  | 
 | 107 | +        # SFP1_RX_P K5  | 
 | 108 | +        # SFP1_TX_DIS T28  | 
 | 109 | +        # SFP1_LOSS R28  | 
 | 110 | +        # SFP2_TX_P J4  | 
 | 111 | +        # SFP2_TX_N J3  | 
 | 112 | +        # SFP2_RX_P H6  | 
 | 113 | +        # SFP2_RX_P H5  | 
 | 114 | +        # SFP2_TX_DIS T28  | 
 | 115 | +        # SFP2_LOSS T26  | 
 | 116 | +        # SFP3_TX_P H2  | 
 | 117 | +        # SFP3_TX_N H1  | 
 | 118 | +        # SFP3_RX_P G4  | 
 | 119 | +        # SFP3_RX_P G3  | 
 | 120 | +        # SFP3_TX_DIS U28  | 
 | 121 | +        # SFP3_LOSS U27  | 
 | 122 | +        # SFP4_TX_P F2  | 
 | 123 | +        # SFP4_TX_N F1  | 
 | 124 | +        # SFP4_RX_P F6  | 
 | 125 | +        # SFP4_RX_P F5  | 
 | 126 | +        # SFP4_TX_DIS U25  | 
 | 127 | +        # SFP4_LOSS A18  | 
 | 128 | +        # TODO: QSFP  | 
 | 129 | +        # QSFP1_TX_P D2  | 
 | 130 | +        # QSFP1_TX_N D1  | 
 | 131 | +        # QSFP2_TX_P B2  | 
 | 132 | +        # QSFP2_TX_N B1  | 
 | 133 | +        # QSFP3_TX_P C4  | 
 | 134 | +        # QSFP3_TX_N C3  | 
 | 135 | +        # QSFP4_TX_P A4  | 
 | 136 | +        # QSFP4_TX_N A3  | 
 | 137 | +        # QSFP1_RX_P E4  | 
 | 138 | +        # QSFP1_RX_N E3  | 
 | 139 | +        # QSFP2_RX_P B6  | 
 | 140 | +        # QSFP2_RX_N B5  | 
 | 141 | +        # QSFP3_RX_P D6  | 
 | 142 | +        # QSFP3_RX_N D5  | 
 | 143 | +        # QSFP4_RX_P A8  | 
 | 144 | +        # QSFP4_RX_N A7  | 
 | 145 | +        # QSFP_MODSELL R30  | 
 | 146 | +        # QSFP_RESETL U30  | 
 | 147 | +        # QSFP_MMODPRSL U22  | 
 | 148 | +        # QSFP_INTL R24  | 
 | 149 | +        # QSFP_LPMODE V26  | 
 | 150 | +        # QSFP_SCL A20  | 
 | 151 | +        # QSFP_SDA A21  | 
 | 152 | +        # TODO: PCIe x8  | 
 | 153 | +        # PCIE_RX0_P M6  | 
 | 154 | +        # PCIE_RX0_N M5  | 
 | 155 | +        # PCIE_RX1_P P6  | 
 | 156 | +        # PCIE_RX1_N P5  | 
 | 157 | +        # PCIE_RX2_P R4  | 
 | 158 | +        # PCIE_RX2_N R3  | 
 | 159 | +        # PCIE_RX3_P T6  | 
 | 160 | +        # PCIE_RX3_N T5  | 
 | 161 | +        # PCIE_RX4_P V6  | 
 | 162 | +        # PCIE_RX4_N V5  | 
 | 163 | +        # PCIE_RX5_P W4  | 
 | 164 | +        # PCIE_RX5_N W3  | 
 | 165 | +        # PCIE_RX6_P Y6  | 
 | 166 | +        # PCIE_RX6_N Y5  | 
 | 167 | +        # PCIE_RX7_P AA4  | 
 | 168 | +        # PCIE_RX7_N AA3  | 
 | 169 | +        # PCIE_TX0_P L4  | 
 | 170 | +        # PCIE_TX0_N L3  | 
 | 171 | +        # PCIE_TX1_P M2  | 
 | 172 | +        # PCIE_TX1_N M1  | 
 | 173 | +        # PCIE_TX2_P N4  | 
 | 174 | +        # PCIE_TX2_N N3  | 
 | 175 | +        # PCIE_TX3_P P2  | 
 | 176 | +        # PCIE_TX3_N P1  | 
 | 177 | +        # PCIE_TX4_P T2  | 
 | 178 | +        # PCIE_TX4_N T1  | 
 | 179 | +        # PCIE_TX5_P U4  | 
 | 180 | +        # PCIE_TX5_N U3  | 
 | 181 | +        # PCIE_TX6_P V2  | 
 | 182 | +        # PCIE_TX6_N V1  | 
 | 183 | +        # PCIE_TX7_P Y2  | 
 | 184 | +        # PCIE_TX7_N Y1  | 
 | 185 | +        # PCIE_PERST B18  | 
 | 186 | +        Resource("temperature", 0,  | 
 | 187 | +            Subsignal("scl",        Pins("P23", dir="i")),  | 
 | 188 | +            Subsignal("sda",        Pins("N25", dir="i")),  | 
 | 189 | +            Attrs(IOSTANDARD="LVCMOS33")  | 
 | 190 | +        ),  | 
 | 191 | +        *SDCardResources(0, clk="AH21", cmd="AJ21", dat0="AJ22", dat1="AJ23",  | 
 | 192 | +                         dat2="AG20", dat3="AH20", cd="AE20",  | 
 | 193 | +                         attrs=Attrs(IOSTANDARD="LVCMOS33")),  | 
 | 194 | +        # TODO: FMC  | 
 | 195 | +        # TODO: J16 Expansion Header  | 
 | 196 | +        *ButtonResources(pins="AG27 AG28", attrs=Attrs(IOSTANDARD="LVCMOS33")),  | 
 | 197 | +    ]  | 
 | 198 | +    connectors  = []  | 
 | 199 | + | 
 | 200 | +    def toolchain_program(self, product, name):  | 
 | 201 | +        # openfpgaloader  | 
 | 202 | +        openfpgaloader = os.environ.get("OPENFPGALOADER", "openFPGALoader")  | 
 | 203 | +        with product.extract("{}.bin".format(name)) as fn:  | 
 | 204 | +            # TODO: @timkpaine has digilent_hs3 cable  | 
 | 205 | +            subprocess.check_call([openfpgaloader, "-c", "digilent_hs3", fn])  | 
 | 206 | + | 
 | 207 | + | 
 | 208 | +if __name__ == "__main__":  | 
 | 209 | +    from .test.blinky import *  | 
 | 210 | +    AX7325BPlatform().build(Blinky(), do_program=True)  | 
0 commit comments