With a framework in mind and the host controller family selected, the next step is determining what all needs to be connected to the controller. Let's start by listing the features:
- USB connector
- Target Interface (SPI, I2C, UART)
- RGB LED
- Reset button
- In-circuit debug connector
The target interface consists of multiple interfaces and deserves some additional consideration.
The SPI interface will be connected to a serial flash device in parallel with the target FPGA. We can hold the FPGA in configuration reset and load code into the flash device on the target board, or we can load code into a flash device mounted on this board with the target board in configuration reset or disconnected. The SPI programming bus is located at two headers on the iCE40UP breakout board, one pinned out for an Ardvark connector which does not have any power, and one at a dual row PMOD header with power and 4 additional I/O. We will target the PMOD header so we have access to power and the additiona I/O. The Olimex boards connect the programming signals to a UEXT connector. In addition to the SPI signals, the UEXT connector also includes CRESET, CDONE and two I/O in the UART locations. The I2C signals in the UEXT connector are used for CRESET and CDONE, so we will need another connector to get I2C to the Olimex boards. To keep the board area down, I will add a Qwiic connector for the extra I2C port.
Since much of the code will be coming from Adafruit projects, I will use the same RGB LED connections found on the Tricket M0 and ItsyBitsy boards.
The debug connector will primarily be used for development so I will use a small SMT connector on the back side of the board that can be left off in production. There is a standard 50mil pitch 10pin header that is common with ARM MCU's and there is even room for a debug console UART if you follow the MAXDAP pinout from the MAX32625PICO board.
For the extra analog/GPIO signals, I'll include another single row header with an extra power and ground signal.