re-bba-rb/re-bba/ReBba/amaranth_boards/alchitry_au.py

77 lines
3.0 KiB
Python
Raw Normal View History

2022-01-07 23:15:38 +01:00
import os
import subprocess
import shutil
from amaranth.build import *
from amaranth.vendor.xilinx_7series import *
from .resources import *
__all__ = ["AlchitryAuPlatform"]
def find_loader():
loader_prgm = os.environ.get("ALCHITRY_LOADER", shutil.which("loader"))
if loader_prgm is None:
raise EnvironmentError("Could not find Alchrity Loader. Place "
"it directly in PATH or specify path explicitly via the "
"ALCHITRY_LOADER environment variable")
bridge_bin = os.environ.get("ALCHITRY_BRIDGE_BIN", os.path.join(os.path.dirname(loader_prgm), "au_loader.bin"))
return (loader_prgm, bridge_bin)
class AlchitryAuPlatform(Xilinx7SeriesPlatform):
device = "XC7A35T" # Artix 7 33K LEs
package = "FTG256"
speed = "1"
default_clk = "clk100"
resources = [
Resource("clk100", 0, Pins("N14", dir="i"),
Clock(10e7), Attrs(IOSTANDARD="LVCMOS33")),
# On-Board LED Array
*LEDResources(
pins="K13 K12 L14 L13 M16 M14 M12 N16",
attrs=Attrs(IOSTANDARD="LVCMOS33")),
Resource("usb", 0,
Subsignal("usb_tx", Pins("P16", dir="o")),
Subsignal("usb_rx", Pins("P15", dir="i")),
Attrs(IOSTANDARD="LVCMOS33")
),
# TODO: This is untested
DDR3Resource(0,
rst_n="D13", clk_p="G14", clk_n="F14", clk_en="D15", cs_n="D16", we_n="E11", ras_n="D14", cas_n="D14",
a="F12 G16 G15 E16 H11 G12 H16 H12 H16 H13 E12 H14 F13 J15",
ba="E13 F15 E15",
dqs_p="B15 A15", dqs_n="B9 A10",
dq="A13 B16 B14 C11 C13 C16 C12 C14 D8 B11 C8 B10 A12 A8 B12 A9",
dm="A14 C9", odt="G11",
diff_attrs=Attrs(IOSTANDARD="LVDS"),
attrs=Attrs(IOSTANDARD="LVCMOS15")),
]
connectors = [
Connector("bank", 0, "T8 T7 T5 R5 R8 P8 L2 L3 J1 K1 H1 H2 G1 G2 K5 E6 "
"T10 T9 R6 R7 P9 N9 K2 K3 J4 J5 H3 J3 H4 H5 N6 M6 "),
Connector("bank", 1, "D1 E2 A2 B2 E1 F2 F3 F4 A3 B4 A4 A5 B5 B6 A7 B7 "
"B1 C1 C2 C3 D3 E3 C4 D4 G4 G5 E5 F5 D5 D6 C6 C7 "),
Connector("bank", 2, "T13 R13 T12 R12 R11 R10 N2 N3 P3 P4 M4 L4 N4 M5 L5 P5 "
"P11 P10 N12 N11 P13 N13 M1 M2 P1 N1 R1 R2 T2 R3 T3 T4 "),
Connector("bank", 3, "L14 L13 M12 N16 R16 R15 P14 M15 P16 P15 - - - - - - "
"K13 K12 M16 M14 T16 T14 N14 - - - - - - - - - ")
]
def toolchain_program(self, products, name):
(loader, bridge_bin) = find_loader()
with products.extract("{}.bin".format(name)) as bitstream_filename:
subprocess.check_call([loader, "-e", "-f", bitstream_filename,
"-p", bridge_bin
])
if __name__ == "__main__":
from .test.blinky import Blinky
AlchitryAuPlatform().build(Blinky(), do_program=True)