|
| 1 | +# |
| 2 | +# This file is part of LiteX-Boards. |
| 3 | +# |
| 4 | +# Copyright (c) 2024 Andelf <[email protected]> |
| 5 | +# SPDX-License-Identifier: BSD-2-Clause |
| 6 | +# |
| 7 | +# LCKFB LJPI FPGA board: https://wiki.lckfb.com/zh-hans/fpga-ljpi/ |
| 8 | + |
| 9 | +from migen import * |
| 10 | + |
| 11 | +from litex.build.generic_platform import * |
| 12 | +from litex.build.gowin.platform import GowinPlatform |
| 13 | +from litex.build.gowin.programmer import GowinProgrammer, GOWIN_CABLE_FT2CH |
| 14 | +from litex.build.openfpgaloader import OpenFPGALoader |
| 15 | + |
| 16 | + |
| 17 | +# IOs ---------------------------------------------------------------------------------------------- |
| 18 | + |
| 19 | +_io = [ |
| 20 | + # Clk / Rst. |
| 21 | + ("clk50", 0, Pins("T7"), IOStandard("LVCMOS33")), |
| 22 | + |
| 23 | + # Serial. |
| 24 | + ("serial", 0, |
| 25 | + Subsignal("tx", Pins("F12")), |
| 26 | + Subsignal("rx", Pins("F13")), |
| 27 | + IOStandard("LVCMOS33") |
| 28 | + ), |
| 29 | + |
| 30 | + # Leds. LED2 and LED3 are RGB LEDs. |
| 31 | + ("led", 0, Pins( "R9"), IOStandard("LVCMOS33")), |
| 32 | + ("led", 1, Pins("C10"), IOStandard("LVCMOS33")), |
| 33 | + ("led", 3, Pins( "R7"), IOStandard("LVCMOS33")), |
| 34 | + ("led", 2, Pins( "N6"), IOStandard("LVCMOS33")), |
| 35 | + ("led", 4, Pins("T10"), IOStandard("LVCMOS33")), |
| 36 | + ("led", 5, Pins( "P7"), IOStandard("LVCMOS33")), |
| 37 | + |
| 38 | + # Buttons. SW2 |
| 39 | + ("btn_n", 0, Pins("D11"), IOStandard("LVCMOS33")), |
| 40 | + # ("btn_n", 1, Pins("F10"), IOStandard("LVCMOS33")), |
| 41 | + |
| 42 | + # Reset. Use SW3 as reset button. |
| 43 | + ("rst_n", 0, Pins("F10"), IOStandard("LVCMOS33")), |
| 44 | + |
| 45 | + # SPIFlash. |
| 46 | + # W25Q64JVSSIQ |
| 47 | + ("spiflash", 0, |
| 48 | + Subsignal("cs_n", Pins("M9"), IOStandard("LVCMOS33")), |
| 49 | + Subsignal("clk", Pins("L10"), IOStandard("LVCMOS33")), |
| 50 | + Subsignal("miso", Pins("P10"), IOStandard("LVCMOS33")), |
| 51 | + Subsignal("mosi", Pins("R10"), IOStandard("LVCMOS33")), |
| 52 | + ), |
| 53 | + |
| 54 | + # HDMI(LVDS). |
| 55 | + ("hdmi", 0, |
| 56 | + Subsignal("clk_p", Pins("M10")), |
| 57 | + Subsignal("clk_n", Pins("N11")), |
| 58 | + Subsignal("data0_p", Pins("R13")), |
| 59 | + Subsignal("data0_n", Pins("T14")), |
| 60 | + Subsignal("data1_p", Pins("R11")), |
| 61 | + Subsignal("data1_n", Pins("T12")), |
| 62 | + Subsignal("data2_p", Pins("R12")), |
| 63 | + Subsignal("data2_n", Pins("P13")), |
| 64 | + IOStandard("LVCMOS33D DRIVE=8"), |
| 65 | + Misc("PULL_MODE=NONE"), |
| 66 | + ), |
| 67 | + |
| 68 | + # 8-segment LED display, Common Anode. |
| 69 | + ("seg8", 0, Pins("G13"), IOStandard("LVCMOS33")), |
| 70 | + ("seg8", 1, Pins("H16"), IOStandard("LVCMOS33")), |
| 71 | + ("seg8", 2, Pins("H12"), IOStandard("LVCMOS33")), |
| 72 | + ("seg8", 3, Pins("H13"), IOStandard("LVCMOS33")), |
| 73 | + ("seg8", 4, Pins("H14"), IOStandard("LVCMOS33")), |
| 74 | + ("seg8", 5, Pins("G12"), IOStandard("LVCMOS33")), |
| 75 | + ("seg8", 6, Pins("G11"), IOStandard("LVCMOS33")), |
| 76 | + # ("seg8", 7, Pins("L14"), IOStandard("LVCMOS33")), |
| 77 | + |
| 78 | + # DDR3 SDRAM |
| 79 | + # MT41J128M16JT-125K. |
| 80 | + ("ddram", 0, |
| 81 | + Subsignal("a", Pins("F7 A4 D6 F8 C4 E6 B1 D8 A5 F9 K3 B7 A3 C8"), |
| 82 | + IOStandard("SSTL15")), |
| 83 | + Subsignal("ba", Pins("H4 D3 H5"), IOStandard("SSTL15")), |
| 84 | + Subsignal("ras_n", Pins("R4"), IOStandard("SSTL15")), |
| 85 | + Subsignal("cas_n", Pins("R6"), IOStandard("SSTL15")), |
| 86 | + Subsignal("we_n", Pins("L2"), IOStandard("SSTL15")), |
| 87 | + Subsignal("cs_n", Pins("P5"), IOStandard("SSTL15")), |
| 88 | + Subsignal("dm", Pins("G1 K5"), IOStandard("SSTL15")), |
| 89 | + Subsignal("dq", Pins( |
| 90 | + "G5 F5 F4 F3 E2 C1 E1 B3", |
| 91 | + "M3 K4 N2 L1 P4 H3 R1 M2"), |
| 92 | + IOStandard("SSTL15"), |
| 93 | + Misc("VREF=INTERNAL")), |
| 94 | + Subsignal("dqs_p", Pins("G2 J5"), IOStandard("SSTL15D")), |
| 95 | + Subsignal("dqs_n", Pins("G3 K6"), IOStandard("SSTL15D")), |
| 96 | + Subsignal("clk_p", Pins("J1"), IOStandard("SSTL15D")), |
| 97 | + Subsignal("clk_n", Pins("J3"), IOStandard("SSTL15D")), |
| 98 | + Subsignal("cke", Pins("J2"), IOStandard("SSTL15")), |
| 99 | + Subsignal("odt", Pins("R3"), IOStandard("SSTL15")), |
| 100 | + Subsignal("reset_n", Pins("B9"), IOStandard("SSTL15")), |
| 101 | + ), |
| 102 | + |
| 103 | + # USB Type-C. |
| 104 | + ("usb", 0, |
| 105 | + Subsignal("d_p", Pins("M14")), |
| 106 | + Subsignal("d_n", Pins("M15")), |
| 107 | + Subsignal("pullup", Pins("L15")), |
| 108 | + IOStandard("LVCMOS33") |
| 109 | + ), |
| 110 | + |
| 111 | + # Wired to onboard GD32 MCU. |
| 112 | + ("mcu_bus", 0, |
| 113 | + Subsignal("data", Pins("PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7"), IOStandard("LVCMOS33"))), |
| 114 | +] |
| 115 | + |
| 116 | +# Connector IOs ------------------------------------------------------------------------------------ |
| 117 | + |
| 118 | +_connectors = [ |
| 119 | + ("h5", { |
| 120 | + 1: "K16", 2: "J15", |
| 121 | + 3: "J14", 4: "J16", |
| 122 | + 5: "F14", 6: "F16", |
| 123 | + 7: "J13", 8: "H11", |
| 124 | + 9: "E16", 10: "F15", |
| 125 | + 11: "C16", 12: "D15", |
| 126 | + 13: "D16", 14: "E14", |
| 127 | + 15: "B13", 16: "A14", |
| 128 | + 17: "B14", 18: "A15", |
| 129 | + 19: "A12", 20: "B11", |
| 130 | + 21: "B12", 22: "C12", |
| 131 | + 23: "C11", 24: "A11", |
| 132 | + 25: "C9", 26: "A9", |
| 133 | + 27: "E10", 28: "D10", |
| 134 | + 29: "N10", 30: "M11", |
| 135 | + 31: "P12", 32: "P11", |
| 136 | + 33: "T13", 34: "T11", |
| 137 | + 35: "R14", 36: "T15", |
| 138 | + }), |
| 139 | + ("h6", { |
| 140 | + 7: "G15", 8: "G14", |
| 141 | + 9: "G16", 10: "H15", |
| 142 | + 11: "L9", |
| 143 | + 13: "L8", 14: "N9", |
| 144 | + 15: "M6", 16: "M8", |
| 145 | + 17: "M7", 18: "T6", |
| 146 | + 19: "N7", 20: "N8", |
| 147 | + 21: "P6", 22: "R8", |
| 148 | + 23: "T9", 24: "P9", |
| 149 | + 25: "T8", 26: "P8", |
| 150 | + 27: "K14", 28: "K15", |
| 151 | + 29: "K13", 30: "K12", |
| 152 | + 31: "N15", 32: "P16", |
| 153 | + 33: "P15", 34: "R16", |
| 154 | + 35: "N16", 36: "N14", |
| 155 | + }), |
| 156 | +] |
| 157 | + |
| 158 | +# Platform ----------------------------------------------------------------------------------------- |
| 159 | + |
| 160 | +class Platform(GowinPlatform): |
| 161 | + default_clk_name = "clk50" |
| 162 | + default_clk_period = 1e9/50e6 |
| 163 | + |
| 164 | + def __init__(self, toolchain="gowin"): |
| 165 | + |
| 166 | + GowinPlatform.__init__(self, "GW2A-LV18PG256C8/I7", _io, _connectors, toolchain=toolchain, devicename="GW2A-18C") |
| 167 | + |
| 168 | + self.toolchain.options["use_mspi_as_gpio"] = 1 |
| 169 | + self.toolchain.options["use_sspi_as_gpio"] = 1 |
| 170 | + |
| 171 | + def create_programmer(self, kit="openfpgaloader"): |
| 172 | + if kit == "gowin": |
| 173 | + # The board provides an external programmer with an emulated FT2232 |
| 174 | + return GowinProgrammer(self.devicename, cable=GOWIN_CABLE_FT2CH) |
| 175 | + else: |
| 176 | + return OpenFPGALoader(cable="ft2232") |
| 177 | + |
| 178 | + def do_finalize(self, fragment): |
| 179 | + GowinPlatform.do_finalize(self, fragment) |
| 180 | + self.add_period_constraint(self.lookup_request("clk50", loose=True), 1e9/50e6) |
0 commit comments