Project overview
A Matrix-style digital rain screen generated entirely in programmable logic on the original Zybo. Characters fall downward at different speeds, with pale bright heads, fading trails, and black gaps between streams. No processor application, Linux, external input, DDR controller, or software framebuffer is required.
Characters that fall like rain
The screen is divided into 80 columns and 45 visible rows, using 16 × 16 pixel cells. Each column has an independent head position and deterministic pseudo-random state. Heads advance downward and wrap through a virtual 64-row ring, allowing streams to disappear offscreen before returning.
Trails fade over 8–15 cells. The character ROM contains 32 glyphs: digits 0–9 and letters A–V, drawn with scaled 5 × 7 bitmaps. Changing glyphs and per-column speeds keep the screen moving while preserving repeatable reset behavior.
High-level architecture
The renderer uses three registered pixel stages. Pixel coordinates, character-ROM output, brightness, active-video, and sync signals remain aligned. Animation state changes during vertical blanking, keeping each displayed frame internally consistent.
The project reuses AdeelLib video clocks, timing, HDMI transmission, TMDS encoding, and output-register IP. The configured pixel clock is 74.21875 MHz, producing 1280 × 720 video at approximately 59.975 Hz.
Notebook architecture

Board controls
- SW1:0: normal, slow, fast, or turbo falling speeds.
- SW2: freeze positions and character animation.
- SW3: select cyan instead of classic green; palette changes also work while frozen.
- BTN0: reset animation, deterministic seeds, and video timing.
Simulation-rendered preview

Validation & current status
The repository validation record dated 8 October 2026 reports three passing RTL tests, portable synthesis of the renderer and character ROM, and successful Vivado synthesis, placement, routing, and bitstream generation. Tests cover glyph rows, blanking, sync and reset, frozen pixel stability, animation wraparound, both palettes, and all speed modes.
- Setup slack: +3.021 ns; hold slack: +0.023 ns.
- 1,320 LUTs, 1,894 registers, one RAMB18, and three DSPs in the reused TMDS encoders.
- No failing setup/hold endpoints or DRC errors; twelve DRC warnings are documented for video DSP pipelining, ROM reset controls, and the PL-only configuration.
Scope
Targets the Zybo XC7Z010-CLG400-1. A display that supports the configured 720p mode is required. The deterministic random generators provide visual variety and repeatability; they are not intended for cryptographic use.