mirror of
https://github.com/litex-hub/litex-boards.git
synced 2025-01-03 03:43:36 -05:00
add Linsn RV901T support
This commit is contained in:
parent
0e4569a48a
commit
684c1640bb
2 changed files with 409 additions and 0 deletions
289
litex_boards/partner/platforms/linsn_rv901t.py
Normal file
289
litex_boards/partner/platforms/linsn_rv901t.py
Normal file
|
@ -0,0 +1,289 @@
|
||||||
|
# This file is Copyright (c) 2019-2020 Florent Kermarrec <florent@enjoy-digital.fr>
|
||||||
|
# This file is Copyright (c) 2019-2020 Serge Bazanski <serge@bazanski.pl>
|
||||||
|
# License: BSD
|
||||||
|
|
||||||
|
# The Linsn RV901T PCB and IOs have been documented with Chubby75 project
|
||||||
|
# available at: https://github.com/q3k/chubby75
|
||||||
|
|
||||||
|
from litex.build.generic_platform import *
|
||||||
|
from litex.build.xilinx import XilinxPlatform
|
||||||
|
|
||||||
|
# IOs ----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
_io = [
|
||||||
|
# clock
|
||||||
|
("clk25", 0, Pins("M9"), IOStandard("LVCMOS33")),
|
||||||
|
|
||||||
|
# led
|
||||||
|
("user_led", 0, Pins("F7"), IOStandard("LVCMOS33")),
|
||||||
|
|
||||||
|
# serial
|
||||||
|
("serial", 0,
|
||||||
|
Subsignal("tx", Pins("H5")),
|
||||||
|
Subsignal("rx", Pins("G6")),
|
||||||
|
IOStandard("LVCMOS33")
|
||||||
|
),
|
||||||
|
|
||||||
|
# ethernet
|
||||||
|
("eth_clocks", 0,
|
||||||
|
Subsignal("tx", Pins("D1")),
|
||||||
|
Subsignal("rx", Pins("F1")),
|
||||||
|
IOStandard("LVCMOS33")
|
||||||
|
),
|
||||||
|
("eth", 0,
|
||||||
|
Subsignal("rx_ctl", Pins("H1")),
|
||||||
|
Subsignal("rx_data", Pins("F2 F4 G1 G3")),
|
||||||
|
Subsignal("tx_ctl", Pins("E4")),
|
||||||
|
Subsignal("tx_data", Pins("E3 E2 E1 F3")),
|
||||||
|
IOStandard("LVCMOS33")
|
||||||
|
),
|
||||||
|
|
||||||
|
("eth_clocks", 1,
|
||||||
|
Subsignal("tx", Pins("J1")),
|
||||||
|
Subsignal("rx", Pins("K3")),
|
||||||
|
IOStandard("LVCMOS33")
|
||||||
|
),
|
||||||
|
("eth", 1,
|
||||||
|
Subsignal("rx_ctl", Pins("M3")),
|
||||||
|
Subsignal("rx_data", Pins("L1 L3 M1 M2")),
|
||||||
|
Subsignal("tx_ctl", Pins("H2")),
|
||||||
|
Subsignal("tx_data", Pins("J3 K1 K2 H3")),
|
||||||
|
IOStandard("LVCMOS33")
|
||||||
|
),
|
||||||
|
|
||||||
|
# sdram
|
||||||
|
("sdram_clock", 0, Pins("K11"), IOStandard("LVCMOS33"), Misc("SLEW=FAST")),
|
||||||
|
("sdram_clock", 1, Pins("K12"), IOStandard("LVCMOS33"), Misc("SLEW=FAST")),
|
||||||
|
("sdram", 0,
|
||||||
|
Subsignal("a", Pins("L16 M14 M16 K14 J12 J13 J11 H13 H11 G12 L14")),
|
||||||
|
Subsignal("dq", Pins(
|
||||||
|
"C15 C16 D14 E15 E16 F14 F16 G14",
|
||||||
|
"G11 E12 H14 G16 F15 D16 B16 B15",
|
||||||
|
"N16 P16 P15 R15 R16 R14 T14 R12",
|
||||||
|
"T12 T13 T15 M13 N14 M15 L12 L13")),
|
||||||
|
Subsignal("we_n", Pins("H16")),
|
||||||
|
Subsignal("ras_n", Pins("J14")),
|
||||||
|
Subsignal("cas_n", Pins("H15")),
|
||||||
|
Subsignal("cs_n", Pins("J16")),
|
||||||
|
Subsignal("ba", Pins("K16 K15")),
|
||||||
|
IOStandard("LVCMOS33"), Misc("SLEW=FAST")
|
||||||
|
),
|
||||||
|
|
||||||
|
# Direction pin for buffers U600 to U607. 1 is input, 0 is output.
|
||||||
|
("bufdir", 0, Pins("F13"), IOStandard("LVCMOS33")),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Connectors ---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
_connectors = [
|
||||||
|
# Lower connector on board. Pin 1 marked with silkscreen layer, pins then
|
||||||
|
# alternating through the two rows of the connector.
|
||||||
|
("J600", {
|
||||||
|
# Buffered through U610, shared with J601
|
||||||
|
4: "J6",
|
||||||
|
# Buffered through U608, shared with J601
|
||||||
|
6: "A11",
|
||||||
|
|
||||||
|
# Buffered through U600
|
||||||
|
7: "P4",
|
||||||
|
8: "R1",
|
||||||
|
9: "M4",
|
||||||
|
10: "L5",
|
||||||
|
11: "M5",
|
||||||
|
12: "K6",
|
||||||
|
13: "T4",
|
||||||
|
14: "P5",
|
||||||
|
|
||||||
|
# Buffered through U604
|
||||||
|
15: "P6",
|
||||||
|
16: "M7",
|
||||||
|
17: "N6",
|
||||||
|
18: "M6",
|
||||||
|
19: "L7",
|
||||||
|
20: "L8",
|
||||||
|
21: "P7",
|
||||||
|
22: "N8",
|
||||||
|
|
||||||
|
# Buffered through U601
|
||||||
|
23: "M12",
|
||||||
|
24: "N11",
|
||||||
|
25: "M11",
|
||||||
|
26: "M10",
|
||||||
|
27: "L10",
|
||||||
|
28: "N9",
|
||||||
|
29: "P11",
|
||||||
|
30: "T11",
|
||||||
|
|
||||||
|
# Buffered through U605
|
||||||
|
31: "R9",
|
||||||
|
32: "T9",
|
||||||
|
33: "T8",
|
||||||
|
34: "R7",
|
||||||
|
35: "T7",
|
||||||
|
36: "T6",
|
||||||
|
37: "R5",
|
||||||
|
38: "T5",
|
||||||
|
|
||||||
|
# Buffered through U608, shared with J601
|
||||||
|
39: "A12",
|
||||||
|
40: "B12",
|
||||||
|
41: "A13",
|
||||||
|
42: "C13",
|
||||||
|
43: "A14",
|
||||||
|
44: "B14",
|
||||||
|
45: "C11",
|
||||||
|
|
||||||
|
# Shared with J601
|
||||||
|
47: "E13",
|
||||||
|
}),
|
||||||
|
# Upper connector on board. Same numbering as J600.
|
||||||
|
("J601", {
|
||||||
|
# Buffered through U610, shared with J601
|
||||||
|
4: "J6",
|
||||||
|
# Buffered through U609, shared with J601
|
||||||
|
6: "A11",
|
||||||
|
|
||||||
|
# Buffered through U603
|
||||||
|
7: "D3",
|
||||||
|
8: "C3",
|
||||||
|
9: "B3",
|
||||||
|
10: "D5",
|
||||||
|
11: "A4",
|
||||||
|
12: "B2",
|
||||||
|
13: "A2",
|
||||||
|
14: "A3",
|
||||||
|
|
||||||
|
# Buffered through U607
|
||||||
|
15: "A5",
|
||||||
|
16: "A6",
|
||||||
|
17: "A7",
|
||||||
|
18: "A8",
|
||||||
|
19: "B8",
|
||||||
|
20: "A9",
|
||||||
|
21: "A10",
|
||||||
|
22: "B10",
|
||||||
|
|
||||||
|
# Buffered through U602
|
||||||
|
23: "E11",
|
||||||
|
24: "D12",
|
||||||
|
25: "D11",
|
||||||
|
26: "E10",
|
||||||
|
27: "D9",
|
||||||
|
28: "F9",
|
||||||
|
29: "D8",
|
||||||
|
30: "E8",
|
||||||
|
|
||||||
|
# Buffered through U606
|
||||||
|
31: "E7",
|
||||||
|
32: "D6",
|
||||||
|
33: "E6",
|
||||||
|
34: "C9",
|
||||||
|
35: "C8",
|
||||||
|
36: "C7",
|
||||||
|
37: "C6",
|
||||||
|
38: "B6",
|
||||||
|
|
||||||
|
# Buffered through U609, shared with J600
|
||||||
|
39: "A12",
|
||||||
|
40: "B12",
|
||||||
|
41: "A13",
|
||||||
|
42: "C13",
|
||||||
|
43: "A14",
|
||||||
|
44: "B14",
|
||||||
|
45: "C11",
|
||||||
|
|
||||||
|
# Shared with J600
|
||||||
|
47: "E13",
|
||||||
|
})
|
||||||
|
]
|
||||||
|
|
||||||
|
# Extension for HUB75e 'hat' (marked "Huidu Hub75E-10 Support 1/32 ")
|
||||||
|
hub75e = [
|
||||||
|
("hub75_control", 0,
|
||||||
|
# bank select (a, b, c, d, e)
|
||||||
|
Subsignal("bank", Pins("J601:42 J601:41 J601:40 J601:39 J600:6")),
|
||||||
|
Subsignal("oe", Pins("J600:45")),
|
||||||
|
Subsignal("stb", Pins("J601:43")),
|
||||||
|
Subsignal("clk", Pins("J601:44")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J1
|
||||||
|
("hub75_chain", 0,
|
||||||
|
Subsignal("r", Pins("J601:38 J601:35")),
|
||||||
|
Subsignal("g", Pins("J601:37 J601:34")),
|
||||||
|
Subsignal("b", Pins("J601:36 J601:33")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J2
|
||||||
|
("hub75_chain", 1,
|
||||||
|
Subsignal("r", Pins("J601:32 J601:29")),
|
||||||
|
Subsignal("g", Pins("J601:31 J601:28")),
|
||||||
|
Subsignal("b", Pins("J601:30 J601:27")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J3
|
||||||
|
("hub75_chain", 2,
|
||||||
|
Subsignal("r", Pins("J601:26 J601:23")),
|
||||||
|
Subsignal("g", Pins("J601:25 J601:22")),
|
||||||
|
Subsignal("b", Pins("J601:24 J601:21")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J4
|
||||||
|
("hub75_chain", 3,
|
||||||
|
Subsignal("r", Pins("J601:20 J601:17")),
|
||||||
|
Subsignal("g", Pins("J601:19 J601:16")),
|
||||||
|
Subsignal("b", Pins("J601:18 J601:15")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J5
|
||||||
|
("hub75_chain", 4,
|
||||||
|
Subsignal("r", Pins("J601:14 J601:11")),
|
||||||
|
Subsignal("g", Pins("J601:13 J601:10")),
|
||||||
|
Subsignal("b", Pins("J601:12 J601:9")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J6
|
||||||
|
("hub75_chain", 5,
|
||||||
|
Subsignal("r", Pins("J600:38 J600:35")),
|
||||||
|
Subsignal("g", Pins("J600:37 J600:34")),
|
||||||
|
Subsignal("b", Pins("J600:36 J600:33")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J7
|
||||||
|
("hub75_chain", 6,
|
||||||
|
Subsignal("r", Pins("J600:32 J600:29")),
|
||||||
|
Subsignal("g", Pins("J600:31 J600:28")),
|
||||||
|
Subsignal("b", Pins("J600:30 J600:27")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J8
|
||||||
|
("hub75_chain", 7,
|
||||||
|
Subsignal("r", Pins("J600:26 J600:23")),
|
||||||
|
Subsignal("g", Pins("J600:25 J600:22")),
|
||||||
|
Subsignal("b", Pins("J600:24 J600:21")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J9
|
||||||
|
("hub75_chain", 8,
|
||||||
|
Subsignal("r", Pins("J600:20 J600:17")),
|
||||||
|
Subsignal("g", Pins("J600:19 J600:16")),
|
||||||
|
Subsignal("b", Pins("J600:18 J600:15")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
# J10
|
||||||
|
("hub75_chain", 9,
|
||||||
|
Subsignal("r", Pins("J600:14 J600:11")),
|
||||||
|
Subsignal("g", Pins("J600:13 J600:10")),
|
||||||
|
Subsignal("b", Pins("J600:12 J600:9")),
|
||||||
|
IOStandard("LVCMOS33"),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Platform -----------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class Platform(XilinxPlatform):
|
||||||
|
default_clk_name = "clk25"
|
||||||
|
default_clk_period = 1e9/25e6
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
XilinxPlatform.__init__(self, "xc6slx16-2-ftg256", _io, _connectors)
|
120
litex_boards/partner/targets/linsn_rv901t.py
Executable file
120
litex_boards/partner/targets/linsn_rv901t.py
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# This file is Copyright (c) 2019-2020 Florent Kermarrec <florent@enjoy-digital.fr>
|
||||||
|
# License: BSD
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from migen import *
|
||||||
|
|
||||||
|
from litex_boards.platforms import linsn_rv901t
|
||||||
|
|
||||||
|
from litex.soc.integration.soc_sdram import *
|
||||||
|
from litex.soc.integration.builder import *
|
||||||
|
from litex.soc.cores.clock import S6PLL
|
||||||
|
|
||||||
|
from litedram.modules import M12L64322A
|
||||||
|
from litedram.phy import GENSDRPHY
|
||||||
|
|
||||||
|
from liteeth.phy.s6rgmii import LiteEthPHYRGMII
|
||||||
|
from liteeth.mac import LiteEthMAC
|
||||||
|
|
||||||
|
# CRG ----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class _CRG(Module):
|
||||||
|
def __init__(self, platform, sys_clk_freq):
|
||||||
|
self.clock_domains.cd_sys = ClockDomain()
|
||||||
|
self.clock_domains.cd_sys_ps = ClockDomain(reset_less=True)
|
||||||
|
|
||||||
|
# # #
|
||||||
|
|
||||||
|
clk25 = platform.request("clk25")
|
||||||
|
platform.add_period_constraint(clk25, 1e9/25e6)
|
||||||
|
|
||||||
|
self.submodules.pll = pll = S6PLL(speedgrade=-2)
|
||||||
|
pll.register_clkin(clk25, 25e6)
|
||||||
|
pll.create_clkout(self.cd_sys, sys_clk_freq)
|
||||||
|
pll.create_clkout(self.cd_sys_ps, sys_clk_freq, phase=270)
|
||||||
|
|
||||||
|
self.specials += Instance("ODDR2",
|
||||||
|
p_DDR_ALIGNMENT="NONE",
|
||||||
|
p_INIT=0, p_SRTYPE="SYNC",
|
||||||
|
i_D0=0, i_D1=1, i_S=0, i_R=0, i_CE=1,
|
||||||
|
i_C0=self.cd_sys.clk, i_C1=~self.cd_sys.clk,
|
||||||
|
o_Q=platform.request("sdram_clock"))
|
||||||
|
|
||||||
|
# BaseSoC ------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BaseSoC(SoCSDRAM):
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
platform = linsn_rv901t.Platform()
|
||||||
|
sys_clk_freq = int(75e6)
|
||||||
|
|
||||||
|
# SoCSDRAM ---------------------------------------------------------------------------------
|
||||||
|
SoCSDRAM.__init__(self, platform, clk_freq=sys_clk_freq, **kwargs)
|
||||||
|
|
||||||
|
# CRG --------------------------------------------------------------------------------------
|
||||||
|
self.submodules.crg = _CRG(platform, sys_clk_freq)
|
||||||
|
|
||||||
|
# SDR SDRAM --------------------------------------------------------------------------------
|
||||||
|
self.submodules.sdrphy = GENSDRPHY(platform.request("sdram"))
|
||||||
|
sdram_module = M12L64322A(sys_clk_freq, "1:1")
|
||||||
|
self.register_sdram(self.sdrphy, sdram_module.geom_settings, sdram_module.timing_settings)
|
||||||
|
|
||||||
|
# EthernetSoC --------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class EthernetSoC(BaseSoC):
|
||||||
|
mem_map = {
|
||||||
|
"ethmac": 0xb0000000,
|
||||||
|
}
|
||||||
|
mem_map.update(BaseSoC.mem_map)
|
||||||
|
|
||||||
|
def __init__(self, eth_phy=0, **kwargs):
|
||||||
|
BaseSoC.__init__(self, **kwargs)
|
||||||
|
|
||||||
|
# Ethernet ---------------------------------------------------------------------------------
|
||||||
|
# phy
|
||||||
|
self.submodules.ethphy = LiteEthPHYRGMII(
|
||||||
|
clock_pads = self.platform.request("eth_clocks", eth_phy),
|
||||||
|
pads = self.platform.request("eth", eth_phy))
|
||||||
|
self.add_csr("ethphy")
|
||||||
|
# mac
|
||||||
|
self.submodules.ethmac = LiteEthMAC(
|
||||||
|
phy = self.ethphy,
|
||||||
|
dw = 32,
|
||||||
|
interface = "wishbone",
|
||||||
|
endianness = self.cpu.endianness)
|
||||||
|
self.add_wb_slave(self.mem_map["ethmac"], self.ethmac.bus, 0x2000)
|
||||||
|
self.add_memory_region("ethmac", self.mem_map["ethmac"], 0x2000, type="io")
|
||||||
|
self.add_csr("ethmac")
|
||||||
|
self.add_interrupt("ethmac")
|
||||||
|
# timing constraints
|
||||||
|
self.platform.add_period_constraint(self.ethphy.crg.cd_eth_rx.clk, 1e9/125e6)
|
||||||
|
self.platform.add_period_constraint(self.ethphy.crg.cd_eth_tx.clk, 1e9/125e6)
|
||||||
|
self.platform.add_false_path_constraints(
|
||||||
|
self.crg.cd_sys.clk,
|
||||||
|
self.ethphy.crg.cd_eth_rx.clk,
|
||||||
|
self.ethphy.crg.cd_eth_tx.clk)
|
||||||
|
|
||||||
|
# Build --------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="LiteX SoC on Linsn RV901T")
|
||||||
|
builder_args(parser)
|
||||||
|
soc_sdram_args(parser)
|
||||||
|
parser.add_argument("--with-ethernet", action="store_true",
|
||||||
|
help="enable Ethernet support")
|
||||||
|
parser.add_argument("--eth-phy", default=0, type=int,
|
||||||
|
help="Ethernet PHY 0 or 1 (default=0)")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.with_ethernet:
|
||||||
|
soc = EthernetSoC(eth_phy=args.eth_phy, **soc_sdram_argdict(args))
|
||||||
|
else:
|
||||||
|
soc = BaseSoC(**soc_sdram_argdict(args))
|
||||||
|
builder = Builder(soc, **builder_argdict(args))
|
||||||
|
builder.build()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue