## Fomu: an FPGA in your USB Port
A framework for easily creating beautiful presentations using HTML
Author: Sean "xobs" Cross

Pre-order now on Crowd Supply! t.xobs.io/fomu

# Fomu: An FPGA in your USB Port

#### A whirlwind introduction to Fomu; a workshop in three levels

Sean Cross - https://xobs.io/ - @xobs

## Levels of Fomu

Fomu aims to be accessable on three levels:

1. Python / Interpreted
2. RISC-V
3. Verilog / FPGA

## Workshop Outline

1. What do I need to get started?
2. What is an FPGA, and what is Fomu?
3. What makes Fomu special?
4. What can I do with Fomu?

## What do I need to get started?

1. DFU utilities
2. Serial console
3. RISC-V toolchain
4. Synthesis
5. Place-and-Route
6. Packer
7. Python 3

## What is an FPGA?

    							module DFF (output reg Q, input C, D, R);
    								always @(posedge C)
    								if (~R) begin
    									Q <= 1'b0;
    								end else begin
    									Q <= D;
    								end
    							endmodule

## About the ICE40UP5K

1. 5280 4-input LUTs (LC)
2. 16 kilobytes BRAM
3. 128 kilobytes "SPRAM"
4. Current-limited 3-channel LED
5. 2x I2C and 2x SPI
6. 8 16-bit DSP units
7. Warmboot capability

## What is Fomu?

- ICE40UP5K in your USB port
- 2MB flash memory
- Four edge-plated pads
- ESD protection
- USB implemented in HDL

## What is this PCB?

### Fomu EVT1

## What modifications does it have?

- Shorting out two zero-ohm resistors (R7, PU)
- Programming SPI flash
- Bending SPI flash pins inward (U4)
- Mounting crystal on its side (U7)
- Attaching power to crystal

## Fomu Block Design Diagram

## Fomu SPI Flash Layout

## Working with Fomu

## "fail safe" bootloader

Using dfu

## Updating Fomu

    $ dfu-util -l
    Found DFU: [1209:5bf0] name="Fomu DFU Bootloader v1.7.2"
    $ dfu-util -D evt-installable.dfu
    Download        [=========                ]  36%   38912 bytes
    Download done.
    $ dfu-util -l
    Found DFU: [1209:5bf0] name="Fomu DFU Bootloader v1.8.1"
    $

## Python / Interpreted

1. Goal: Multiple interpreters, auto-reload, USB disk interface
2. Now: MicroPython binary

## Loading Programs onto Fomu

    $ dfu-util -l
    Found DFU: [1209:5bf0] name="Fomu DFU Bootloader v1.8.1"
    $ dfu-util -e                  # Boot current program
    $ dfu-util -D new-image.dfu    # Load new program

### u`5b f0`mu

## Loading MicroPython

    $ dfu-util -D micropython-fomu.dfu

## Connecting via serial

    screen /dev/cu.usbserial*

    screen /dev/ttyACM*

    Teraterm

    MicroPython v1.10-296-g0a5a77a on 2019-06-18; fomu with vexriscv
    >>>

## Interacting with Fomu

    							>>> import fomu
    							>>> rgb = fomu.rgb()
    							>>> rgb.mode("error")
    							>>>

## RGB LEDD reference

    >>> rgb.write_raw(0b0001, 255)
    >>> rgb.write_raw(0b1010, 14)
    >>> rgb.write_raw(0b1011, 1)
    >>>

## Future Work

CircuitPython, etc.

## RISC-V code

## LiteX Machine Model

## Wishbone Interface

## Wishbone Bridge

## Interacting with LEDD directly

## Writing RISC-V Code

## Hardware Description Language

## Yosys and NextPNR

## Blinking an LED

## LiteX and MiGen

## VexRiscv