113 lines
2.8 KiB
Python
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)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|