Skip to the content
PCBKitNew board
2 layers74.6 × 73.2 mmPanelized-2layer, the printed circuit board in 3D

Panelized-2layer

openconcepts-ar/accel2d1

This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

Size
74.6 × 73.2 mm
Copper layers
2
Thickness
1.6 mm
Parts
241
Nets
242
Pads
1,256
Tracks, vias
2,760, 324
Pours
29
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
1 Apr 2025
Updated
6 Nov 2026

Overview

Panelized-2layer is an open-source printed circuit board by openconcepts-ar, from the openconcepts-ar/accel2d repository on GitHub. It is a 2-layer board of 74.6 × 73.2 mm with 241 parts on 242 nets, routed with 2,760 tracks and 324 vias.

It is built around the MT3608, TP6841S6 and EA3036CQBR, with the NCS8801S, NCS8805 and TXS0102DCU among its other parts. Its parts include 64 capacitors, 45 resistors, 18 connectors, 10 ICs and 6 inductors.

Main components

12

README

README.md

Hardware accelerated graphics (2D GPU) - graphics server system

Introduction

This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives. The accelerated versions runs faster using the exact same C code as the software version by automatic translation (transpiling) to Verilog code.

As an example, let's see how to use and develop drawing privimites for solid rectangles and ellipses.

Ellipse case (see ellipse_fill32.cc file):

text
MODULE ellipse_fill32(
  bus_master(bus),
  const uint16&	x0,
  const uint16&	x1,
  const uint16&	y0,
  const uint16&	y1,
  const uint32&	rgba, //color
  const uint32& base, //pixel offset
  const int16& xstride, //normally 1, but can run backwards
  const int16& ystride //bytes to skip for next line (usually the framebuffer width * 4 bytes)
  )

The bus argument is automatically handled both in software and in hardware by privided macros.
The rectangle primitive follows the same function signature.

Software implementation

You can directly call the function using compilation with a normal C compiler:

text
ellipse_fill32(BUSMASTER_ARG, x0, x1, y0, y1, rgba, base, xstride, ystride);

The BUSMASTER_ARG macro is an automatic argument, defined on a provided header file. It's useful for the implementation of the hardware accelerated primitive, as explained in the next section.

The following image is produced by the simulator by calling 1000 times to the software implementation of the primitives, using random coordinates:

Hardware implementation

To target hardware implementation on a FPGA, a Verilog file is automatically generated from from the corresponding C file having the drawing primitive algorithm, by using the following external tools: CflexHDL and the Silice transpilers (see Makefile.common target "c2v" for the invocation command details). Since this project aims to be transpiler-agnostic, the PipelineC transpiler is planned for a future version.

See a portion of the generated Verilog code, where part of the C expressions and interactions with the memory bus can be readily appreciated:

text
4: begin
    if (_q_x<_q_rw) begin
        _t_xx = _q_x*_q_x;
        _t_xh = (_t_xx)*(_q_hh);
        if (_t_xh+_q_yw<_q_wh) begin
            _d_bus_dat_w = in_rgba;
            _d_bus_we = 1;
            _d_bus_stb = 1;
            _d_bus_cyc = 1;
            if (!((_d_bus_stb&&_d_bus_we)&&!(_d_bus_stb&&in_bus_ack&&_d_bus_we))) begin
                _d_bus_stb = 0;
                _d_bus_adr = (_q_bus_adr+(in_xstride));
                _d_x = _q_x+1;
            end
        end else begin
            _d_bus_adr = (_q_bus_adr+(in_xstride));
            _d_x = _q_x+1;
        end
        _d__idx_fsm0 = 4;
    end else begin
        _d__idx_fsm0 = 5;
    end
end

After generating a System On Chip (SoC) for the target FPGA using the LiteX framework and a provided script, that includes the generated verilog files, the accelerator can be called as follows:

text
regs->x0 = x0;
regs->x1 = x1;
regs->y0 = y0;
regs->y1 = y1;
regs->base = VIDEO_FRAMEBUFFER_BASE + y0*FRAME_PITCH + x0*sizeof(rgba);
regs->xstride = SDRAM_BUS_BITS/8;
regs->ystride = FRAME_PITCH;
regs->rgba = rgba;

regs->run = 1; //start
while(!regs->done); //wait until done

As seen, you first set memory mapped registers with the desired values, then you start the core, then wait until the done flag is set.

Each accelerator core gets mapped starting at a fixed address (default 0x80000000 for the first accelerator, 0x80000800 for the second and so on, as provided by the correspoding macros). A C structure with the layout of registers is conveniently provided too (each register is 32-bit aligned, even if smaller).

The resulting execution in hardware is as follows:

Testing equivalence of software and hardware

You can visually appreciate that both images seems like the same, but how we can be sure the generated Verilog behaves the same as the software implementation? The solution is to use the accelerated implementations and also call the compiled software implementation in the same SoC, then we can compare if results are the same. The test program does specifically that, reporting how many pixels are in error, if any:

passed test

You can see that the accelerator is about 3X faster, while it also frees the CPU for other tasks.

In case of any discrepance, non-matching pixels are marked in red (this was generated by inducing a coordinate error in the software implementation) and the amount of pixels in error is reported.

failded test

Console output would be in this case:

text
Pixel errors: 320 (screen should have no red pixels)

==========================================
*** TESTS FAILED ***
==========================================

Prototype application and simulator

The acceleration is readily appreciated on the following video, where the software implementation is run prior to the hardware one. After that, a clock demo application is shown, using a combination of drawn rectangles and ellipses.

The code for that demo application can be compiled with the main simulator code on the host machine (e.g. Linux) to see results on the simulator window. This eases testing while in development since the program compiles in few seconds, then it can be run on the hardware platform to check if producing the same results. In the provided video, you can see that the hardware matches the simulator.

Accelerator performance

Accelerator cores gets directly connected to the dynamic RAM of the respective boards (acting similarly as a DMA), and using caching to achieve access at high speed. That way, the accelerated cores are about 7X faster than when running in software, as the current tests reports (line drawing core on a ECP5 device):

text
Start software rendering
elapsed 9057225 us, ops/s: 828153 (2 FPS @640x480)
Switch to hardware rendering
elapsed 1229585 us, ops/s: 6100246 (19 FPS @640x480)
Just waiting a bit to evaluate image...
Pixel errors: 0 (screen should have no red pixels)

==========================================
TESTS PASSED
==========================================

The following video shows the corresponding images on the display (first the software renderer, then the accelerated renderer).

Supported boards

Curently the project supports the following boards:
Lambdaconcept ECPIX-5 with a Lattice ECP5 device. It currently utilices an open source toolchain for building the bitstream. The board name used in the project is lambdaconcept_ecpix5.

Digilent Arty A7-35T with an AMD Artix7 device. The board name used in the project is digileny_arty.

Build instructions

Just run:

text
make BOARD=lambdaconcept_ecpix5 run upload

Where the target run runs the simulator, and the upload target makes the bitstream and uploads it to the FPGA board.

Micropython support, with graphics

The FPGA board is now capable of running a graphics-enabled micropython port, capable of controlling a PC monitor. Up to 8 bit per color channel are supported.

Example: accel_basic.py

Build & run instructions for micropython:

Generate and upload the bitstream (use your own serial port location if different):

text
make BOARD=digilent_arty digilent_arty SERIAL_PORT=/dev/ttyUSB1
cd micropython/ports/litex
make
litex_term.py --kernel build/firmware.bin /dev/ttyUSB1
cd -
openFPGALoader -b arty build/digilent_arty/gateware/digilent_arty.bit

Then the .py file can be uploaded using the standard mpremote command:

text
mpremote connect /dev/ttyUSB1 run demos/micropython/accel_basic.py

This generates the following picture:

To run the clock demo, accel_clock.py (in same folder)

Micropython support on the CPU board

The same repository used for the port of micropython to the FPGA platform was used to target the project's CPU board (F133A SoC by Allwinner Tech)

Supported features are:

  • REPL (Python prompt) over UART
  • Minimal umachine support
  • Time functions (except RTC)
  • Video Framebuffer
  • Dynamic memory allocation (using the internal DDR2 RAM)

The repository of the extended micropython is linked as a git submodule on the main repo (see micropython@51dfc37b30 at the project's main repo). The sub repository directs to the micropython repo.

The source for the f133 port are under the following folder

A basic example to test micropython on the CPU is to use the REPL mode:

Under the f133 folder, there's a micropython script that shows how to access the video framebuffer: test/test_video.py

Execution of this produced the following result:

Note the compatibility of the micropython code with the one for the FPGA platform.

Build instructions:

text
cd ports/f133
make

The make command will build the firmware and upload it to the board. To upload new firmware, you have to first push the reset button.

New CPU-based board

A brand-new board was designed using a graphics-capable CPU:

It's capable of running the clock demo, using the graphics primitives ellipse and rectangle fill

This produces the following image:

Build instructions:

text
   cd target-cpu/f133-bare/
   make

The make command will build the firmware and upload it to the board. To upload new firmware, you have to first push the reset button.

This milestone is conclusive proof that this framework is capable running the drawing primitives as software or hardware, since the same code runs on the CPU as software and in the FPGA as a hardware core, producing matching visual results.

The same port of micropython to the FPGA platform was used to target the project's CPU board (F133A SoC by Allwinner Tech)

Serial communications

The CPU board is capable of communication using serial ports, they're typically used to control the board externally and to get debug messages.

See an example of boot mesages outputted from the default debug port (UART0):

See below an example interaction with micropython using the second port (UART1), accesible in the board at the 6-pin header (bottom left).

This is achieved in software by calling a initialization function uart_probe(UART_COMM) to enable the second port. See main.c for a example usage and driver_uart.c for the implementation.

I2C

An I2C driver was added to the micropython port for the CPU board. It can access display information provided by PC monitors and determine available resolutions.

It works by configuring I/O pins for open-drain behaviour, thus electrically compatible with the I2C standard. See mphalport.h for implementation details.

The micropython script to run is: i2c_vga_ddc.py, which obtains the following information:

The script can be run from the Linux console with the mpremote command:

text
mpremote connect /dev/ttyUSB0 run demos/micropython/i2c_vga_ddc.py

The wiring can be done using the I/O board using a 40-pin FPC cable and direct wiring to the VGA connector as shown:

Software JPEG image decompression

A new function to decompress JPEG file was implemented, it's based on the C model of a Verilog decompressor, so in that form it's useful to test things in sofware before moving it to hardware. The original code was changed to avoid dynamic memory allocations thus easier to run in the bare metal environment, see target-cpu/f133-bare for sources.

A JPEG file is embedded in the firmware image by means of a direct include of the raw file data (.incbin directive in the rawdata.S assembler source)

The example image size is 33.8KB when compressed and 921.6 KB when decompressed (27:1 ratio). Software decompresion takes 195ms (5FPS) expected to reach 30FPS with the planned video decoder accelerator (Verilog).

Working example on the bare metal enviroment:

The decompression algorithm is in the c_model_jpeg_test.cpp source.

About NLnet Foundation

This project is funded through the NGI0 Entrust Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101069594.

Parts

241
QtyValueFootprintReferences
30TestPoint_SmallTestPoint:TestPoint_Pad_D1.0mmTP1, TP1, TP10, TP10, TP11, TP11, TP12, TP12, TP13, TP13, TP14, TP14, TP15, TP15, TP16, TP16 +14
260.1uFLibrary:C_0402_1005MetricC1, C1, C10, C10, C13, C13, C14, C14, C15, C15, C16, C16, C17, C17, C21, C21 +10
122.2uFLibrary:C_0402_1005MetricC4, C4, C8, C8, C9, C9, C11, C11, C20, C20, C22, C22
12CBG160808U601TInductor_SMD:L_0603_1608MetricFB4, FB4, FB5, FB5, FB6, FB6, FB7, FB7, FB8, FB8, FB9, FB9
12LOGOLOGOG***, G***, G***, G***, G***, G***, G***, G***, G***, G***, G***, G***
100.1uFCapacitor_SMD:C_0402_1005MetricC1, C2, C3, C4, C5, C6, C7, C8, C28, C28
80.1uCapacitor_SMD:C_0603_1608MetricC2, C2, C12, C12, C18, C18, C31, C31
810KResistor_SMD:R_0402_1005MetricR4, R4, R5, R5, R7, R7, R9, R9
810uCapacitor_SMD:C_0603_1608MetricC6, C6, C24, C24, C25, C25, C29, C29
8ESD7004MUTAGESD7004:UDFN10_517BB_ONS-LCR1, CR1, CR1, CR2, CR2, CR2, CR3, CR4
8VAL**Library:mouse-bite-2mm-slotmouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot
6100kResistor_SMD:R_0402_1005MetricR16, R16, R17, R17, R22, R22
6150k 1%Resistor_SMD:R_0402_1005MetricR11, R11, R12, R12, R15, R15
6DF12NB(3.0)-30DS-0.5V(51)Library:DF12NB3030DP05V51J1, J1, J1, J2, J2, J4
40Resistor_SMD:R_0402_1005MetricR10, R10, R13, R13
41.5uHInductor_SMD:L_Cenker_CKCS201610L2, L2, L3, L3
4100KResistor_SMD:R_0402_1005MetricR1, R1, R2, R2
410kResistor_SMD:R_0402_1005MetricR6, R6, R19, R19
44.7KResistor_SMD:R_0402_1005MetricR3, R3, R8, R8
4SolderJumper_2_OpenJumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mmJP1, JP1, JP2, JP2
4VAL**Library:mouse-bite-2mm-slot-singlemouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot, mouse-bite-2mm-slot
3Conn_01x40Library:FPC-SMD_40P-P0.50_L4.4-W25.6J1, J3, J3
3SolderJumper_3_Bridged12Jumper:SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mmJP1, JP3, JP3
2MH1, MH2
2150K 1%Resistor_SMD:R_0402_1005MetricR20, R20
21N5819WSDiode_SMD:D_SOD-323D2, D2
222uHInductor_SMD:L_Cenker_CKCS4020L1, L1
22N7002WT1GPackage_TO_SOT_SMD:SOT-323_SC-70Q1, Q1
25.1kResistor_SMD:R_0402_1005MetricR1, R2
2680k 1%Resistor_SMD:R_0402_1005MetricR14, R14
28.06K 1%Resistor_SMD:R_0402_1005MetricR21, R21
2Barrel_Jack_MountingPinLibrary:DC-IN-SMD_DC-045A-13AJ4, J4
2EA3036APackage_DFN_QFN:WQFN-20-1EP_3x3mm_P0.4mm_EP1.7x1.7mmU2, U2
2HDMI_AConnector_HDMI:HDMI_A_Amphenol_10029449-x01xLF_HorizontalJ2, J2
2MT3608Package_TO_SOT_SMD:SOT-23-6U3, U3
2MountingHoleMountingHole:MountingHole_2.2mm_M2_ISO7380H1, H2
2SOT-23-6Package_TO_SOT_SMD:SOT-23-6U100, U101
1100 ohm @ 100 MHzInductor_SMD:L_0603_1608MetricFB1
1BAT54CPackage_TO_SOT_SMD:SOT-23D3
1BL_POWERConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ3
1Conn_01x30Library:FPC-SMD_30P-P0.50_L4.4-W20.6J2
1DF12NB(3.0)-30DS-0.5V(51)Project root Library:DF12NB3030DP05V51J1
1DNP (10K)Resistor_SMD:R_0402_1005MetricR1
1FPC Cable connector 1x20Library:XFCN_F0501-B-20-20T-RJ1
1Fuse_SmallFuse:Fuse_0603_1608MetricF1
1JMP_DKENLibrary:SolderJumper-2_Open_RoundedPad_2.254x0.95mmJP1
1LVDSLibrary:FPC-SMD_40P-P0.50_L4.4-W25.6J2
1NCS8801Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP4x4mmU1
1NCS8805Package_DFN_QFN:QFN-56-1EP_7x7mm_P0.4mm_EP4x4mmU1
1SolderJumper_3_OpenJumper:SolderJumper-3_P1.3mm_Open_RoundedPad1.0x1.5mmJP1
1TXS0102DCUPackage_SO:VSSOP-8_2.3x2mm_P0.5mmU1
1TestPoint_SmallTestPoint:TestPoint_Pad_D2.0mmTP1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U1
1USB_C_Receptacle_USB2.0Connector_USB:USB_C_Receptacle_G-Switch_GT-USB-7010ASVUSB1

The 239 most common of 241 parts.

Questions

How big is the Panelized-2layer PCB?

It measures 74.6 × 73.2 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Panelized-2layer use?

241 parts, built around the MT3608, TP6841S6, EA3036CQBR and NCS8801S. 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 Panelized-2layer KiCad files?

From the openconcepts-ar/accel2d repository on GitHub, at the commit this page was made from: the board is hardware/Panelized/Panelized-2layer.kicad_pcb and its schematic hardware/CPU_board/CPU_board.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Panelized-2layer design in my own project?

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

More from openconcepts-ar/accel2d

12
  • 4 layers114.6 × 70.2 mmPanelized-4layer, the printed circuit board in 3D

    Panelized-4layer

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    470 parts1
  • 2 layers107.4 × 81.6 mmPanel, the printed circuit board in 3D

    Panel

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    437 parts1
  • 6 layers70 × 53.6 mmPanelized-6layer, the printed circuit board in 3D

    Panelized-6layer

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    318 parts1
  • 4 layers69.6 × 29.4 mmSpartan6 board, the printed circuit board in 3D

    Spartan6 board

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    169 parts1
  • 6 layers51.2 × 25.8 mmFPGA board, the printed circuit board in 3D

    FPGA board

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    165 parts1
  • 4 layers51.2 × 25.8 mmCPU board, the printed circuit board in 3D

    CPU board

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    111 parts1
  • 2 layers36.3 × 28.4 mmEDP adapter, the printed circuit board in 3D

    EDP adapter

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    89 parts1
  • 4 layers43 × 25.8 mmDVI receiver, the printed circuit board in 3D

    DVI receiver

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    59 parts1
  • 2 layers34.6 × 28.4 mmDVI adapter, the printed circuit board in 3D

    DVI adapter

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    51 parts1
  • 2 layers19.2 × 25.8 mmVGA adapter, the printed circuit board in 3D

    VGA adapter

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    38 parts1
  • 2 layers20.9 × 19.8 mmLVDS DVI adapter, the printed circuit board in 3D

    LVDS DVI adapter

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    18 parts1
  • 2 layers47 × 31 mmLVDS adapter, the printed circuit board in 3D

    LVDS adapter

    openconcepts-ar/accel2d

    This project aims to provide a graphics server system based on hardware accelerated graphics, and a easy way to develop the graphics primitives.

    11 parts1

Similar boards

  • 4 layers99.5 × 72 mmOne Air Max, the printed circuit board in 3D

    One Air Max

    Open-Air-Foundation/pcb-openair-max-main

    Open Air Max is AirGradient's professional outdoor air quality monitor, designed for autonomous, off-grid operation.

    242 partsCC-BY-SA-4.0
  • 4 layers60 × 71 mmLCD OLinuXino-15.6FHD Rev H, the printed circuit board in 3D

    LCD OLinuXino-15.6FHD Rev H

    OLIMEX/OLINUXINO

    OLINUXINO is Open Source / Open Hardware, low cost from EUR 24 Linux Industrial grade Single Board Computer capable to operate -25+85C

    68 parts1.5k
  • 2 layers39.3 × 145.9 mmSensor, the printed circuit board in 3D

    Sensor

    airiclenz/tethys

    Battery-powered wireless soil-moisture sensors report to a Raspberry Pi master over a 2.4 GHz nRF24 radio link. The master decides when to water, drives the pumps/valves, and serves a real-time web dashboard - all on…

    35 parts1MIT
  • 4 layers230 × 84.9 mmDrunkDashboard v2, the printed circuit board in 3D

    DrunkDashboard v2

    drunkbatya/DrunkDashboard

    STM32 powered pixel automotive dashboard

    223 parts1GPL-3.0
  • 2 layers72.4 × 58.9 mmSmartrelay, the printed circuit board in 3D

    Smartrelay

    acshi/home_automation

    52 parts
  • 4 layers100 × 60 mmMicro stratux, the printed circuit board in 3D

    Micro stratux

    ciborg971/micro_stratux

    compact and self powered project stratux fork

    145 parts1
  • 4 layers110 × 110 mmSmoothiev2-prime, the printed circuit board in 3D

    Smoothiev2-prime

    Smoothieware/Smoothieboard2

    Hardware files for the Smoothieboard v2, and extension boards

    453 parts71