2020-08-23 09:00:17 -04:00
|
|
|
#
|
|
|
|
# This file is part of LiteX-Boards.
|
|
|
|
#
|
|
|
|
# Copyright (c) 2018-2019 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
|
|
# SPDX-License-Identifier: BSD-2-Clause
|
2019-06-10 11:09:51 -04:00
|
|
|
|
|
|
|
from litex.build.generic_platform import *
|
2022-11-05 03:07:14 -04:00
|
|
|
from litex.build.lattice import LatticeECP5Platform
|
2020-05-05 07:16:02 -04:00
|
|
|
from litex.build.lattice.programmer import UJProg
|
2019-06-10 11:09:51 -04:00
|
|
|
|
|
|
|
# IOs ----------------------------------------------------------------------------------------------
|
|
|
|
|
2020-10-12 07:23:26 -04:00
|
|
|
_io_common = [
|
2020-11-03 04:48:41 -05:00
|
|
|
# Clk / Rst
|
2019-06-10 11:09:51 -04:00
|
|
|
("clk25", 0, Pins("G2"), IOStandard("LVCMOS33")),
|
2020-04-09 12:53:06 -04:00
|
|
|
("rst", 0, Pins("R1"), IOStandard("LVCMOS33")),
|
2019-06-10 11:09:51 -04:00
|
|
|
|
2022-08-26 01:16:48 -04:00
|
|
|
# Buttons
|
2022-08-26 16:25:54 -04:00
|
|
|
("user_btn", 0, Pins( "D6"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # PWR
|
|
|
|
("user_btn", 1, Pins( "R1"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # F1
|
|
|
|
("user_btn", 2, Pins( "T1"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # F2
|
|
|
|
("user_btn", 3, Pins("R18"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # UP
|
|
|
|
("user_btn", 4, Pins( "V1"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # DOWN
|
|
|
|
("user_btn", 5, Pins( "U1"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # LEFT
|
|
|
|
("user_btn", 6, Pins("H16"), IOStandard("LVCMOS33"), Misc("PULLMODE=DOWN")), # RIGHT
|
2022-08-26 01:16:48 -04:00
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# Leds
|
2019-06-10 11:09:51 -04:00
|
|
|
("user_led", 0, Pins("B2"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 1, Pins("C2"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 2, Pins("C1"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 3, Pins("D2"), IOStandard("LVCMOS33")),
|
2020-04-09 12:53:06 -04:00
|
|
|
("user_led", 4, Pins("D1"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 5, Pins("E2"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 6, Pins("E1"), IOStandard("LVCMOS33")),
|
|
|
|
("user_led", 7, Pins("H3"), IOStandard("LVCMOS33")),
|
2019-06-10 11:09:51 -04:00
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# Serial
|
2019-06-10 11:09:51 -04:00
|
|
|
("serial", 0,
|
|
|
|
Subsignal("tx", Pins("L4"), IOStandard("LVCMOS33")),
|
|
|
|
Subsignal("rx", Pins("M1"), IOStandard("LVCMOS33"))
|
|
|
|
),
|
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# SDR SDRAM
|
2020-08-24 03:05:27 -04:00
|
|
|
("sdram_clock", 0, Pins("F19"), IOStandard("LVCMOS33")),
|
2019-06-10 11:09:51 -04:00
|
|
|
("sdram", 0,
|
2020-04-09 12:53:06 -04:00
|
|
|
Subsignal("a", Pins(
|
|
|
|
"M20 M19 L20 L19 K20 K19 K18 J20",
|
|
|
|
"J19 H20 N19 G20 G19")),
|
|
|
|
Subsignal("dq", Pins(
|
|
|
|
"J16 L18 M18 N18 P18 T18 T17 U20",
|
|
|
|
"E19 D20 D19 C20 E18 F18 J18 J17")),
|
|
|
|
Subsignal("we_n", Pins("T20")),
|
2019-06-10 11:09:51 -04:00
|
|
|
Subsignal("ras_n", Pins("R20")),
|
|
|
|
Subsignal("cas_n", Pins("T19")),
|
2020-04-09 12:53:06 -04:00
|
|
|
Subsignal("cs_n", Pins("P20")),
|
|
|
|
Subsignal("cke", Pins("F20")),
|
|
|
|
Subsignal("ba", Pins("P19 N20")),
|
|
|
|
Subsignal("dm", Pins("U19 E20")),
|
|
|
|
IOStandard("LVCMOS33"),
|
2020-08-24 03:05:27 -04:00
|
|
|
Misc("SLEWRATE=FAST"),
|
2019-06-10 11:09:51 -04:00
|
|
|
),
|
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# GPIOs
|
2019-06-10 11:09:51 -04:00
|
|
|
("gpio", 0,
|
|
|
|
Subsignal("p", Pins("B11")),
|
|
|
|
Subsignal("n", Pins("C11")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
|
|
|
("gpio", 1,
|
|
|
|
Subsignal("p", Pins("A10")),
|
|
|
|
Subsignal("n", Pins("A11")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
|
|
|
("gpio", 2,
|
|
|
|
Subsignal("p", Pins("A9")),
|
|
|
|
Subsignal("n", Pins("B10")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
|
|
|
("gpio", 3,
|
|
|
|
Subsignal("p", Pins("B9")),
|
|
|
|
Subsignal("n", Pins("C10")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
2020-04-14 08:53:46 -04:00
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# USB
|
2020-04-14 08:53:46 -04:00
|
|
|
("usb", 0,
|
|
|
|
Subsignal("d_p", Pins("D15")),
|
|
|
|
Subsignal("d_n", Pins("E15")),
|
|
|
|
Subsignal("pullup", Pins("B12 C12")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
2020-11-03 04:48:41 -05:00
|
|
|
|
2021-01-07 09:41:20 -05:00
|
|
|
# SPIFlash
|
|
|
|
("spiflash", 0,
|
|
|
|
Subsignal("cs_n", Pins("R2")),
|
|
|
|
Subsignal("miso", Pins("V2")),
|
|
|
|
Subsignal("mosi", Pins("W2")),
|
|
|
|
Subsignal("wp", Pins("Y2")),
|
|
|
|
Subsignal("hold", Pins("W1")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
|
|
|
("spiflash4x", 0,
|
|
|
|
Subsignal("cs_n", Pins("R2")),
|
|
|
|
Subsignal("dq", Pins("W2", "V2", "Y2", "W1")),
|
|
|
|
IOStandard("LVCMOS33")
|
|
|
|
),
|
|
|
|
|
2020-11-03 04:48:41 -05:00
|
|
|
# OLED
|
2020-08-04 05:07:30 -04:00
|
|
|
("oled_spi", 0,
|
|
|
|
Subsignal("clk", Pins("P4")),
|
|
|
|
Subsignal("mosi", Pins("P3")),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
|
|
|
("oled_ctl", 0,
|
|
|
|
Subsignal("dc", Pins("P1")),
|
|
|
|
Subsignal("resn", Pins("P2")),
|
|
|
|
Subsignal("csn", Pins("N2")),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
2020-11-03 04:48:41 -05:00
|
|
|
|
|
|
|
# Others
|
|
|
|
("ext0p", 0, Pins("B11"), IOStandard("LVCMOS33")),
|
|
|
|
("ext1p", 0, Pins("A10"), IOStandard("LVCMOS33")),
|
2019-06-10 11:09:51 -04:00
|
|
|
]
|
|
|
|
|
2020-10-12 07:23:26 -04:00
|
|
|
_io_1_7 = [
|
2020-11-03 04:48:41 -05:00
|
|
|
# SDCard
|
2020-10-12 07:23:26 -04:00
|
|
|
("spisdcard", 0,
|
|
|
|
Subsignal("clk", Pins("J1")),
|
|
|
|
Subsignal("mosi", Pins("J3"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("cs_n", Pins("H1"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("miso", Pins("K2"), Misc("PULLMODE=UP")),
|
|
|
|
Misc("SLEWRATE=FAST"),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
|
|
|
("sdcard", 0,
|
|
|
|
Subsignal("clk", Pins("J1")),
|
|
|
|
Subsignal("cmd", Pins("J3"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("data", Pins("K2 K1 H2 H1"), Misc("PULLMODE=UP")),
|
|
|
|
Misc("SLEWRATE=FAST"),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
2021-12-23 04:39:58 -05:00
|
|
|
|
|
|
|
# GPDI
|
|
|
|
("gpdi", 0,
|
|
|
|
Subsignal("clk_p", Pins("A17"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("clk_n", Pins("B18"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data0_p", Pins("A12"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data0_n", Pins("A13"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data1_p", Pins("A14"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data1_n", Pins("C14"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data2_p", Pins("A16"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data2_n", Pins("B16"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("cec", Pins("A18"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP")),
|
|
|
|
#Subsignal("scl", Pins("E19"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP")),
|
|
|
|
#Subsignal("sda", Pins("B19"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP"))
|
|
|
|
),
|
2022-03-22 12:54:12 -04:00
|
|
|
# Wifi power
|
|
|
|
("wifi_gpio0", 0, Pins("L2"), IOStandard("LVCMOS33")),
|
2020-10-12 07:23:26 -04:00
|
|
|
]
|
|
|
|
|
|
|
|
_io_2_0 = [
|
2020-11-03 04:48:41 -05:00
|
|
|
# SDCard
|
2020-10-12 07:23:26 -04:00
|
|
|
("spisdcard", 0,
|
|
|
|
Subsignal("clk", Pins("H2")),
|
|
|
|
Subsignal("mosi", Pins("J1"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("cs_n", Pins("K2"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("miso", Pins("J3"), Misc("PULLMODE=UP")),
|
|
|
|
Misc("SLEWRATE=FAST"),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
|
|
|
("sdcard", 0,
|
|
|
|
Subsignal("clk", Pins("H2")),
|
|
|
|
Subsignal("cmd", Pins("J1"), Misc("PULLMODE=UP")),
|
|
|
|
Subsignal("data", Pins("J3 H1 K1 K2"), Misc("PULLMODE=UP")),
|
2022-03-22 12:54:12 -04:00
|
|
|
#Subsignal("cd", Pins("N5")), # Not connected
|
|
|
|
#Subsignal("wp", Pins("P5")), # Not connected
|
2020-10-12 07:23:26 -04:00
|
|
|
Misc("SLEWRATE=FAST"),
|
|
|
|
IOStandard("LVCMOS33"),
|
|
|
|
),
|
2021-12-23 04:39:58 -05:00
|
|
|
|
|
|
|
# GPDI
|
|
|
|
("gpdi", 0,
|
|
|
|
Subsignal("clk_p", Pins("A17"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("clk_n", Pins("B18"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data0_p", Pins("A16"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data0_n", Pins("B16"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data1_p", Pins("A14"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data1_n", Pins("C14"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
Subsignal("data2_p", Pins("A12"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("data2_n", Pins("A13"), IOStandard("LVCMOS33D"), Misc("DRIVE=4")),
|
|
|
|
#Subsignal("cec", Pins("A18"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP")),
|
|
|
|
#Subsignal("scl", Pins("E19"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP")),
|
|
|
|
#Subsignal("sda", Pins("B19"), IOStandard("LVCMOS33"), Misc("PULLMODE=UP"))
|
|
|
|
),
|
2022-03-22 12:54:12 -04:00
|
|
|
# Wifi power
|
|
|
|
("wifi_gpio0", 0, Pins("F1"), IOStandard("LVCMOS33")),
|
2020-10-12 07:23:26 -04:00
|
|
|
]
|
|
|
|
|
2019-06-10 11:09:51 -04:00
|
|
|
# Platform -----------------------------------------------------------------------------------------
|
|
|
|
|
2022-11-05 03:07:14 -04:00
|
|
|
class Platform(LatticeECP5Platform):
|
2020-04-09 12:53:06 -04:00
|
|
|
default_clk_name = "clk25"
|
2019-08-07 02:47:08 -04:00
|
|
|
default_clk_period = 1e9/25e6
|
2019-06-10 11:09:51 -04:00
|
|
|
|
2020-11-12 07:33:30 -05:00
|
|
|
def __init__(self, device="LFE5U-45F", revision="2.0", toolchain="trellis", **kwargs):
|
2020-11-01 18:45:32 -05:00
|
|
|
assert device in ["LFE5U-12F", "LFE5U-25F", "LFE5U-45F", "LFE5U-85F"]
|
2020-10-12 07:23:26 -04:00
|
|
|
assert revision in ["1.7", "2.0"]
|
|
|
|
_io = _io_common + {"1.7": _io_1_7, "2.0": _io_2_0}[revision]
|
2022-11-05 03:07:14 -04:00
|
|
|
LatticeECP5Platform.__init__(self, device + "-6BG381C", _io, toolchain=toolchain, **kwargs)
|
2020-05-05 05:45:41 -04:00
|
|
|
|
2020-05-05 07:16:02 -04:00
|
|
|
def create_programmer(self):
|
|
|
|
return UJProg()
|
|
|
|
|
2020-05-05 05:45:41 -04:00
|
|
|
def do_finalize(self, fragment):
|
2022-11-05 03:07:14 -04:00
|
|
|
LatticeECP5Platform.do_finalize(self, fragment)
|
2020-05-05 05:45:41 -04:00
|
|
|
self.add_period_constraint(self.lookup_request("clk25", loose=True), 1e9/25e6)
|