Skip to the content
2 layers82 × 58 mmEndeavour, the printed circuit board in 3D

Endeavour - open-source FPGA board and SoC ==========================================

Size
82 × 58 mm
Copper layers
2
Thickness
1.6 mm
Parts
85
Nets
197
Pads
624
Tracks, vias
1,401, 143
Pours
10
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
3 May 2024
Updated
20 Feb 2026

Overview

Endeavour is an open-source printed circuit board by petrmikheev, from the petrmikheev/endeavour repository on GitHub. It is a 2-layer board of 82 × 58 mm with 85 parts on 197 nets, routed with 1,401 tracks and 143 vias.

It is built around the 10M50SAE144C8G, AP63203WU and LM4811MM, with the MCP4728-E/UN, SI5351A-B-GT and AP2114H-2.5TRG1 among its other parts. Its parts include 26 resistors, 18 capacitors, 11 connectors, 10 ICs and 5 switches.

Main components

9

README

README.md

Endeavour - open-source FPGA board and SoC

Project goal

  • Design my own FPGA board and make a computer based on it.
  • "A computer" means being able to attach a display and keyboard, and write and compile software directly on the device.
  • Try to achieve best possible performance without using BGA chips. It is my first hardware project, I wasn't sure in my soldering skills and decided not to deal with BGA yet.

What are the practical uses of the device? No practical use. It is a hobby project, I just wanted to do it.

Results

  • It works and runs linux!
  • It was fun to write from scratch SBI, bootloader, some linux drivers, implementation of ANSI escape sequences, text-based window manager.
  • 128 MB DDR1 RAM works at 100 MHz (i.e. throughput limit is 400 MB/s). Configuring FPGA IO timing constraints wasn't fun at all.
  • CPU: VexiiRiscv, 1 core, 60 MHz, 2.0 DMIPS/MHz.

Initially I planned to make a video game optimized specifically for this FPGA board. But now I am considering to skip this step and try to design a more advanced FPGA board.

This project is no longer maintained, superseded by endeavour2.

Hardware

Components

FPGA

Due to the "I can't solder BGA" limitation there wasn't much choice.

I use 10M50SAE144, Intel MAX10 series, as currently (2024) it is by a huge margin the biggest (50K logic cells) non-BGA FPGA chip and also over all alternatives has the largest number of available IO pins.

  • 10M50SAE144, EQFP-144
  • 50K logic cells
  • 182 M9K blocks
  • 101 IO pin
  • 1 PLL

RAM

Seems all RAM starting from DDR2 are BGA-only. I chose the biggest available DDR1 chip:

  • AS4C64M16D1, TSOP66
  • DDR1 128MB
  • Max frequency 166Mhz
  • CL 2 (up to 133Mhz) or 2.5 (up to 166Mhz)
  • 16 data pins
  • Max theoretical throughput: 664 MB/s

There is an option to use a smaller compatible chip. E.g. AS4C32M16D1 (64MB).

Other chips

  • USB to UART/JTAG converter: FT2232HL
  • 48Mhz clock generator, 2x external PLL Si5351A
  • audio: D2A converter MCP4728, amplifier LM4811
  • dc-dc converters: AP63203WU (5V -> 3.3V), AP2114H (3.3V -> 2.5V)

Interfaces

Main interfaces

  • USB-C: power / JTAG / UART / USB1.1 device
  • Micro SD card slot
  • DVI-D with HDMI connector
  • 2x USB-A: USB1.1 host
  • 3.5mm stereo audio

LEDs and buttons

  • power button
  • power LED
  • FTDI power switch
  • USB-C data lines switch "to FTDI" / "direct connection to FPGA"
  • 3 LEDs
  • 2 push buttons
  • 1 switch (used as CPU reset)

For future extensions

  • 3 GPIO pins
  • 9 configurable GPIO/analog input pins
  • 1 dedicated analog input pin

Revision 1

First attempt wasn't fully successful (though as expected). Keeping it here for history.

Results:

  • practiced soldering;
  • tested powering scheme, tested flashing via JTAG over FT2232HL;
  • tested UART and SD card controllers;
  • found some problems in the scheme, e.g. found out that USB-C requires 5.1K resistors to get power from the cable.
  • DVI-D interface didn't work, mostly due to soldering errors;
  • tried scheme with 4 AS4C32M16D1 DDR1 (4*64=256MB RAM in total) on a single bus, but even a single chip didn't work properly. Either because FPGA IO delays were configured incorrectly, or because tracks on PCB were too long. I decided to simplify the scheme: in second revision there is only a single 128MB DDR1 chip placed right under the FPGA in order to minimize tracks length and tracks length inequality.

KiCad project, gerber files

Revision 2

KiCad project, gerber files

images

RTL

Used open source IP cores:

  • VexiiRiscv - RISC-V core written in SpinalHDL. Special thanks to Dolu1990, the author of SpinalHDL and VexiiRiscv, for patiently answering my questions.
  • A few components distributed with SpinalHDL: Tilelink interconnect, APB3 and AXI4 bridges, USB OHCI controller, Plic Mapper.
  • ZipCPU/sdspi SD-Card controller with minor tweaks needed to use it with Intel/Altera FPGAs. In theory it requires 96-104 MHz base clock, but in my setup it couldn't work on such frequency, so I use it with 48 Mhz clock (same as for USB) and in software setup frequency with x2 coefficient. Data transfer speed is up to 24 MB/s.
  • DDR1 sdram controller in my SoC is based on FPGA-DDR-SDRAM by WangXuan95. I switched it to DDIO IO primitives, added wstrb support, changed bus width to 64 bit, and optimized some parts for better fMax. On my FPGA board it works stable at frequency up to 100 MHz (i.e. upper bound for throughput is 400 MB/s).
  • Also in testbench I used USB CDC Device written by ultraembedded as a model of a connected USB device.

Components designed from scratch:

  • DVI-D video controller. Features: independent text and graphic layers, transparency support, changing fonts in runtime, changing screen resolution in runtime. 32-bit APB3 control interface and 64-bit Tilelink DMA interface.
  • UART and I2C implementation.
  • Audio controller. Stereo, 12 bit per channel, up to 44.1 kHz sample rate, volume control.

SpinalHDL is used to bring this all together.

There are several clock domains in the design:

  • 100 Mhz - RAM
  • 60 MHz - VexiiRiscv core, Tilelink hub, video DMA, USB OHCI
  • 48 MHz - UART controller, audio controller, sdcard controller, USB phy, timer
  • pixel clock (from 25.175 to 74.25 MHz depending on resolution)
  • TMDS encoder bit clock (from 125.875 to 371.25 MHz; output signal frequency is twice higher thanks to DDIO primitives)

Pixel clock and TMDS clock are generated by internal PLL. CPU and RAM clocks are generated by Si5351A chip that is configured on startup via I2C.

Address map

See details in endeavour_defs.h.

0x00001000 - 0x0000100BUART controller
0x00002000 - 0x00002007Audio controller
0x00003000 - 0x0000301FSD card controller
0x00004000 - 0x0000402BLEDs, keys, timer, frequency control
0x00009000 - 0x00009017Video controller
0x0000A000 - 0x0000A05BOHCI controller
0x04000000 - 0x07FFFFFFPLIC
0x40000000 - 0x40001FFFBIOS ROM (8 KB)
0x40002000 - 0x40003FFFInternal RAM (8 KB)
0x80000000 - 0x87FFFFFFExternal RAM (128 MB)

Software

software/bios

Initializes text video mode, runs memtest, initializes sdcard, loads bootsector and starts bootloader. Provides UART console for debugging. Provides a few functions like printf/sscanf (see at the end of endeavour_defs.h).

software/bootloader

Bootloader with EXT2 filesystem support. Built-in console allows to set screen resolution and wallpaper (only 16bit BMP supported), view text files, run files in M mode, load and run linux kernel in S mode. Implements riscv timer SBI extension.

software/linux

Contains linux kernel config and drivers for UART, SD card, and display (audio driver currently not implemented).

software/textwm

Text-based window manager. Features:

  • Implementation of ANSI escape sequences.
  • Conversion from keyboard scancodes to ANSI codes.
  • Virtual TTYs /dev/ttyp0 - /dev/ttyp6. Each can work in fullscreen or windowed mode.
  • UTF8 support.
  • Configurable screen resolution, font, wallpaper, text styles, window background color and transparency.

Parts

85
QtyValueFootprintReferences
81uFCapacitor_SMD:C_0603_1608MetricC3, C4, C7, C8, C13, C14, C15, C21
41.5KResistor_SMD:R_0603_1608MetricR15, R16, R18, R19
415KResistor_SMD:R_0603_1608MetricR8, R12, R13, R14
31KResistor_SMD:R_0603_1608MetricR2, R7, R26
31MResistor_SMD:R_0603_1608MetricR24, R25, R31
3350Resistor_SMD:R_0603_1608MetricR4, R5, R6
2,
20Resistor_SMD:R_0603_1608MetricR29, R30
20.1uFCapacitor_SMD:C_0603_1608MetricC10, C19
2100uFCapacitor_Tantalum_SMD:CP_EIA-3528-12_Kemet-TC5, C6
210uFCapacitor_SMD:C_0603_1608MetricC9, C12
225MHzendeavour_footprints:XTAL_ECS-120-20-3X-TRY2, Y3
227pFCapacitor_SMD:C_0603_1608MetricC1, C2
25.1KResistor_SMD:R_0603_1608MetricR22, R23
2560Resistor_SMD:R_0603_1608MetricR10, R11
2LED2LED_SMD:LED_0603_1608MetricD2, D4
2Si5351A-B-GTPackage_SO:MSOP-10_3x3mm_P0.5mmU4, U5
2USB_AConnector_USB:USB_A_Receptacle_GCT_USB1046J6, J7
110KResistor_SMD:R_0603_1608MetricR1
110M50SAE144Package_QFP:EQFP-144-1EP_20x20mm_P0.5mm_EP8.93x8.7mmU1
112KResistor_SMD:R_0603_1608MetricR3
112MHzendeavour_footprints:XTAL_ECS-120-20-3X-TRY1
14.7uFCapacitor_SMD:C_0603_1608MetricC20
14.7uHInductor_SMD:L_0603_1608MetricL1
147uFCapacitor_SMD:C_0603_1608MetricC11
175Resistor_SMD:R_0603_1608MetricR9
1AP2114H-2.5TRG1Package_TO_SOT_SMD:SOT-223-3_TabPin2U8
1AP63203WUPackage_TO_SOT_SMD:TSOT-23-6U7
1AS4C64M16D1endeavour_footprints:TSOP66-400U3
1Conn_01x03_SocketConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalJ9
1Conn_01x04_SocketConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalJ8
1Conn_02x03_Odd_EvenConnector_PinSocket_2.54mm:PinSocket_2x03_P2.54mm_VerticalJ11
1Conn_02x05_Odd_EvenConnector_PinSocket_2.54mm:PinSocket_2x06_P2.54mm_VerticalJ10
1FT2232HLPackage_QFP:LQFP-64_10x10mm_P0.5mmU11
1FTDI/DIRECTendeavour_footprints:SW_JS202011SCQNSW5
1HDMI_AConnector_HDMI:HDMI_A_Amphenol_10029449-x01xLF_HorizontalJ2
1KC2520Z 100MHzOscillator:Oscillator_SMD_Kyocera_KC2520Z-4Pin_2.5x2.0mmU2
1LED1LED_SMD:LED_0603_1608MetricD1
1LED3LED_SMD:LED_0603_1608MetricD3
1LM4811Package_SO:TSSOP-10_3x3mm_P0.5mmU9
1MCP4728Package_SO:MSOP-10_3x3mm_P0.5mmU6
1Micro_SD_Card_Det2Connector_Card:microSD_HC_Molex_104031-0811J5
1PB400EEQR1BLKendeavour_footprints:PB400EEQR1BLK_EWISW4
1Push1Button_Switch_THT:SW_PUSH_6mmSW1
1Push2Button_Switch_THT:SW_PUSH_6mmSW2
1SJ-3523-SMTendeavour_footprints:SJ-3523-SMT_CUDJ4
1SWx02endeavour_footprints:SW_219-2MSTRSW6
1UARTConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ1
1USB_C_Receptacle_USB2.0endeavour_footprints:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_HorizontalJ3
1snd_powerJumper:SolderJumper-3_P1.3mm_Open_Pad1.0x1.5mmJP1

The 81 most common of 85 parts.

More from petrmikheev/endeavour

1
  • 2 layers81.8 × 92 mmEndeavour, the printed circuit board in 3D

    Endeavour

    petrmikheev/endeavour

    Endeavour - open-source FPGA board and SoC ==========================================

    78 parts4

Similar boards

  • 4 layers194 × 94 mmBottom board, the printed circuit board in 3D

    Bottom board

    mod-audio/hw-mod-dwarf

    Hardware project of MOD Dwarf

    319 parts6
  • 2 layers243.2 × 100 mmZ2 rbpi4, the printed circuit board in 3D

    Z2 rbpi4

    zynthbox-hw/zynthbox-hw

    182 parts
  • 2 layers172 × 140.5 mmBottom board, the printed circuit board in 3D

    Bottom board

    mod-audio/mod-hw-duo

    Hardware project of MOD Duo

    255 parts1
  • 2 layers51.3 × 96.2 mmMinisynth32, the printed circuit board in 3D

    Minisynth32

    grantek/minisynth32

    A 3D-printable MIDI synthesiser inspired by the Roland MT-32 and clumsyMIDI, and powered by the mt32-pi MT-32 emulator.

    32 parts45CC-BY-SA-4.0
  • 2 layers100.2 × 68.6 mmBoard MKIV, the printed circuit board in 3D

    Board MKIV

    Demetrius-Ross/SimMonitor

    Rename the main script to main.py '''bash mv espnowsenderrelay.py main.py '''

    45 parts
  • 2 layers140.4 × 80.7 mmGame Controller, the printed circuit board in 3D

    Game Controller

    iandodson/DEN161_GameControllerDesign

    Design and full report for a video game controller using an Arduino Micro

    9 parts
  • 4 layers87.1 × 96 mmGsw141-breakout, the printed circuit board in 3D

    Gsw141-breakout

    rustbox/router

    Use ARJM11C7-502-KB-EW2 on mouser Tab up, so would have to be placed on the reverse side of the PCB $3.09 @ 10

    119 parts
  • 2 layers250 × 32 mmPsu, the printed circuit board in 3D

    Psu

    shmoergh/moduleur

    Fully analog DIY-friendly modular synth

    31 parts222

Questions

How big is the Endeavour PCB?

It measures 82 × 58 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Endeavour use?

85 parts, built around the 10M50SAE144C8G, AP63203WU, LM4811MM and MCP4728-E/UN. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Endeavour KiCad files?

From the petrmikheev/endeavour repository on GitHub, at the commit this page was made from: the board is hardware/rev2/endeavour.kicad_pcb and its schematic hardware/rev1/endeavour.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Endeavour design in my own project?

Its repository states no licence, so its author keeps all rights: ask petrmikheev before reusing the design.