Skip to content

§ Exhibition demo · E1M-AEN803

Trace Runner

An endless runner you play with your body, running entirely on one Alif Ensemble E8 module.

It is the demo Alp Lab runs at exhibitions. The display, the camera, the NPU, the IMU and three of the E8's cores all do visible work at once: pose estimation on the Ethos-U55, game logic on a Cortex-M55, and a 3D scene rendered by the Cortex-A32 pair. The full source ships as an Alp SDK example.

The Trace Runner character running, an animated pixel-art loop from the game
The runner's run cycle — original game art from the example.

§ How you play

Stand in front of the camera. Your arms are the controller.

Left and right are the player's own, as they see themselves on screen. Each raise fires once — lower the arm and raise it again to step again.

What counts as raised

The wrist must be more than 50 % of your shoulder width above the same-side shoulder, so the gesture is the same at any distance from the camera.

Response

A lane step lands about 100 ms after the arm crosses the line — the game waits that long to see whether the other arm follows, which would make it a jump.

No camera? Tilt the board

The board's IMU is the camera-less way to play: tilt the board to steer. HUD lamps — LEFT ARM, RIGHT ARM, BOTH ARMS, DUCK — light as the game acts on each gesture.

§ What runs where

Three cores at once, one module.

The game runs on an E1M-AEN803 (Alif Ensemble E8) on the E1M-EVK carrier, with an InnoMaker CAM-OV9281 mono global-shutter camera. Each core does the job it is built for, and they meet in shared on-chip memory.

Game and real-time I/O

Cortex-M55 HE

160 MHz

  • Game state and input
  • HUD overlay
  • Frame pacing
  • Watchdog for the A32 renderer

Vision

Cortex-M55 HP + Ethos-U55

400 MHz

  • OV9281 global-shutter camera
  • MoveNet SinglePose Lightning (int8) pose estimation on the Ethos-U55
  • Publishes a pose slot in shared SRAM0

3D rendering

Cortex-A32 (bare metal)

800 MHz

  • Booted by TF-A
  • NEON 3D renderer
  • Dual-core raster into the panel framebuffer
  1. OV9281 camera
  2. M55-HP + Ethos-U55: pose
  3. SRAM0 pose slot
  4. M55-HE: game + HUD
  5. A32 pair: 3D scene
  6. Panel

Default display

RK055HDMIPI4MA0, 720x1280 MIPI-DSI, portrait. The screen splits three-fifths game over two-fifths live camera view.

Large-format option

Riverdi RVT121HVDFWCA0-B, 12.1" LVDS, 1280x800, driven through a TI SN65DSI83 DSI-to-LVDS bridge. The panel is mounted on its side and the game stays portrait, rotated 90°. Switching panels changes only the shield in the build.

§ Measured on silicon

Bench numbers, not simulations.

Every figure below was measured on real E1M-AEN803 silicon on an E1M-EVK bench unit. Sources are the example's own records in the Alp SDK repository.

30.0 fps

Standalone, after each of three cold boots[1]

300 panel flips in 10 s with 0 dropped frames. E1M-AEN803 (2026W36-0009) on the E1M-EVK, RK055 panel, 2026-09-29.

7.19 ms

A32 frame time, both cores[2]

Golden display list rendered on both Cortex-A32 cores, against 13.30 ms on one core. Same unit, 2026-09-22.

0

Flip misses over 3 × 11 min[3]

v0.17.0 performance pass on an E1M-EVK bench unit with the Riverdi RVT121 panel, rotation 90, attract mode.

33.3–34.0 Hz

HP vision loop (was 25.3 Hz)[3]

Same performance pass. HP pre-processing 4.9–5.9 ms per frame, down from 10.3 ms.

  1. [1] aen-trace-runner README, bench status (2026-09-29 release bench) ↗
  2. [2] aen-trace-runner docs/2026-09-22-measurements.md, CP-A6 dual-core A32 raster ↗
  3. [3] alp-sdk CHANGELOG, v0.17.0 — trace-runner frame time and HP vision loop (#2807) ↗
An early Trace Runner 3D scene as rendered by the Cortex-A32 on an E1M-AEN803, read back from the framebuffer
Early A32-rendered frame, dumped over SWD from E1M-AEN803 2026W36-0009 on 2026-09-22 — an early version of the scene.

§ Straight from the framebuffer

A real frame, read back off the silicon.

No photo or video of the exhibit is published yet, so here is the next best thing: one of the first 3D scenes the Cortex-A32 rendered on the module, read out of the framebuffer over the debug port. It is an early version of the scene, shown as it came off the chip.

Status — what is not yet bench-proven

  • Body control on the Riverdi RVT121 build is not yet bench-tested. The panel itself runs on the bench; playing it with the camera has not been run there yet.
  • The combined camera + NPU + sound image for the M55-HP is build-checked and host-tested, but not yet run on the bench.
  • MoveNet inference latency on the Ethos-U55 has not been measured on silicon, so no figure is quoted here.

§ Why it matters

One module. One SDK. Your product instead of a game.

Swap the runner for an inspection line, a gesture-driven kiosk or a robot's vision stack: the pattern is the same. Camera capture goes through <alp/camera.h>, NPU inference through <alp/inference.h>, and the panel through <alp/display.h> — the same Alp SDK APIs you would build on. One gap is documented in the example: <alp/display.h> has no page-flip call yet, so the game reaches the display controller's driver directly for that.