Пример #1
0
    def connect_mainboard(self):
        self.add_connectors([
            Connector(
                "plugin",
                "south",
                gen_plugin_connector(lvds=[
                    "94 96", "95 93", "97 99", "87 89", "81 83", "73 75"
                ]),
                conn=("expansion", 1),
            ),
            Connector(
                "plugin",
                "north",
                gen_plugin_connector(lvds=[
                    "68 70", "74 76", "82 84", "94 92", "93 91", "89 87"
                ]),
                conn=("expansion", 0),
            ),
        ])

        # TODO: add ext & shield connectors (but how?)
        # best would be a way to (transpranetly) handle the routing fabrics
        self.add_resources([
            Resource("routing", 'east',
                     DiffPairs('29', '31', dir='io', conn=("expansion", 1)),
                     Attrs(IOSTANDARD="LVCMOS33")),
            Resource("routing", 'west',
                     Pins("56", dir='o', conn=("expansion", 0)),
                     Attrs(IOSTANDARD="LVCMOS33")),
        ])
Пример #2
0
    def __init__(self):
        super().__init__()
        self.add_resources([
            Resource("sensor", 0,
                     Subsignal("shutter", Pins("25", dir='o', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     Subsignal("trigger", Pins("27", dir='o', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     Subsignal("reset", PinsN("31", dir='o', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     Subsignal("clk", Pins("33", dir='o', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     Subsignal("lvds_clk", DiffPairs("51", "53", dir='i', conn=("expansion", 0)), Attrs(IOSTANDARD="DIFF_SSTL18_I", IN_TERM="UNTUNED_SPLIT_50")),
                     Subsignal("lvds", DiffPairsN("41 45 55 65", "43 47 57 67", dir='i', conn=("expansion", 0)), Attrs(IOSTANDARD="DIFF_SSTL18_I", IN_TERM="UNTUNED_SPLIT_50")),
                     ),
            Resource("i2c", 0,
                     Subsignal("scl", Pins("35", dir='io', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     Subsignal("sda", Pins("37", dir='io', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
                     ),
            Resource("ws2812", 0, Pins("56", dir='o', conn=("expansion", 0)), Attrs(IOSTANDARD="LVCMOS18")),
            Resource("encoder", 0,
                     Subsignal("quadrature", Pins("58 68", dir='i', conn=("expansion", 0))),
                     Subsignal("push", Pins("66", dir='i', conn=("expansion", 0)))
                     ),
        ])

        self.add_connectors([
            Connector("plugin", "south",
                      gen_plugin_connector(
                          lvds=["21 23", "3 5", "9 11", "13 15", "4 6", "10 12"],
                          gpio=[71, 73, 63, 61, 64, 62, 75, 77],
                          i2c=[46, 48]),
                      conn=("expansion", 0),
                      ),

            Connector("plugin", "north",
                      gen_plugin_connector(
                          lvds=["14 16", "22 24", "26 28", "32 34", "36 38", "42 44"],
                          gpio=[76, 78, 80, 84, 86, 88, 90, 74],
                          i2c=[52, 54]),
                      conn=("expansion", 0),
                      ),
            Connector("pmod", "north", "110 106 100 96 - - 108 104 98 94 - -", conn=("expansion", 0), ),
            Connector("pmod", "south", "97 95 89 85 - - 99 93 87 83 - -", conn=("expansion", 0), ),
            Connector("pmod", "east", "103 105 107 109 - -", conn=("expansion", 0), ),
        ])
Пример #3
0
class BlackIceMXPlatform(IceCorePlatform):
    # BlackIce Mx Connectors can be mapped as Dual Pmods
    # or MixMods (quad Pmods with MiXed signals in between)
    # https://raw.githubusercontent.com/folknology/BlackIceMx/master/blackicemx.svg.png
    connectors = [
        # Double Pmod pin mapping
        Connector("pmod", 0, PMOD1 + PMOD2),  # PMOD1/2
        Connector("pmod", 1, PMOD3 + PMOD4),  # PMOD3/4
        Connector("pmod", 2, PMOD5 + PMOD6),  # PMOD5/6
        Connector("pmod", 3, PMOD7 + PMOD8),  # PMOD7/8
        Connector("pmod", 4, PMOD9 + PMOD10),  # PMOD9/10
        Connector("pmod", 5, PMOD11 + PMOD12),  # PMOD11/12
        # MixMod pin mapping
        Connector("mixmod", 0,
                  PMOD1 + MXPINS + PMOD3 + PMOD2 + MXPINS + PMOD4),  # MX1
        Connector("mixmod", 1,
                  PMOD5 + MXPINS + PMOD7 + PMOD6 + MXPINS + PMOD8),  # MX2
        Connector("mixmod", 2,
                  PMOD9 + MXPINS + PMOD11 + PMOD10 + MXPINS + PMOD12)  # MX3
    ]
Пример #4
0
def add_plugin_connector(platform, number, conn=None, lvds=None, gpio=None, i2c=None):
    if not hasattr(platform, "inverts"):
        platform.inverts = {}

    mapping = {}

    if lvds is None:
        lvds = []
    for i, l in enumerate(lvds):
        splited = l.split()
        if len(splited) == 3:
            p, n = splited[0], splited[2]
            invert = True
        elif len(splited) == 2:
            p, n = splited
            invert = False
        else:
            raise ValueError()

        platform.inverts["plugin_{}:lvds{}_p".format(number, i)] = invert
        mapping["lvds{}_p".format(i)] = "{}".format(p)
        mapping["lvds{}_n".format(i)] = "{}".format(n)

    if gpio is None:
        gpio = []
    for i, g in enumerate(gpio):
        mapping["gpio{}".format(i)] = "{}".format(g)

    if i2c is not None:
        scl, sda = i2c

        mapping["i2c_scl"] = "{}".format(scl)
        mapping["i2c_sda"] = "{}".format(sda)

    platform.add_connectors([
        Connector(
            "plugin", number,
            mapping,
            conn=conn,
        ),
    ])
Пример #5
0
class TinyFPGABxPlatform(LatticeICE40Platform, LUNAPlatform):
    device = "iCE40LP8K"
    package = "CM81"
    default_clk = "clk16"
    name = "TinyFPGA Bx"

    # Provide the type that'll be used to create our clock domains.
    clock_domain_generator = TinyFPGABxDomainGenerator

    # We only have a direct connection on our USB lines, so use that for USB comms.
    default_usb_connection = "usb"

    resources = [
        Resource("clk16", 0, Pins("B2", dir="i"), Clock(16e6),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("led", 0, Pins("B3"), Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("usb", 0, Subsignal("d_p", Pins("B4", dir="io")),
                 Subsignal("d_n", Pins("A4", dir="io")),
                 Subsignal("pullup", Pins("A3", dir="o")),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
    ]
    connectors = [
        Connector(
            "gpio",
            0,
            # Left side of the board
            #     1  2  3  4  5  6  7  8  9 10 11 12 13
            "   A2 A1 B1 C2 C1 D2 D1 E2 E1 G2 H1 J1 H2 "
            # Right side of the board
            #          14 15 16 17 18 19 20 21 22 23 24
            "         H9 D9 D8 C9 A9 B8 A8 B7 A7 B6 A6 "
            # Bottom of the board
            # 25 26 27 28 29 30 31
            "G1 J3 J4 G9 J9 E8 J2"),
    ]

    def toolchain_program(self, products, name):
        tinyprog = os.environ.get("TINYPROG", "tinyprog")
        with products.extract("{}.bin".format(name)) as bitstream_filename:
            subprocess.check_call([tinyprog, "-p", bitstream_filename])
Пример #6
0
class ECPIX5PlatformRev02(LatticeECP5Platform, LUNAPlatform):
    name = "ECPIX-5 R02"

    device = "LFE5UM5G-85F"
    package = "BG554"
    speed = "8"

    default_clk = "clk100"
    default_rst = "rst"

    # Provide the type that'll be used to create our clock domains.
    clock_domain_generator = StubClockDomainGenerator

    # We only have a single PHY; so use it directly.
    default_usb_connection = "ulpi"

    resources = [
        Resource("rst", 0, PinsN("AB1", dir="i"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("clk100", 0, Pins("K23", dir="i"), Clock(100e6),
                 Attrs(IO_TYPE="LVCMOS33")),

        # LEDs
        Resource(
            "rgb_led",
            0,
            Subsignal("r", Pins("U21")),
            Subsignal("g", Pins("W21")),
            Subsignal("b", Pins("T24")),
            Attrs(IO_TYPE="LVCMOS33"),
        ),
        Resource(
            "rgb_led",
            1,
            Subsignal("r", Pins("T23")),
            Subsignal("g", Pins("R21")),
            Subsignal("b", Pins("T22")),
            Attrs(IO_TYPE="LVCMOS33"),
        ),
        Resource(
            "rgb_led",
            2,
            Subsignal("r", Pins("P21")),
            Subsignal("g", Pins("R23")),
            Subsignal("b", Pins("P22")),
            Attrs(IO_TYPE="LVCMOS33"),
        ),
        Resource(
            "rgb_led",
            3,
            Subsignal("r", Pins("K21")),
            Subsignal("g", Pins("K24")),
            Subsignal("b", Pins("M21")),
            Attrs(IO_TYPE="LVCMOS33"),
        ),
        Resource("uart", 0, Subsignal("rx", Pins("R26", dir="i")),
                 Subsignal("tx", Pins("R24", dir="o")),
                 Attrs(IO_TYPE="LVCMOS33", PULLMODE="UP")),
        Resource("eth_rgmii", 0, Subsignal("rst", PinsN("C13", dir="o")),
                 Subsignal("mdio", Pins("A13", dir="io")),
                 Subsignal("mdc", Pins("C11", dir="o")),
                 Subsignal("tx_clk", Pins("A12", dir="o")),
                 Subsignal("tx_ctrl", Pins("C9", dir="o")),
                 Subsignal("tx_data", Pins("D8 C8 B8 A8", dir="o")),
                 Subsignal("rx_clk", Pins("E11", dir="i")),
                 Subsignal("rx_ctrl", Pins("A11", dir="i")),
                 Subsignal("rx_data", Pins("B11 A10 B10 A9", dir="i")),
                 Attrs(IO_TYPE="LVCMOS33")),
        Resource("eth_int", 0, PinsN("B13", dir="i"),
                 Attrs(IO_TYPE="LVCMOS33")),
        Resource(
            "ddr3", 0,
            Subsignal("clk", DiffPairs("H3", "J3", dir="o"),
                      Attrs(IO_TYPE="SSTL135D_I")),
            Subsignal("clk_en", Pins("P1", dir="o")),
            Subsignal("we", PinsN("R3", dir="o")),
            Subsignal("ras", PinsN("T3", dir="o")),
            Subsignal("cas", PinsN("P2", dir="o")),
            Subsignal(
                "a",
                Pins("T5 M3 L3 V6 K2 W6 K3 L1 H2 L2 N1 J1 M1 K1", dir="o")),
            Subsignal("ba", Pins("U6 N3 N4", dir="o")),
            Subsignal("dqs", DiffPairs("V4 V1", "U5 U2", dir="io"),
                      Attrs(IO_TYPE="SSTL135D_I")),
            Subsignal(
                "dq",
                Pins("T4 W4 R4 W5 R6 P6 P5 P4 R1 W3 T2 V3 U3 W1 T1 W2",
                     dir="io")), Subsignal("dm", Pins("J4 H5", dir="o")),
            Subsignal("odt", Pins("L2", dir="o")), Attrs(IO_TYPE="SSTL135_I")),
        Resource(
            "hdmi", 0, Subsignal("rst", PinsN("N6", dir="o")),
            Subsignal("scl", Pins("C17", dir="io")),
            Subsignal("sda", Pins("E17", dir="io")),
            Subsignal("pclk", Pins("C1", dir="o")),
            Subsignal("vsync", Pins("A4", dir="o")),
            Subsignal("hsync", Pins("B4", dir="o")),
            Subsignal("de", Pins("A3", dir="o")),
            Subsignal(
                "d",
                Subsignal(
                    "b",
                    Pins("AD25 AC26 AB24 AB25  B3  C3  D3  B1  C2  D2 D1 E3",
                         dir="o")),
                Subsignal(
                    "g",
                    Pins("AA23 AA22 AA24 AA25  E1  F2  F1 D17 D16 E16 J6 H6",
                         dir="o")),
                Subsignal(
                    "r",
                    Pins("AD26 AE25 AF25 AE26 E10 D11 D10 C10  D9  E8 H5 J4",
                         dir="o")),
            ), Subsignal("mclk", Pins("E19", dir="o")),
            Subsignal("sck", Pins("D6", dir="o")),
            Subsignal("ws", Pins("C6", dir="o")),
            Subsignal("i2s", Pins("A6 B6 A5 C5", dir="o")),
            Subsignal("int", PinsN("C4", dir="i")), Attrs(IO_TYPE="LVTTL33")),
        Resource("sata", 0, Subsignal("tx", DiffPairs("AD16", "AD17",
                                                      dir="o")),
                 Subsignal("rx", DiffPairs("AF15", "AF16", dir="i")),
                 Attrs(IO_TYPE="LVDS")),
        ULPIResource("ulpi",
                     data_sites="M26 L25 L26 K25 K26 J23 P25 H25",
                     clk_site="H24",
                     dir_site="F22",
                     stp_site="H23",
                     nxt_site="F23",
                     reset_site="E23",
                     attrs=Attrs(IO_TYPE="LVCMOS33")),
        Resource("usbc_cfg", 0, Subsignal("scl", Pins("D24", dir="io")),
                 Subsignal("sda", Pins("C24", dir="io")),
                 Subsignal("dir", Pins("B23", dir="i")),
                 Subsignal("id", Pins("D23", dir="i")),
                 Subsignal("int", PinsN("B24", dir="i")),
                 Attrs(IO_TYPE="LVCMOS33")),
        Resource(
            "usbc_mux",
            0,
            Subsignal("en", Pins("C23", dir="oe")),
            Subsignal("amsel", Pins("B26", dir="oe")),
            Subsignal("pol", Pins("D26", dir="o")),
            #Subsignal("lna",   DiffPairs( "AF9", "AF10", dir="i"), Attrs(IO_TYPE="LVCMOS18D")),
            #Subsignal("lnb",   DiffPairs("AD10", "AD11", dir="o"), Attrs(IO_TYPE="LVCMOS18D")),
            #Subsignal("lnc",   DiffPairs( "AD7",  "AD8", dir="o"), Attrs(IO_TYPE="LVCMOS18D")),
            #Subsignal("lnd",   DiffPairs( "AF6",  "AF7", dir="i"), Attrs(IO_TYPE="LVCMOS18D")),
            Attrs(IO_TYPE="LVCMOS33")),

        # Compatibility aliases.
        Resource("led", 0, Pins("W21", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led", 1, Pins("R21", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led", 2, Pins("R23", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led", 3, Pins("K24", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("user_io", 0, Pins("T25")),
        Resource("user_io", 1, Pins("U25")),
        Resource("user_io", 2, Pins("U24")),
        Resource("user_io", 3, Pins("V24")),
    ]

    connectors = [
        Connector("pmod", 0, "T25 U25 U24 V24 - - T26 U26 V26 W26 - -"),
        Connector("pmod", 1, "U23 V23 U22 V21 - - W25 W24 W23 W22 - -"),
        Connector("pmod", 2, "J24 H22 E21 D18 - - K22 J21 H21 D22 - -"),
        Connector("pmod", 3, " E4  F4  E6  H4 - -  F3  D4  D5  F5 - -"),
        Connector("pmod", 4, "E26 D25 F26 F25 - - A25 A24 C26 C25 - -"),
        Connector("pmod", 5, "D19 C21 B21 C22 - - D21 A21 A22 A23 - -"),
        Connector("pmod", 6, "C16 B17 C18 B19 - - A17 A18 A19 C19 - -"),
        Connector("pmod", 7, "D14 B14 E14 B16 - - C14 A14 A15 A16 - -"),
    ]

    @property
    def file_templates(self):
        return {
            **super().file_templates, "{{name}}-openocd.cfg":
            r"""
            interface ftdi
            ftdi_vid_pid 0x0403 0x6010
            ftdi_channel 0
            ftdi_layout_init 0xfff8 0xfffb
            reset_config none
            adapter_khz 25000
            jtag newtap ecp5 tap -irlen 8 -expected-id 0x81113043
            """
        }

    def toolchain_program(self, products, name):
        openocd = os.environ.get("OPENOCD", "openocd")
        with products.extract("{}-openocd.cfg".format(name), "{}.svf".format(name)) \
                as (config_filename, vector_filename):
            subprocess.check_call([
                openocd, "-f", config_filename, "-c",
                "transport select jtag; init; svf -quiet {}; exit".format(
                    vector_filename)
            ])
Пример #7
0
class DaishoPlatform(IntelPlatform):
    """ Board description for Daisho boards."""

    name        = "Daisho"
    device      = "EEP4CE30F29C8"


    default_clk = "clk_60MHz"

    #
    # Default clock frequencies for each of our clock domains.
    #
    # Different revisions have different FPGA speed grades, and thus the
    # default frequencies will vary.
    #
    DEFAULT_CLOCK_FREQUENCIES_MHZ = {
        "fast": 120,
        "sync": 60,
        "ulpi": 60
    }

    #
    # Preferred DRAM bus I/O (de)-skewing constants.
    #
    ram_timings = dict(
        clock_skew = 64
    )

    # Provides any platform-specific ULPI registers necessary.
    # This is the spot to put any platform-specific vendor registers that need
    # to be written.
    ulpi_extra_registers = {
        0x39: 0b000110 # USB3343: swap D+ and D- to match the LUNA boards
    }



    #
    # I/O resources.
    #
    resources   = [

        # Primary, discrete 60MHz oscillator.
        Resource("clk_60MHz", 0, Pins("A8", dir="i"),
            Clock(60e6), Attrs(IO_TYPE="LVCMOS33")),

        # Connection to our SPI flash; can be used to work with the flash
        # from e.g. a bootloader.
        Resource("spi_flash", 0,

            # SCK is on pin 9; but doesn't have a traditional I/O buffer.
            # Instead, we'll need to drive a clock into a USRMCLK instance.
            # See interfaces/flash.py for more information.
            Subsignal("sdi",  Pins("T8",  dir="o")),
            Subsignal("sdo",  Pins("T7",  dir="i")),

            # In r0.1, the chip select line can either be driven by the FPGA
            # or by the Debug Controller. Accordingly, we'll mark the line as
            # bidirectional, and let the user decide.
            Subsignal("cs",   PinsN("N8", dir="io")),
            Attrs(IO_TYPE="LVCMOS33")
        ),

        #
        # Note: r0.1 has a DFM issue that makes it difficult to solder a BGA with
        # reliable connections on the intended SCK pin (P12), and lacks a CS pin on the
        # debug SPI; which seems like a silly omission.
        #
        # Accordingly, we're mapping the debug SPI and UART over the same pins, as the
        # microcontroller can use either.
        #

        # UART connected to the debug controller; can be routed to a host via CDC-ACM.
        Resource("uart", 0,
            Subsignal("rx",   Pins("R14", dir="i")),
            Subsignal("tx",   Pins("T14", dir="o")),
            Attrs(IO_TYPE="LVCMOS33")
        ),


        # SPI bus connected to the debug controller, for simple register exchanges.
        # Note that the Debug Controller is the master on this bus.
        Resource("debug_spi", 0,
            Subsignal("sck",  Pins( "R14", dir="i")),
            Subsignal("sdi",  Pins( "P13", dir="i")),
            Subsignal("sdo",  Pins( "P11", dir="o")),
            Subsignal("cs",   PinsN("T14", dir="i")),
            Attrs(IO_TYPE="LVCMOS33")
        ),

        # FPGA-connected LEDs.
        Resource("led",  5, PinsN("P15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  4, PinsN("N16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  3, PinsN("M15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  2, PinsN("M16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  1, PinsN("L15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  0, PinsN("L16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),

        # USB PHYs
        ULPIResource("sideband_phy",
            data_sites="R2 R1 P2 P1 N1 M2 M1 L2", clk_site="R4",
            dir_site="T3", nxt_site="T2", stp_site="T4", reset_site="R3"),
        ULPIResource("host_phy",
            data_sites="G2 G1 F2 F1 E1 D1 C1 B1", clk_site="K2",
            dir_site="J1", nxt_site="H2", stp_site="J2", reset_site="K1"),
        ULPIResource("target_phy",
            data_sites="D16 E15 E16 F15 F16 G15 J16 K16", clk_site="B15",
            dir_site="C15", nxt_site="C16", stp_site="B16", reset_site="G16"),

        # Target port power switching
        # Note: the r0.1 boards that have been produced incorrectly use the AP22814B
        # instead of the AP22814A. This inverts the load-switch enables.
        #
        Resource("power_a_port",       0, PinsN("C14", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("pass_through_vbus",  0, PinsN("D14", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("target_vbus_fault",  0, Pins("K15", dir="i"), Attrs(IO_TYPE="LVCMOS33")),

        # HyperRAM (1V8 domain).
        Resource("ram", 0,
            # Note: our clock uses the pseudo-differential I/O present on the top tiles.
            # This requires a recent version of trellis+nextpnr. If your build complains
            # that LVCMOS18D is an invalid I/O type, you'll need to upgrade.
            Subsignal("clk",   DiffPairs("B14", "A15", dir="o"), Attrs(IO_TYPE="LVCMOS18D")),
            Subsignal("dq",    Pins("A11 B10 B12 A12 B11 A10 B9 A9", dir="io")),
            Subsignal("rwds",  Pins( "A13", dir="io")),
            Subsignal("cs",    PinsN("A14", dir="o")),
            Subsignal("reset", PinsN("B13", dir="o")),
            Attrs(IO_TYPE="LVCMOS18", SLEWRATE="FAST")
        ),

        # User I/O connections.
        Resource("user_io", 0, Pins("A5", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 1, Pins("A4", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 2, Pins("A3", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 3, Pins("A2", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
    ]

    connectors = [

        # User I/O connector.
        Connector("user_io", 0, """
            A5  -  A2
            A4  -  A3
        """)

    ]

    def toolchain_prepare(self, fragment, name, **kwargs):
        overrides = {
            'ecppack_opts': '--compress --idcode {} --freq 38.8'.format(0x21111043)
        }

        return super().toolchain_prepare(fragment, name, **overrides, **kwargs)


    def toolchain_program(self, products, name):
        """ Programs the relevant LUNA board via its sideband connection. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.ecp5 import ECP5_JTAGProgrammer

        # Create our connection to the debug module.
        debugger = ApolloDebugger()

        # Grab our generated bitstream, and upload it to the FPGA.
        bitstream =  products.get("{}.bit".format(name))
        with debugger.jtag as jtag:
            programmer = ECP5_JTAGProgrammer(jtag)
            programmer.configure(bitstream)


    def toolchain_flash(self, products, name="top"):
        """ Programs the LUNA board's flash via its sideband connection. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.flash import ensure_flash_gateware_loaded

        # Create our connection to the debug module.
        debugger = ApolloDebugger()
        ensure_flash_gateware_loaded(debugger, platform=self.__class__())

        # Grab our generated bitstream, and upload it to the .
        bitstream =  products.get("{}.bit".format(name))
        with debugger.flash as flash:
            flash.program(bitstream)

        debugger.soft_reset()


    def toolchain_erase(self):
        """ Erases the LUNA board's flash. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.flash import ensure_flash_gateware_loaded

        # Create our connection to the debug module.
        debugger = ApolloDebugger()
        ensure_flash_gateware_loaded(debugger, platform=self.__class__())

        with debugger.flash as flash:
            flash.erase()

        debugger.soft_reset()
Пример #8
0
class OrangeCrabR0D2(OrangeCrabPlatform, LUNAPlatform):
    """ Board description for OrangeCrab r0.2. """

    name = "OrangeCrab r0.2"

    #
    # I/O resources.
    #
    resources = [

        # System clock.
        Resource("clk_48MHz", 0, Pins("A9"), Attrs(IO_TYPE="LVCMOS33"),
                 Clock(48e6)),

        # Self-reset.
        Resource("rst_n", 0, Pins("V17"), Attrs(IO_TYPE="LVCMOS33")),

        # Buttons.
        Resource("user_button", 0, Pins("J17"), Attrs(IO_TYPE="SSTL135_I")),

        # LEDs.
        Resource(
            "rgb_led",
            0,
            Subsignal("r", Pins("K4", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("g", Pins("M3", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("b", Pins("J3", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        ),

        # Create aliases for our LEDs with standard naming.
        Resource("led", 0, Pins("K4", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led", 1, Pins("M3", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led", 2, Pins("J3", dir="o"), Attrs(IO_TYPE="LVCMOS33")),

        # RAM.
        Resource(
            "ddram", 0,
            Subsignal(
                "a", Pins("C4 D2 D3 A3 A4 D4 C3 B2"
                          "B1 D1 A7 C2 B6 C1 A2 C7"),
                Attrs(IO_TYPE="SSTL135_I")),
            Subsignal(
                "ba",
                Pins("D6 B7 A6"),
                Attrs(IO_TYPE="SSTL135_I"),
            ), Subsignal("ras_n", Pins("C12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("cas_n", Pins("D13"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("we_n", Pins("B12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("cs_n", Pins("A12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("dm", Pins("D16 G16"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal(
                "dq",
                Pins("C17 D15 B17 C16 A15 B13 A17 A13"
                     "F17 F16 G15 F15 J16 C18 H16 F18"),
                Attrs(IO_TYPE="SSTL135_I"), Attrs(TERMINATION="75")),
            Subsignal("dqs_p", Pins("B15 G18"), Attrs(IO_TYPE="SSTL135D_I"),
                      Attrs(TERMINATION="OFF"), Attrs(DIFFRESISTOR="100")),
            Subsignal("clk_p", Pins("J18"), Attrs(IO_TYPE="SSTL135D_I")),
            Subsignal("cke", Pins("D18"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("odt", Pins("C13"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("reset_n", Pins("L18"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("vccio", Pins("K16 D17 K15 K17 B18 C6"),
                      Attrs(IO_TYPE="SSTL135_II")),
            Subsignal("gnd", Pins("L15 L16"), Attrs(IO_TYPE="SSTL135_II")),
            Attrs(SLEWRATE="FAST")),

        # USB Connector.
        Resource("usb", 0, Subsignal("d_p", Pins("N1", dir="io")),
                 Subsignal("d_n", Pins("M2", dir="io")),
                 Subsignal("pullup", Pins("N2", dir="o")),
                 Attrs(IO_TYPE="LVCMOS33")),

        # Onboard flash.
        Resource(
            "spiflash4x",
            0,
            Subsignal("cs_n", Pins("U17"), Attrs(IO_TYPE="LVCMOS33")),
            #Subsignal("clk",  Pins("U16"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("dq", Pins("U18 T18 R18 N18"),
                      Attrs(IO_TYPE="LVCMOS33")),
        ),
        Resource(
            "spiflash",
            0,
            Subsignal("cs_n", Pins("U17"), Attrs(IO_TYPE="LVCMOS33")),
            #Subsignal("clk",  Pins("U16"), Attrs(IO_TYPE="LVCMOS33")), # Note: CLK is bound using USRMCLK block
            Subsignal("miso", Pins("T18"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("mosi", Pins("U18"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("wp", Pins("R18"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("hold", Pins("N18"), Attrs(IO_TYPE="LVCMOS33")),
        ),

        # SD Card.
        Resource(
            "spisdcard",
            0,
            Subsignal("clk", Pins("K1")),
            Subsignal("mosi", Pins("K2"), Attrs(PULLMODE="UP")),
            Subsignal("cs_n", Pins("M1"), Attrs(PULLMODE="UP")),
            Subsignal("miso", Pins("J1"), Attrs(PULLMODE="UP")),
            Attrs(SLEW="FAST"),
            Attrs(IO_TYPE="LVCMOS33"),
        ),

        # User I/O
        Resource("user_io", 0, Pins("N17")),
        Resource("user_io", 1, Pins("M18")),
        Resource("user_io", 2, Pins("C10")),
        Resource("user_io", 3, Pins("C9")),
        # 4
        Resource("user_io", 5, Pins("B10")),
        Resource("user_io", 6, Pins("B9")),
        # 7
        # 8
        Resource("user_io", 9, Pins("C8")),
        Resource("user_io", 10, Pins("B8")),
        Resource("user_io", 11, Pins("A8")),
        Resource("user_io", 12, Pins("H2")),
        Resource("user_io", 13, Pins("J2")),
        Resource("user_io", 14, Pins("N15")),
        Resource("user_io", 15, Pins("R17")),
        Resource("user_io", 16, Pins("N16")),
        # 17
        Resource("user_io", 18, Pins("L4")),
        Resource("user_io", 19, Pins("N3")),
        Resource("user_io", 20, Pins("N4")),
        Resource("user_io", 21, Pins("H4")),
        Resource("user_io", 22, Pins("G4")),
        Resource("user_io", 23, Pins("T17")),
    ]

    connectors = [
        Connector(
            "GPIO", 0,
            "N17 M18 C10 C9 - B10 B9 - - C8 B8 A8 H2 J2 N15 R17 N16 - L4 N3 N4 H4 G4 T17"
        )
    ]
Пример #9
0
class OrangeCrabR0D1(OrangeCrabPlatform, LUNAPlatform):
    """ Board description for OrangeCrab r0.1. """

    name = "OrangeCrab r0.1"

    #
    # I/O resources.
    #
    resources = [
        Resource("clk_48MHz", 0, Pins("A9"), Attrs(IO_TYPE="LVCMOS33"),
                 Clock(48e6)),
        Resource(
            "rgb_led",
            0,
            Subsignal("r", Pins("V17"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("g", Pins("T17"), Attrs(IO_TYPE="LVCMOS33")),
            Subsignal("b", Pins("J3"), Attrs(IO_TYPE="LVCMOS33")),
        ),
        Resource(
            "ddram", 0,
            Subsignal("a", Pins("A4 D2 C3 C7 D3 D4 D1 B2 C1 A2 A7 C2 C4"),
                      Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("ba", Pins("B6 B7 A6"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("ras_n", Pins("C12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("cas_n", Pins("D13"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("we_n", Pins("B12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("cs_n", Pins("A12"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("dm", Pins("D16 G16"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal(
                "dq",
                Pins(
                    "C17 D15 B17 C16 A15 B13 A17 A13 F17 F16 G15 F15 J16 C18 H16 F18"
                ), Attrs(IO_TYPE="SSTL135_I", TERMINATION="75")),
            Subsignal(
                "dqs_p", Pins("B15 G18"),
                Attrs(IO_TYPE="SSTL135D_I",
                      TERMINATION="OFF",
                      DIFFRESISTOR="100")),
            Subsignal("clk_p", Pins("J18"), Attrs(IO_TYPE="SSTL135D_I")),
            Subsignal("cke", Pins("D6"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("odt", Pins("C13"), Attrs(IO_TYPE="SSTL135_I")),
            Subsignal("reset_n", Pins("B1"), Attrs(IO_TYPE="SSTL135_I")),
            Attrs(SLEWRATE="FAST")),
        Resource("spiflash4x", 0, Subsignal("cs_n", Pins("U17")),
                 Subsignal("clk", Pins("U16")),
                 Subsignal("dq", Pins("U18 T18 R18 N18")),
                 Attrs(IO_TYPE="LVCMOS33")),
        Resource("spi-internal", 0,
                 Subsignal("cs_n", Pins("B11"), Attrs(PULLMODE="UP")),
                 Subsignal("clk", Pins("C11")),
                 Subsignal("miso", Pins("A11"), Attrs(PULLMODE="UP")),
                 Subsignal("mosi", Pins("A10"), Attrs(PULLMODE="UP")),
                 Attrs(IO_TYPE="LVCMOS33", SLEWRATE="SLOW")),
        Resource(
            "spisdcard",
            0,
            Subsignal("clk", Pins("K1")),
            Subsignal("mosi", Pins("K2"), Attrs(PULLMODE="UP")),
            Subsignal("cs_n", Pins("M1"), Attrs(PULLMODE="UP")),
            Subsignal("miso", Pins("J1"), Attrs(PULLMODE="UP")),
            Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST"),
        ),

        # USB Connector.
        Resource("usb", 0, Subsignal("d_p", Pins("N1", dir="io")),
                 Subsignal("d_n", Pins("M2", dir="io")),
                 Subsignal("pullup", Pins("N2", dir="o")),
                 Attrs(IO_TYPE="LVCMOS33")),
    ]

    connectors = [
        Connector(
            "GPIO", 0,
            "N17 M18 C10 C9 - B10 B9 - - C8 B8 A8 H2 J2 N15 R17 N16 - - - - - - - -"
        )
    ]
Пример #10
0
class Basys3Platform(Xilinx7SeriesPlatform):
    device = "xc7a35t"
    package = "cpg236"

    speed = "1"

    default_clk = "CLK100"

    # J connectors are layed out looking at the connector head-on [6-1],[12-7]
    # J[A(0), B(1), C(2), XADC(3)]
    connectors = [

        # JA
        Connector("J", 0, " - - G2 J2 L2 J1 "
                  " - - G3 H2 K2 H1 "),

        # JB
        Connector("J", 1, " - - B16 B15 A16 A14 "
                  " - - C16 C15 A17 A15 "),

        # JC
        Connector("J", 2, " - - P18 N17 M18 K17 "
                  " - - R18 P17 M19 L17 "),

        # JXADC
        Connector("J", 3, " - - N2 M2 L3 J3 "
                  " - - N1 M1 M3 K3 "),
    ]

    resources = [

        # Integrated 100MHz clock
        Resource("CLK100", 0, Pins("W5", dir="i"), Clock(100e6),
                 Attrs(IOSTANDARD="LVCMOS33")),

        # Onboard LEDs: LD[0-15]
        Resource("LD", 0, Pins("U16", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 1, Pins("E19", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 2, Pins("U19", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 3, Pins("V19", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 4, Pins("W18", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 5, Pins("U15", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 6, Pins("U14", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 7, Pins("V14", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 8, Pins("V13", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 9, Pins("V3", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 10, Pins("W3", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 11, Pins("U3", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 12, Pins("P3", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 13, Pins("N3", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 14, Pins("P1", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("LD", 15, Pins("L1", dir="o"), Attrs(IOSTANDARD="LVCMOS33")),

        # Onboard switches: SW[0-15]
        Resource("SW", 0, Pins("V17", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 1, Pins("V16", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 2, Pins("W16", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 3, Pins("W17", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 4, Pins("W15", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 5, Pins("V15", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 6, Pins("W14", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 7, Pins("W13", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 8, Pins("V2", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 9, Pins("T3", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 10, Pins("T2", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 11, Pins("R3", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 12, Pins("W2", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 13, Pins("U1", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 14, Pins("T1", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("SW", 15, Pins("R2", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),

        # Onboard buttons: BTN[L(0),R(1),U(2),D(3),C(4)]
        Resource("BTN", 0, Pins("W19", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("BTN", 1, Pins("T17", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("BTN", 2, Pins("T18", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("BTN", 3, Pins("U17", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),
        Resource("BTN", 4, Pins("U18", dir="i"), Attrs(IOSTANDARD="LVCMOS33")),

        # 7seg anode/cathodes: AN[0-3] C[A(0),B(1),C(2),D(3),E(4),F(5),G(6),P(7)]
        Resource("7SEG", 0, Subsignal("AN0", Pins("U2", dir="o")),
                 Subsignal("AN1", Pins("U4", dir="o")),
                 Subsignal("AN2", Pins("V4", dir="o")),
                 Subsignal("AN3", Pins("W4", dir="o")),
                 Subsignal("CA", PinsN("W7", dir="o")),
                 Subsignal("CB", PinsN("W6", dir="o")),
                 Subsignal("CC", PinsN("U8", dir="o")),
                 Subsignal("CD", PinsN("V8", dir="o")),
                 Subsignal("CE", PinsN("U5", dir="o")),
                 Subsignal("CF", PinsN("V5", dir="o")),
                 Subsignal("CG", PinsN("U7", dir="o")),
                 Subsignal("CP", PinsN("V7", dir="o")),
                 Attrs(IOSTANDARD="LVCMOS33")),

        # VGA port
        Resource("VGA", 0, Subsignal("RED0", Pins("G19", dir="o")),
                 Subsignal("RED1", Pins("H19", dir="o")),
                 Subsignal("RED2", Pins("J19", dir="o")),
                 Subsignal("RED3", Pins("N19", dir="o")),
                 Subsignal("GRN0", Pins("J17", dir="o")),
                 Subsignal("GRN1", Pins("H17", dir="o")),
                 Subsignal("GRN2", Pins("G17", dir="o")),
                 Subsignal("GRN3", Pins("D17", dir="o")),
                 Subsignal("BLU0", Pins("N18", dir="o")),
                 Subsignal("BLU1", Pins("L18", dir="o")),
                 Subsignal("BLU2", Pins("K18", dir="o")),
                 Subsignal("BLU3", Pins("J18", dir="o")),
                 Subsignal("HSYNC", Pins("P19", dir="o")),
                 Subsignal("VSYNC", Pins("R19", dir="o")),
                 Attrs(IOSTANDARD="LVCMOS33")),

        # JA GPIO
        Resource("JA", 0, Subsignal("P1", Pins("J1")),
                 Subsignal("P2", Pins("L2")), Subsignal("P3", Pins("J2")),
                 Subsignal("P4", Pins("G2")), Subsignal("P7", Pins("H1")),
                 Subsignal("P8", Pins("K2")), Subsignal("P9", Pins("H2")),
                 Subsignal("P10", Pins("G3")), Attrs(IOSTANDARD="LVCMOS33")),

        # JB GPIO
        Resource("JB", 0, Subsignal("P1", Pins("A14")),
                 Subsignal("P2", Pins("A16")), Subsignal("P3", Pins("B15")),
                 Subsignal("P4", Pins("B16")), Subsignal("P7", Pins("A15")),
                 Subsignal("P8", Pins("A17")), Subsignal("P9", Pins("C15")),
                 Subsignal("P10", Pins("C16")), Attrs(IOSTANDARD="LVCMOS33")),

        # JC GPIO
        Resource("JC", 0, Subsignal("P1", Pins("K17")),
                 Subsignal("P2", Pins("M18")), Subsignal("P3", Pins("N17")),
                 Subsignal("P4", Pins("P18")), Subsignal("P7", Pins("L17")),
                 Subsignal("P8", Pins("M19")), Subsignal("P9", Pins("P17")),
                 Subsignal("P10", Pins("R18")), Attrs(IOSTANDARD="LVCMOS33")),

        # JXADC GPIO
        Resource("JXADC", 0, Subsignal("P1", Pins("J3")),
                 Subsignal("P2", Pins("L3")), Subsignal("P3", Pins("M2")),
                 Subsignal("P4", Pins("N2")), Subsignal("P7", Pins("K3")),
                 Subsignal("P8", Pins("M3")), Subsignal("P9", Pins("M1")),
                 Subsignal("P10", Pins("N1")), Attrs(IOSTANDARD="LVCMOS33")),

        # Onboard SPI flash
        *SPIFlashResources(0,
                           cs="K19",
                           clk="C11",
                           mosi="D18",
                           miso="D19",
                           wp="G18",
                           hold="F18",
                           attrs=Attrs(IOSTANDARD="LVCMOS33")),
    ]

    def toolchain_program(self, products, name):
        djtgcfg = os.environ.get("DJTGCFG", "djtgcfg")
        with products.extract("{}.bit".format(name)) as bitstream_filename:
            subprocess.run([
                djtgcfg, "prog", "-d", "Basys3", "-i", "0", "-f",
                bitstream_filename
            ],
                           check=True)
Пример #11
0
class AmaltheaPlatformRev0D1(LatticeECP5Platform):
    """ Board description for the pre-release r0.1 revision of LUNA. """

    name        = "Amalthea r0.1 (26MHz mod)"

    device      = "LFE5U-12F"
    package     = "BG256"
    speed       = os.getenv("LUNA_SPEED_GRADE", "8")

    default_clk = "clk_26MHz"

    # Provide the type that'll be used to create our clock domains.
    clock_domain_generator = DomainGenerator

    #
    # Default clock frequencies for each of our clock domains.
    #
    # Different revisions have different FPGA speed grades, and thus the
    # default frequencies will vary.
    #
    DEFAULT_CLOCK_FREQUENCIES_MHZ = {
        "fast": 240,
        "sync": 120,
        "usb":  60
    }

    #
    # Preferred DRAM bus I/O (de)-skewing constants.
    #
    ram_timings = dict(
        clock_skew = 64
    )

    # Provides any platform-specific ULPI registers necessary.
    # This is the spot to put any platform-specific vendor registers that need
    # to be written.
    ulpi_extra_registers = {
        0x39: 0b000110 # USB3343: swap D+ and D- to match the LUNA boards
    }



    #
    # I/O resources.
    #
    resources   = [

        # 26MHz clock from AT86RF215 CLKOUT.
        Resource("clk_26MHz", 0, Pins("A7", dir="i"),
            Clock(26e6), Attrs(IO_TYPE="LVCMOS33")),

        # Connection to our SPI flash; can be used to work with the flash
        # from e.g. a bootloader.
        Resource("spi_flash", 0,

            # SCK is on pin 9; but doesn't have a traditional I/O buffer.
            # Instead, we'll need to drive a clock into a USRMCLK instance.
            # See interfaces/flash.py for more information.
            Subsignal("sdi",  Pins("T8",  dir="o")),
            Subsignal("sdo",  Pins("T7",  dir="i")),

            # In r0.1, the chip select line can either be driven by the FPGA
            # or by the Debug Controller. Accordingly, we'll mark the line as
            # bidirectional, and let the user decide.
            Subsignal("cs",   PinsN("N8", dir="io")),
            Attrs(IO_TYPE="LVCMOS33")
        ),

        # UART connected to the debug controller; can be routed to a host via CDC-ACM.
        Resource("uart", 0,
            Subsignal("rx",   Pins("R14", dir="i")),
            Subsignal("tx",   Pins("T14", dir="o")),
            Attrs(IO_TYPE="LVCMOS33")
        ),


        # SPI bus connected to the debug controller, for simple register exchanges.
        # Note that the Debug Controller is the master on this bus.
        Resource("debug_spi", 0,
            Subsignal("sck",  Pins( "R13", dir="i")),
            Subsignal("sdi",  Pins( "P13", dir="i")),
            Subsignal("sdo",  Pins( "P11", dir="o")),
            Subsignal("cs",   PinsN("T13", dir="i")),
            Attrs(IO_TYPE="LVCMOS33")
        ),

        # FPGA-connected LEDs.
        Resource("led",  5, PinsN("P15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  4, PinsN("N16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  3, PinsN("M15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  2, PinsN("M16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  1, PinsN("L15", dir="o"), Attrs(IO_TYPE="LVCMOS33")),
        Resource("led",  0, PinsN("L16", dir="o"), Attrs(IO_TYPE="LVCMOS33")),

        # USB PHYs
        ULPIResource("sideband_phy",
            data_sites="R2 R1 P2 P1 N1 M2 M1 L2", clk_site="R4",
            dir_site="T3", nxt_site="T2", stp_site="T4", reset_site="R3"),
        ULPIResource("host_phy",
            data_sites="G2 G1 F2 F1 E1 D1 C1 C2", clk_site="K2",
            dir_site="J1", nxt_site="H2", stp_site="J2", reset_site="K1"),

        # HyperRAM (1V8 domain).
        Resource("ram", 0,
            # Note: our clock uses the pseudo-differential I/O present on the top tiles.
            # This requires a recent version of trellis+nextpnr. If your build complains
            # that LVCMOS18D is an invalid I/O type, you'll need to upgrade.
            Subsignal("clk",   DiffPairs("B14", "A15", dir="o"), Attrs(IO_TYPE="LVCMOS18D")),
            Subsignal("dq",    Pins("A11 B10 B12 A12 B11 A10 B9 A9", dir="io")),
            Subsignal("rwds",  Pins( "A13", dir="io")),
            Subsignal("cs",    PinsN("A14", dir="o")),
            Subsignal("reset", PinsN("B13", dir="o")),
            Attrs(IO_TYPE="LVCMOS18", SLEWRATE="FAST")
        ),

        # Radio.
        Resource("radio", 0,
            Subsignal("rst",   PinsN("C14", dir="o")),

            Subsignal("sclk",  Pins( "K14", dir="o")),
            Subsignal("sel",   PinsN("E16", dir="o")),
            Subsignal("mosi",  Pins( "F16", dir="o")),
            Subsignal("miso",  Pins( "G16", dir="i")),

            Subsignal("irq",   Pins( "F15", dir="i")),

            Subsignal("rxclk", DiffPairs("J16", "J15", dir="i"), Attrs(IO_TYPE="LVDS", DIFFRESISTOR="100", PULLMODE="UP")),
            Subsignal("rxd09", DiffPairs("D16", "E15", dir="i"), Attrs(IO_TYPE="LVDS", DIFFRESISTOR="100")),
            Subsignal("rxd24", DiffPairs("K16", "K15", dir="i"), Attrs(IO_TYPE="LVDS", DIFFRESISTOR="100")),

            Subsignal("txclk", DiffPairs("B16", "B15", dir="o"), Attrs(IO_TYPE="LVCMOS33D", DRIVE="4")),
            Subsignal("txd",   DiffPairs("C16", "C15", dir="o"), Attrs(IO_TYPE="LVCMOS33D", DRIVE="4")),
            Attrs(IO_TYPE="LVCMOS33"),
        ),

        # User I/O connections.
        # TODO: Update these for io0+/- & io1+/-
        Resource("user_io", 0, Pins("A5", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 1, Pins("A4", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 2, Pins("A3", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
        Resource("user_io", 3, Pins("A2", dir="io"), Attrs(IO_TYPE="LVCMOS33", SLEWRATE="FAST")),
    ]

    connectors = [

        # User I/O connector.
        Connector("user_io", 0, """
            A5  -  A2
            A4  -  A3
        """)

    ]

    def toolchain_prepare(self, fragment, name, **kwargs):
        overrides = {
            'ecppack_opts': '--compress --freq 38.8'
        }

        return super().toolchain_prepare(fragment, name, **overrides, **kwargs)


    def toolchain_program(self, products, name):
        """ Programs the relevant LUNA board via its sideband connection. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.ecp5 import ECP5_JTAGProgrammer

        # Create our connection to the debug module.
        debugger = ApolloDebugger()

        # Grab our generated bitstream, and upload it to the FPGA.
        bitstream =  products.get("{}.bit".format(name))
        with debugger.jtag as jtag:
            programmer = ECP5_JTAGProgrammer(jtag)
            programmer.configure(bitstream)


    def toolchain_flash(self, products, name="top"):
        """ Programs the LUNA board's flash via its sideband connection. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.flash import ensure_flash_gateware_loaded

        # Create our connection to the debug module.
        debugger = ApolloDebugger()
        ensure_flash_gateware_loaded(debugger, platform=self.__class__())

        # Grab our generated bitstream, and upload it to the .
        bitstream =  products.get("{}.bit".format(name))
        with debugger.flash as flash:
            flash.program(bitstream)

        debugger.soft_reset()


    def toolchain_erase(self):
        """ Erases the LUNA board's flash. """

        from luna.apollo import ApolloDebugger
        from luna.apollo.flash import ensure_flash_gateware_loaded

        # Create our connection to the debug module.
        debugger = ApolloDebugger()
        ensure_flash_gateware_loaded(debugger, platform=self.__class__())

        with debugger.flash as flash:
            flash.erase()

        debugger.soft_reset()
Пример #12
0
class Supercon2019Badge(LatticeECP5Platform, LUNAPlatform):
    """ Platform for the Supercon 2019 badge (final, black PCB). """

    name = "HAD Supercon 2019 Badge"

    device = "LFE5U-45F"
    package = "BG381"
    speed = "8"

    default_clk = "clk8"

    # Provide the type that'll be used to create our clock domains.
    clock_domain_generator = SuperconDomainGenerator

    # We only have a direct connection on our USB lines, so use that for USB comms.
    default_usb_connection = "usb"

    #
    # I/O resources.
    #
    resources = [
        Resource("clk8", 0, Pins("U18"), Clock(8e6),
                 Attrs(IOStandard="LVCMOS33")),
        Resource("programn", 0, Pins("R1"), Attrs(IOStandard="LVCMOS33")),
        Resource(
            "serial",
            0,
            Subsignal("rx", Pins("U2"), Attrs(IOStandard="LVCMOS33"),
                      Attrs(PULLMODE="UP")),
            Subsignal("tx", Pins("U1"), Attrs(IOStandard="LVCMOS33")),
        ),

        # Full LED array.
        Resource("led_anodes", 0,
                 Pins("E3 D3 C3 C4 C2 B1 B20 B19 A18 K20 K19"),
                 Attrs(IOStandard="LVCMOS33")),  # Anodes
        Resource("led_cathodes", 1, Pins("P19 L18 K18"),
                 Attrs(IOStandard="LVCMOS33")),  # Cathodes via FET

        # Compatibility aliases.
        Resource("led", 0, Pins("E3")),
        Resource("led", 1, Pins("D3")),
        Resource("led", 2, Pins("C3")),
        Resource("led", 3, Pins("C4")),
        Resource("led", 4, Pins("C2")),
        Resource("led", 5, Pins("B1")),
        Resource("usb", 0, Subsignal("d_p", Pins("F3")),
                 Subsignal("d_n", Pins("G3")),
                 Subsignal("pullup", Pins("E4", dir="o")),
                 Subsignal("vbus_valid", Pins("F4", dir="i")),
                 Attrs(IOStandard="LVCMOS33")),
        Resource(
            "keypad",
            0,
            Subsignal("left", Pins("G2"), Attrs(PULLMODE="UP")),
            Subsignal("right", Pins("F2"), Attrs(PULLMODE="UP")),
            Subsignal("up", Pins("F1"), Attrs(PULLMODE="UP")),
            Subsignal("down", Pins("C1"), Attrs(PULLMODE="UP")),
            Subsignal("start", Pins("E1"), Attrs(PULLMODE="UP")),
            Subsignal("select", Pins("D2"), Attrs(PULLMODE="UP")),
            Subsignal("a", Pins("D1"), Attrs(PULLMODE="UP")),
            Subsignal("b", Pins("E2"), Attrs(PULLMODE="UP")),
        ),
        Resource(
            "hdmi_out",
            0,
            Subsignal("clk_p", PinsN("P20"), Attrs(IOStandard="TMDS_33")),
            Subsignal("clk_n", PinsN("R20"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data0_p", Pins("N19"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data0_n", Pins("N20"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data1_p", Pins("L20"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data1_n", Pins("M20"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data2_p", Pins("L16"), Attrs(IOStandard="TMDS_33")),
            Subsignal("data2_n", Pins("L17"), Attrs(IOStandard="TMDS_33")),
            Subsignal("hpd_notif", PinsN("R18"),
                      Attrs(IOStandard="LVCMOS33")),  # Also called HDMI_HEAC_n
            Subsignal("hdmi_heac_p", PinsN("T19"),
                      Attrs(IOStandard="LVCMOS33")),
            Attrs(DRIVE=4),
        ),
        Resource(
            "lcd",
            0,
            Subsignal(
                "db",
                Pins("J3 H1 K4 J1 K3 K2 L4 K1 L3 L2 M4 L1 M3 M1 N4 N2 N3 N1"),
                Attrs(IOStandard="LVCMOS33")),
            Subsignal("rd", Pins("P2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("wr", Pins("P4"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("rs", Pins("P1"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("cs", Pins("P3"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("id", Pins("J4"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("rst", Pins("H2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("fmark", Pins("G1"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("blen", Pins("P5"), Attrs(IOStandard="LVCMOS33")),
        ),
        Resource(
            "spiflash",
            0,  # clock needs to be accessed through USRMCLK
            Subsignal("cs_n", Pins("R2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("mosi", Pins("W2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("miso", Pins("V2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("wp", Pins("Y2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("hold", Pins("W1"), Attrs(IOStandard="LVCMOS33")),
        ),
        Resource(
            "spiflash4x",
            0,  # clock needs to be accessed through USRMCLK
            Subsignal("cs_n", Pins("R2"), Attrs(IOStandard="LVCMOS33")),
            Subsignal("dq", Pins("W2 V2 Y2 W1"), Attrs(IOStandard="LVCMOS33")),
        ),
        Resource(
            "spiram4x",
            0,
            Subsignal("cs_n", Pins("D20"), Attrs(IOStandard="LVCMOS33"),
                      Attrs(SLEWRATE="SLOW")),
            Subsignal("clk", Pins("E20"), Attrs(IOStandard="LVCMOS33"),
                      Attrs(SLEWRATE="SLOW")),
            Subsignal("dq", Pins("E19 D19 C20 F19"),
                      Attrs(IOStandard="LVCMOS33"), Attrs(PULLMODE="UP"),
                      Attrs(SLEWRATE="SLOW")),
        ),
        Resource(
            "spiram4x",
            1,
            Subsignal("cs_n", Pins("F20"), Attrs(IOStandard="LVCMOS33"),
                      Attrs(SLEWRATE="SLOW")),
            Subsignal("clk", Pins("J19"), Attrs(IOStandard="LVCMOS33"),
                      Attrs(SLEWRATE="SLOW")),
            Subsignal("dq", Pins("J20 G19 G20 H20"),
                      Attrs(IOStandard="LVCMOS33"), Attrs(PULLMODE="UP"),
                      Attrs(SLEWRATE="SLOW")),
        ),
        Resource(
            "sao",
            0,
            Subsignal("sda", Pins("B3")),
            Subsignal("scl", Pins("B2")),
            Subsignal("gpio", Pins("A2 A3 B4")),
            Subsignal("drm", Pins("A4")),
        ),
        Resource(
            "sao",
            1,
            Subsignal("sda", Pins("A16")),
            Subsignal("scl", Pins("B17")),
            Subsignal("gpio", Pins("B18 A17 B16")),
            Subsignal("drm", Pins("C17")),
        ),
        Resource(
            "testpts",
            0,
            Subsignal("a1", Pins("A15")),
            Subsignal("a2", Pins("C16")),
            Subsignal("a3", Pins("A14")),
            Subsignal("a4", Pins("D16")),
            Subsignal("b1", Pins("B15")),
            Subsignal("b2", Pins("C15")),
            Subsignal("b3", Pins("A13")),
            Subsignal("b4", Pins("B13")),
        ),
        Resource("sdram_clock", 0, Pins("D11"), Attrs(IOStandard="LVCMOS33")),
        Resource(
            "sdram", 0,
            Subsignal("a",
                      Pins("A8 D9 C9 B9 C14 E17 A12 B12 H17 G18 B8 A11 B11")),
            Subsignal("dq", Pins("C5 B5 A5 C6 B10 C10 D10 A9")),
            Subsignal("we_n", Pins("B6")), Subsignal("ras_n", Pins("D6")),
            Subsignal("cas_n", Pins("A6")), Subsignal("cs_n", Pins("C7")),
            Subsignal("cke", Pins("C11")), Subsignal("ba", Pins("A7 C8")),
            Subsignal("dm", Pins("A10")), Attrs(IOStandard="LVCMOS33"),
            Attrs(SLEWRATE="FAST")),

        # Compatibility.
        Resource("user_io", 0, Pins("A15")),
        Resource("user_io", 1, Pins("C16")),
        Resource("user_io", 2, Pins("A14")),
        Resource("user_io", 3, Pins("D16")),
    ]

    connectors = [
        Connector("pmod", 0, "A15 C16 A14 D16 B15 C15 A13 B13"),
        Connector(
            "genio", 0,
            "C5 B5 A5 C6 B6 A6 D6 C7 A7 C8 B8 A8 D9 C9 B9 A9 D10 C10 B10 A10 D11 C11 B11 A11 G18 H17 B12 A12 E17 C14"
        ),
    ]

    def __init__(self, *args, **kwargs):
        logging.warning(
            "This platform is not officially supported, and thus not tested.")
        logging.warning("Your results may vary.")
        super().__init__(*args, **kwargs)

    def toolchain_prepare(self, fragment, name, **kwargs):
        overrides = {'ecppack_opts': '--compress --freq 38.8'}
        return super().toolchain_prepare(fragment, name, **overrides, **kwargs)

    def toolchain_program(self, products, name):
        """ Program the flash of an Supercon board. """

        # Use the DFU bootloader to program the ECP5 bitstream.
        dfu_util = os.environ.get("DFU_UTIL", "dfu-util")
        with products.extract("{}.bit".format(name)) as bitstream_filename:
            subprocess.check_call([
                dfu_util, "-d", "1d50:614b", "-a", "0", "-D",
                bitstream_filename
            ])

    def toolchain_flash(self, products, name="top"):
        """ Program the flash of an Supercon cartridge. """

        # Use the DFU bootloader to program the ECP5 bitstream.
        dfu_util = os.environ.get("DFU_UTIL", "dfu-util")
        with products.extract("{}.bit".format(name)) as bitstream_filename:
            subprocess.check_call([
                dfu_util, "-d", "1d50:614b", "-a", "2", "-D",
                bitstream_filename
            ])
Пример #13
0
class IceBreakerPlatform(LatticeICE40Platform, LUNAPlatform):
    """ Base class for Fomu platforms. """

    device = "iCE40UP5K"
    package = "SG48"
    name = "iCEBreaker"

    # Provide the type that'll be used to create our clock domains.
    clock_domain_generator = IceBreakerDomainGenerator

    # We only have a direct connection on our USB lines, so use that for USB comms.
    default_usb_connection = "tnt_usb"

    default_clk = "clk12"
    resources = [
        Resource("clk12", 0, Pins("35", dir="i"), Clock(12e6),
                 Attrs(GLOBAL=True, IO_STANDARD="SB_LVCMOS")),
        Resource("led", 0, PinsN("11", dir="o"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("led", 1, PinsN("37", dir="o"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),

        # Semantic aliases
        Resource("led_r", 0, PinsN("11", dir="o"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("led_g", 0, PinsN("37", dir="o"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),

        # Default USB position.
        Resource(
            "tnt_usb",
            0,
            Subsignal("d_p", Pins("31")),
            Subsignal("d_n", Pins("34")),
            Subsignal("pullup", Pins("38", dir="o")),
            Attrs(IO_STANDARD="SB_LVCMOS"),
        ),
        Resource(
            "kbeckmann_usb",
            0,
            Subsignal("d_p", Pins("43")),
            Subsignal("d_n", Pins("38")),
            Subsignal("pullup", Pins("34", dir="o")),
            Attrs(IO_STANDARD="SB_LVCMOS"),
        ),

        # Compatibility aliases.
        Resource("user_io", 0, PinsN("4", dir="io"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("user_io", 1, PinsN("2", dir="io"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("user_io", 2, PinsN("47", dir="io"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
        Resource("user_io", 3, PinsN("25", dir="io"),
                 Attrs(IO_STANDARD="SB_LVCMOS")),
    ]
    connectors = [
        Connector("pmod", 0, " 4  2 47 45 - -  3 48 46 44 - -"),  # PMOD1A
        Connector("pmod", 1, "43 38 34 31 - - 42 36 32 28 - -"),  # PMOD1B
        Connector("pmod", 2, "27 25 21 19 - - 26 23 20 18 - -"),  # PMOD2
    ]

    def __init__(self, *args, **kwargs):
        logging.warning(
            "This platform is not officially supported, and thus not tested. Your results may vary."
        )
        logging.warning(
            "Note also that this platform does not use the iCEBreaker's main USB port!"
        )
        logging.warning(
            "You'll need to connect a cable or pmod. See the platform file for more info."
        )
        super().__init__(*args, **kwargs)

    def toolchain_program(self, products, name):
        iceprog = os.environ.get("ICEPROG", "iceprog")
        with products.extract("{}.bin".format(name)) as bitstream_filename:
            subprocess.check_call([iceprog, bitstream_filename])

    def toolchain_flash(self, products, name="top"):
        self.toolchain_program(products, name)