humpback-dds/nmigen/humpback.py

113 lines
2.8 KiB
Python

# Strongly inspired by the migen build of humpback
# Using STM32 Nucleo-H743ZI2 board
# Note to self: Pin assignment differs from Nucleo-H743ZI
import os
import subprocess
from nmigen.build import *
from nmigen.vendor.lattice_ice40 import *
from nmigen_boards.resources import *
from resources import *
from pin_mapper import *
__all__ = ["HumpbackPlatform"]
class HumpbackPlatform(LatticeICE40Platform):
device = "iCE40HX8K" # Using ICE40HX8K-CT256
package = "CT256"
default_clk = "clk25" # Point of deviation: Clock speed for humpback is fixed at 25MHz
# Acquire GPIO mappings from gpio_mapper
gpio_dict, global_gpio_dict = GPIOMapping()
resources = [
# Define clock
Resource("clk25", 0, Pins("K9", dir="i"),
Clock(25e6), Attrs(GLOBAL=True, IO_STANDARD="SB_LVCMOS")
),
# Define user LED
Resource("user_led", 0, Pins("H3", dir="o"),
Attrs(IO_STANDARD="SB_LVCMOS")
),
# Serial interfaces: Only including pins usable to STM32
# Define UART interfaces
# UART interface: There are no pull ups from humpback.
# Need to configure STM32 pins to pull up.
# Note: Use USART in asynchronous mode
UARTResource(0,
rx="T11", tx="M13", rts="M15", cts="T10",
attrs=Attrs(IO_STANDARD="SB_LVCMOS", PULLUP=1)
),
# UART1 interface: Read note for UART interface above
# UART1 interface is broken due to pin rearrangement introduced for Nucleo-H743ZI2
# Uncomment if fixed, or found an alternative (e.g. bit banging UART)
# *UARTResource(1,
# tx="M11", rx="T13", rts="A6", cts="B16",
# attrs=Attrs(IO_STANDARD="SB_LVCMOS", PULLUP=1)
# ),
# Define SPI interfaces
# Note: Use "role=device" to make humpback a SPI slave
# The ~CS pin is a global pin, but not being configured global.
SPIResource(0,
cs="R2", clk="C8", mosi="N5", miso="T2",
attrs=Attrs(IO_STANDARD="SB_LVCMOS")
),
# Define I2C interface
# Note: Need to program pull up in stm32
# Use "role=device" to make humpback a I2C slave
I2CResource(0,
sda="T16", scl="M12",
attrs=Attrs(IO_STANDARD="SB_LVCMOS", PULLUP=1)
),
# TODO:STM32 GPIO pins, ignore other unusable pins as well
*GPIOResources(
pins_dict = gpio_dict, dir = "o",
attrs=Attrs(IO_STANDARD="SB_LVCMOS"),
),
*GPIOResources(
pins_dict = global_gpio_dict, dir = "o",
attrs=Attrs(GLOBAL=True, IO_STANDARD="SB_LVCMOS"),
),
]
connectors = []
# tool chain setup, using default ICE40 HX8K evaluation code
def toolchain_program(self, products, name):
iceprog = os.environ.get("ICEPROG", "iceprog")
with products.extract("{}.bin".format(name)) as bitstream_filename:
# TODO: this should be factored out and made customizable
subprocess.check_call([iceprog, "-S", bitstream_filename])
if __name__ == "__main__":
from nmigen_boards.test.blinky import *
HumpbackPlatform().build(Blinky(), do_program=False)