|
| 1 | +# |
| 2 | +# This file is part of LiteX-Boards. |
| 3 | +# |
| 4 | +# Copyright (c) 2026 Anton Kuzmin <ak@gmm7550.dev> |
| 5 | +# |
| 6 | +# Based on CologneChip GateMate Evaluation Board (colognechip_gatemate_evb) |
| 7 | +# Copyright (c) 2023 Gwenhael Goavec-merou<gwenhael.goavec-merou@trabucayre.com> |
| 8 | +# SPDX-License-Identifier: BSD-2-Clause |
| 9 | + |
| 10 | +# Board documentation/schematics: |
| 11 | +# https://www.gmm7550.dev/doc/module.html |
| 12 | + |
| 13 | +from litex.build.generic_platform import * |
| 14 | +from litex.build.colognechip.platform import CologneChipPlatform |
| 15 | +from litex.build.openfpgaloader import OpenFPGALoader |
| 16 | + |
| 17 | +_io = [ |
| 18 | + # Main reference clock (100 MHz, module PLL) |
| 19 | + ("ser_clk", 0, Pins("SER_CLK")), |
| 20 | + |
| 21 | + # SPI NOR Flash (FPGA configuration, MUXed with signals on P5 connector) |
| 22 | + ("spiflash", 0, |
| 23 | + Subsignal("cs_n", Pins("IO_WA_A8")), |
| 24 | + Subsignal("clk", Pins("IO_WA_B8")), |
| 25 | + Subsignal("mosi", Pins("IO_WA_B7")), # D0 |
| 26 | + Subsignal("miso", Pins("IO_WA_A7")), # D1 |
| 27 | + Subsignal("wp", Pins("IO_WA_B6")), # D2 |
| 28 | + Subsignal("hold", Pins("IO_WA_A6")), # D3 |
| 29 | + ), |
| 30 | + ("spiflash4x", 0, |
| 31 | + Subsignal("cs_n", Pins("IO_WA_A8")), |
| 32 | + Subsignal("clk", Pins("IO_WA_B8")), |
| 33 | + Subsignal("dq", Pins("IO_WA_B7 IO_WA_A7 IO_WA_B6 IO_WA_A6")), |
| 34 | + ), |
| 35 | + |
| 36 | + # UART |
| 37 | + ("serial", 0, |
| 38 | + Subsignal("rx", Pins("IO_WA_B6")), # SPI D2, P5/J5 pin 31 |
| 39 | + Subsignal("tx", Pins("IO_WA_A6")), # SPI D3, P5/J5 pin 33 |
| 40 | + ), |
| 41 | + |
| 42 | + # Status LEDs on the USB 3 Adapter board |
| 43 | + ("led_red_n", 0, Pins("IO_WA_A2")), # CFG_FAILED_N, P5/J5 pin 35 |
| 44 | + ("led_green", 0, Pins("IO_WA_B2")), # CFG_DONE, P5/J5 pin 36 |
| 45 | + |
| 46 | + # JTAG |
| 47 | + ("jtag", 0, |
| 48 | + Subsignal("tck", Pins("IO_WA_A5")), |
| 49 | + Subsignal("tms", Pins("IO_WA_B4")), |
| 50 | + Subsignal("tdi", Pins("IO_WA_A4")), |
| 51 | + Subsignal("tdo", Pins("IO_WA_B3")), |
| 52 | + ), |
| 53 | +] |
| 54 | + |
| 55 | +# GMM-7550 Module Connectors |
| 56 | +_connectors = [ |
| 57 | + # West ------------------------ |
| 58 | + ("P1", "-", # 0 |
| 59 | + " --- --- ", # 1 2 |
| 60 | + "IO_WB_B1 IO_WB_B0", # 3 4 |
| 61 | + "IO_WB_A1 IO_WB_A0", # 5 6 |
| 62 | + " --- --- ", # 7 8 |
| 63 | + "IO_WB_B2 IO_WB_B3", # 9 10 |
| 64 | + "IO_WB_A2 IO_WB_A3", # 11 12 |
| 65 | + " --- --- ", # 13 14 |
| 66 | + "IO_WB_B4 IO_WB_B5", # 15 16 |
| 67 | + "IO_WB_A4 IO_WB_A5", # 17 18 |
| 68 | + " --- --- ", # 19 20 |
| 69 | + "IO_WB_B6 IO_WB_B7", # 21 22 |
| 70 | + "IO_WB_A6 IO_WB_A7", # 23 24 |
| 71 | + " --- --- ", # 25 26 |
| 72 | + "IO_WB_B8 IO_WC_B0", # 27 28 |
| 73 | + "IO_WB_A8 IO_WC_A0", # 29 30 |
| 74 | + "--- --- ", # 31 32 |
| 75 | + "--- --- ", # 33 34 |
| 76 | + "--- --- ", # 35 36 |
| 77 | + "IO_WC_B1 IO_WC_B3", # 37 38 |
| 78 | + "IO_WC_A1 IO_WC_A3", # 39 40 |
| 79 | + " --- --- ", # 41 42 |
| 80 | + "IO_WC_B2 IO_WC_B5", # 43 44 |
| 81 | + "IO_WC_A2 IO_WC_A5", # 45 46 |
| 82 | + " --- --- ", # 47 48 |
| 83 | + "IO_WC_B4 IO_WC_B8", # 49 50 |
| 84 | + "IO_WC_A4 IO_WC_A8", # 51 52 |
| 85 | + " --- --- ", # 53 54 |
| 86 | + "IO_WC_B6 IO_WC_B7", # 55 56 |
| 87 | + "IO_WC_A6 IO_WC_A7", # 57 58 |
| 88 | + " --- --- ", # 59 60 |
| 89 | + ), |
| 90 | + # North ------------------------ |
| 91 | + ("P2", "-", # 0 |
| 92 | + " --- --- ", # 1 2 |
| 93 | + "IO_NA_B2 IO_NA_B0", # 3 4 |
| 94 | + "IO_NA_A2 IO_NA_A0", # 5 6 |
| 95 | + " --- --- ", # 7 8 |
| 96 | + "IO_NA_B3 IO_NA_B1", # 9 10 |
| 97 | + "IO_NA_A3 IO_NA_A1", # 11 12 |
| 98 | + " --- --- ", # 13 14 |
| 99 | + "IO_NA_B5 IO_NA_B4", # 15 16 |
| 100 | + "IO_NA_A5 IO_NA_A4", # 17 18 |
| 101 | + " --- --- ", # 19 20 |
| 102 | + "IO_NA_B6 IO_NA_B7", # 21 22 |
| 103 | + "IO_NA_A6 IO_NA_A7", # 23 24 |
| 104 | + " --- --- ", # 25 26 |
| 105 | + "IO_NA_B8 IO_NB_B0", # 27 28 |
| 106 | + "IO_NA_A8 IO_NB_A0", # 29 30 |
| 107 | + "--- --- ", # 31 32 |
| 108 | + "--- --- ", # 33 34 |
| 109 | + "--- --- ", # 35 36 |
| 110 | + "IO_NB_B1 IO_NB_B2", # 37 38 |
| 111 | + "IO_NB_A1 IO_NB_A2", # 39 40 |
| 112 | + " --- --- ", # 41 42 |
| 113 | + "IO_NB_B3 IO_NB_B4", # 43 44 |
| 114 | + "IO_NB_A3 IO_NB_A4", # 45 46 |
| 115 | + " --- --- ", # 47 48 |
| 116 | + "IO_NB_B5 IO_NB_B7", # 49 50 |
| 117 | + "IO_NB_A5 IO_NB_A7", # 51 52 |
| 118 | + " --- --- ", # 53 54 |
| 119 | + "IO_NB_B6 IO_NB_B8", # 55 56 |
| 120 | + "IO_NB_A6 IO_NB_A8", # 57 58 |
| 121 | + " --- --- ", # 59 60 |
| 122 | + ), |
| 123 | + # East ------------------------ |
| 124 | + ("P3", "-", # 0 |
| 125 | + " --- --- ", # 1 2 |
| 126 | + "IO_EB_B7 IO_EB_B8", # 3 4 |
| 127 | + "IO_EB_A7 IO_EB_A8", # 5 6 |
| 128 | + " --- --- ", # 7 8 |
| 129 | + "IO_EB_B5 IO_EB_B4", # 9 10 |
| 130 | + "IO_EB_A5 IO_EB_A4", # 11 12 |
| 131 | + " --- --- ", # 13 14 |
| 132 | + "IO_EB_B6 IO_EB_B2", # 15 16 |
| 133 | + "IO_EB_A6 IO_EB_A2", # 17 18 |
| 134 | + " --- --- ", # 19 20 |
| 135 | + "IO_EB_B3 IO_EB_B0", # 21 22 |
| 136 | + "IO_EB_A3 IO_EB_A0", # 23 24 |
| 137 | + " --- --- ", # 25 26 |
| 138 | + "IO_EB_B1 IO_EA_B7", # 27 28 |
| 139 | + "IO_EB_A1 IO_EA_A7", # 29 30 |
| 140 | + "--- --- ", # 31 32 |
| 141 | + "--- --- ", # 33 34 |
| 142 | + "--- --- ", # 35 36 |
| 143 | + "IO_EA_B8 IO_EA_B4", # 37 38 |
| 144 | + "IO_EA_A8 IO_EA_A4", # 39 40 |
| 145 | + " --- --- ", # 41 42 |
| 146 | + "IO_EA_B6 IO_EA_B2", # 43 44 |
| 147 | + "IO_EA_A6 IO_EA_A2", # 45 46 |
| 148 | + " --- --- ", # 47 48 |
| 149 | + "IO_EA_B5 IO_EA_B1", # 49 50 |
| 150 | + "IO_EA_A5 IO_EA_A1", # 51 52 |
| 151 | + " --- --- ", # 53 54 |
| 152 | + "IO_EA_B3 IO_EA_B0", # 55 56 |
| 153 | + "IO_EA_A3 IO_EA_A0", # 57 58 |
| 154 | + " --- --- ", # 59 60 |
| 155 | + ), |
| 156 | + # South ------------------------ |
| 157 | + ("P4", "-", # 0 |
| 158 | + " --- --- ", # 1 2 |
| 159 | + "IO_SB_B8 IO_SB_B3", # 3 4 |
| 160 | + "IO_SB_A8 IO_SB_A3", # 5 6 |
| 161 | + " --- --- ", # 7 8 |
| 162 | + "IO_SB_B6 IO_SB_B2", # 9 10 |
| 163 | + "IO_SB_A6 IO_SB_A2", # 11 12 |
| 164 | + " --- --- ", # 13 14 |
| 165 | + "IO_SB_B5 IO_SB_B1", # 15 16 |
| 166 | + "IO_SB_A5 IO_SB_A1", # 17 18 |
| 167 | + " --- --- ", # 19 20 |
| 168 | + "IO_SB_B7 IO_SB_B0", # 21 22 |
| 169 | + "IO_SB_A7 IO_SB_A0", # 23 24 |
| 170 | + " --- --- ", # 25 26 |
| 171 | + "IO_SB_B4 IO_SA_B8", # 27 28 |
| 172 | + "IO_SB_A4 IO_SA_A8", # 29 30 |
| 173 | + "--- --- ", # 31 32 |
| 174 | + "--- --- ", # 33 34 |
| 175 | + "--- --- ", # 35 36 |
| 176 | + "IO_SA_B6 IO_SA_B7", # 37 38 |
| 177 | + "IO_SA_A6 IO_SA_A7", # 39 40 |
| 178 | + " --- --- ", # 41 42 |
| 179 | + "IO_SA_B4 IO_SA_B5", # 43 44 |
| 180 | + "IO_SA_A4 IO_SA_A5", # 45 46 |
| 181 | + " --- --- ", # 47 48 |
| 182 | + "IO_SA_B2 IO_SA_B3", # 49 50 |
| 183 | + "IO_SA_A2 IO_SA_A3", # 51 52 |
| 184 | + " --- --- ", # 53 54 |
| 185 | + "IO_SA_B1 IO_SA_B0", # 55 56 |
| 186 | + "IO_SA_A1 IO_SA_A0", # 57 58 |
| 187 | + " --- --- ", # 59 60 |
| 188 | + ), |
| 189 | +] |
| 190 | + |
| 191 | +# Platform ----------------------------------------------------------------------------------------- |
| 192 | + |
| 193 | +class Platform(CologneChipPlatform): |
| 194 | + default_clk_name = "ser_clk" |
| 195 | + default_clk_period = 1e9/100e6 |
| 196 | + |
| 197 | + def __init__(self, toolchain="peppercorn"): |
| 198 | + CologneChipPlatform.__init__(self, "CCGM1A1", _io, _connectors, toolchain=toolchain) |
| 199 | + |
| 200 | + def create_programmer(self): |
| 201 | + return OpenFPGALoader(cable="dirtyJtag") |
| 202 | + |
| 203 | + def do_finalize(self, fragment): |
| 204 | + CologneChipPlatform.do_finalize(self, fragment) |
| 205 | + self.add_period_constraint(self.lookup_request(self.default_clk_name, loose=True), |
| 206 | + self.default_clk_period) |
0 commit comments