153 lines
5.5 KiB
Python
153 lines
5.5 KiB
Python
|
#
|
||
|
# This file is part of LiteX-Boards.
|
||
|
#
|
||
|
# Copyright (c) 2024 Yu-Ti Kuo <bobgash2@gmail.com>
|
||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||
|
# embedfire rise pro FPGA: https://detail.tmall.com/item.htm?id=645153441975
|
||
|
|
||
|
from litex.build.generic_platform import *
|
||
|
from litex.build.xilinx import Xilinx7SeriesPlatform
|
||
|
from litex.build.openocd import OpenOCD
|
||
|
from litex.build.xilinx.programmer import VivadoProgrammer
|
||
|
|
||
|
# IOs ----------------------------------------------------------------------------------------------
|
||
|
|
||
|
_io = [
|
||
|
# Clk / Rst
|
||
|
("clk50" , 0, Pins("W19"), IOStandard("LVCMOS33")),
|
||
|
("cpu_reset", 0, Pins("N15"), IOStandard("LVCMOS33")),
|
||
|
|
||
|
# Leds
|
||
|
("user_led", 0, Pins("M21"), IOStandard("LVCMOS33")),
|
||
|
("user_led", 1, Pins("L21"), IOStandard("LVCMOS33")),
|
||
|
("user_led", 2, Pins("K21"), IOStandard("LVCMOS33")),
|
||
|
("user_led", 3, Pins("K22"), IOStandard("LVCMOS33")),
|
||
|
|
||
|
# Buttons
|
||
|
("user_sw", 0, Pins("V17"), IOStandard("LVCMOS33")),
|
||
|
("user_sw", 1, Pins("W17"), IOStandard("LVCMOS33")),
|
||
|
("user_sw", 2, Pins("AA18"), IOStandard("LVCMOS33")),
|
||
|
("user_sw", 3, Pins("AB18"), IOStandard("LVCMOS33")),
|
||
|
|
||
|
# Beeper (Buzzer)
|
||
|
("beeper", 0, Pins("M17"), IOStandard("LVCMOS33")),
|
||
|
|
||
|
# Fan
|
||
|
("fan", 0, Pins("W22"), IOStandard("LVCMOS33")),
|
||
|
|
||
|
# Serial CH340G
|
||
|
("serial", 0,
|
||
|
Subsignal("tx", Pins("N17")),
|
||
|
Subsignal("rx", Pins("P17")),
|
||
|
IOStandard("LVCMOS33")
|
||
|
),
|
||
|
|
||
|
# I2C EEPROM 24C64
|
||
|
("i2c", 0,
|
||
|
Subsignal("scl", Pins("E22")),
|
||
|
Subsignal("sda", Pins("D22")),
|
||
|
IOStandard("LVCMOS33"),
|
||
|
),
|
||
|
|
||
|
# DDR3 SDRAM MT41K256M16
|
||
|
("ddram", 0,
|
||
|
Subsignal("a", Pins(
|
||
|
"AA4 AB2 AA5 AB3 AB1 U2 W1 R2",
|
||
|
"V2 U3 Y1 W2 Y2 U1 V3"),
|
||
|
IOStandard("SSTL135")),
|
||
|
Subsignal("ba", Pins("AA1 Y3 AA3"), IOStandard("SSTL135")),
|
||
|
Subsignal("ras_n", Pins("W6"), IOStandard("SSTL135")),
|
||
|
Subsignal("cas_n", Pins("U5"), IOStandard("SSTL135")),
|
||
|
Subsignal("we_n", Pins("Y4"), IOStandard("SSTL135")),
|
||
|
Subsignal("cs_n", Pins("T1"), IOStandard("SSTL135")),
|
||
|
Subsignal("dm", Pins("D2 G2 M2 M5"), IOStandard("SSTL135")),
|
||
|
Subsignal("dq", Pins(
|
||
|
"C2 G1 A1 F3 B2 F1 B1 E2",
|
||
|
"H3 G3 H2 H5 J1 J5 K1 H4",
|
||
|
"L4 M3 L3 J6 K3 K6 J4 L5",
|
||
|
"P1 N4 R1 N2 M6 N5 P6 P2"),
|
||
|
IOStandard("SSTL135"),
|
||
|
Misc("IN_TERM=UNTUNED_SPLIT_40")),
|
||
|
Subsignal("dqs_p", Pins("E1 K2 M1 P5"),
|
||
|
IOStandard("DIFF_SSTL135"),
|
||
|
Misc("IN_TERM=UNTUNED_SPLIT_40")),
|
||
|
Subsignal("dqs_n", Pins("D1 J2 L1 P4"),
|
||
|
IOStandard("DIFF_SSTL135"),
|
||
|
Misc("IN_TERM=UNTUNED_SPLIT_40")),
|
||
|
Subsignal("clk_p", Pins("V4"), IOStandard("DIFF_SSTL135")),
|
||
|
Subsignal("clk_n", Pins("W4"), IOStandard("DIFF_SSTL135")),
|
||
|
Subsignal("cke", Pins("AB5"), IOStandard("SSTL135")),
|
||
|
Subsignal("odt", Pins("T5"), IOStandard("SSTL135")),
|
||
|
Subsignal("reset_n", Pins("R3"), IOStandard("SSTL135")),
|
||
|
Misc("SLEW=FAST"),
|
||
|
),
|
||
|
|
||
|
# RGMII Ethernet (RTL8211F)
|
||
|
("eth_clocks", 0,
|
||
|
Subsignal("tx", Pins("C18")),
|
||
|
Subsignal("rx", Pins("C19")),
|
||
|
IOStandard("LVCMOS33")
|
||
|
),
|
||
|
("eth", 0,
|
||
|
#SubSignal("inib"), Pins("D21")),
|
||
|
#Subsignal("rst_n", Pins("E21")),
|
||
|
Subsignal("mdio", Pins("G22")),
|
||
|
Subsignal("mdc", Pins("G21")),
|
||
|
Subsignal("rx_ctl", Pins("C22")),
|
||
|
Subsignal("rx_data", Pins("D20 C20 A18 A19")),
|
||
|
Subsignal("tx_ctl", Pins("B22")),
|
||
|
Subsignal("tx_data", Pins("B20 A20 B21 A21")),
|
||
|
IOStandard("LVCMOS33")
|
||
|
),
|
||
|
|
||
|
# SDCard
|
||
|
("spisdcard", 0,
|
||
|
Subsignal("cd", Pins("AA19")),
|
||
|
Subsignal("clk", Pins("Y22")),
|
||
|
Subsignal("mosi", Pins("Y21")),
|
||
|
Subsignal("cs_n", Pins("A14")),
|
||
|
Subsignal("miso", Pins("AB21")),
|
||
|
Misc("SLEW=FAST"),
|
||
|
IOStandard("LVCMOS33"),
|
||
|
),
|
||
|
|
||
|
("sdcard", 0,
|
||
|
Subsignal("data", Pins("AB21 AB22 AB20 W21"),),
|
||
|
Subsignal("cmd", Pins("Y21"),),
|
||
|
Subsignal("clk", Pins("Y22")),
|
||
|
Subsignal("cd", Pins("AA19")),
|
||
|
Misc("SLEW=FAST"),
|
||
|
IOStandard("LVCMOS33"),
|
||
|
),
|
||
|
]
|
||
|
# Connectors ---------------------------------------------------------------------------------------
|
||
|
|
||
|
_connectors = [] # ToDo
|
||
|
|
||
|
# Platform -----------------------------------------------------------------------------------------
|
||
|
|
||
|
class Platform(Xilinx7SeriesPlatform):
|
||
|
default_clk_name = "clk50"
|
||
|
default_clk_period = 1e9/50e6
|
||
|
|
||
|
def __init__(self, variant="a7-35", toolchain="vivado"):
|
||
|
device = {
|
||
|
"a7-35": "xc7a35tfgg484-2",
|
||
|
"a7-100": "xc7a100tfgg484-2",
|
||
|
"a7-200": "xc7a200tfbg484-2"
|
||
|
}[variant]
|
||
|
Xilinx7SeriesPlatform.__init__(self, device, _io, _connectors, toolchain=toolchain)
|
||
|
self.toolchain.bitstream_commands = \
|
||
|
["set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]"]
|
||
|
self.toolchain.additional_commands = \
|
||
|
["write_cfgmem -force -format bin -interface spix4 -size 16 "
|
||
|
"-loadbit \"up 0x0 {build_name}.bit\" -file {build_name}.bin"]
|
||
|
self.add_platform_command("set_property INTERNAL_VREF 0.675 [get_iobanks 34]")
|
||
|
|
||
|
def create_programmer(self):
|
||
|
return VivadoProgrammer(flash_part="mt25ql128-spi-x1_x2_x4")
|
||
|
|
||
|
def do_finalize(self, fragment):
|
||
|
Xilinx7SeriesPlatform.do_finalize(self, fragment)
|
||
|
self.add_period_constraint(self.lookup_request("clk50", loose=True), 1e9/50e6)
|