102 Custom DVD Screensaver for VGA

102 : Custom DVD Screensaver for VGA

Design render

tt_um_uacj — VGA Logo Bouncer

A Tiny Tapeout digital design that displays a 128×40 pixel bitmap logo bouncing around a 640×480 VGA screen, with real-time visual effects controlled via the input pins.


Overview

The design generates a standard VGA signal (640×480, 60 Hz) and animates a bitmap logo that bounces within the visible area, cycling through colors on each wall collision. Eight visual effects are individually controlled by the bits of ui_in.


Pinout

Inputs (ui_in)
Bit Name Description
0 cfg_tile Tile mode: repeats the logo across the entire screen
1 cfg_color Enables dynamic color palette
2 cfg_invert Swaps foreground and background colors
3 cfg_slow Halves the animation speed
4 cfg_flip Flips the logo vertically
5 cfg_checker Enables checkerboard background pattern
6 cfg_scanline Simulates CRT scanlines
7 cfg_glitch Enables the visual corruption (glitch) engine
Outputs (uo_out) — TinyVGA PMOD
Bits Signal
[7] HSYNC
[6] B[0]
[5] G[0]
[4] R[0]
[3] VSYNC
[2] B[1]
[1] G[1]
[0] R[1]

Compatible with the standard Tiny Tapeout TinyVGA PMOD.

Bidirectionals (uio_*)

Not used. uio_out and uio_oe are held at 0.


Timing Parameters

Parameter Value
Clock (clk) 25 MHz (40 ns period)
Reset Active-low (rst_n)
Resolution 640 × 480 pixels
Refresh rate ~60 Hz
Logo size 128 × 40 pixels

Modules

tt_um_uacj (top)

Top-level module. Instantiates all submodules and implements:

  • Bounce logic: the logo starts at (200, 200) and travels diagonally. On each wall hit, the corresponding direction is reversed.
  • Collision flash: for 6 frames after a bounce, the logo is rendered in full white.
  • Speed divider (cfg_slow): when active, the logo advances one pixel every two frames.
  • Dynamic color: the color index increments on each bounce and is applied to the logo, background, and checkerboard pattern through the 8-color palette.
hvsync_generator

Generates horizontal and vertical sync signals according to the VGA standard:

Parameter Value
H_DISPLAY 640
H_FRONT porch 16
H_SYNC 96
H_BACK porch 48
V_DISPLAY 480
V_BOTTOM border 10
V_SYNC 2
V_TOP border 33

Exposes hpos and vpos (10-bit each) and the display_on signal indicating when the beam is within the visible area.

bitmap_rom

A 640-byte read-only memory (40 rows × 16 bytes) storing the monochrome logo bitmap at 128×40 pixels (1 bpp).

  • Addressing: addr = y[5:0] * 16 + x[6:3]
  • Pixel extraction: pixel = mem[addr][x[2:0]]
  • Supports vertical flip via cfg_flip.
palette

An 8-entry LUT in 6-bit RRGGBB format (2 bits per channel):

Index Color Value
0 Cyan 001011
1 Pink 110110
2 Green 101101
3 Orange 111000
4 Purple 110011
5 Yellow 011111
6 Red 110001
7 White 111111

Instantiated three times: logo color, background color, and checkerboard color.


Glitch Engine

When cfg_glitch = 1, a visual corruption engine is activated based on an 8-bit LFSR (taps at positions 7, 5, 4, 3). The engine runs a 3-state FSM:

State Description
0 Idle — waiting for a trigger
1 Active corruption (runs for glitch_timer frames)
2 Recovery (1-frame transition back to idle)

Effects applied during corruption:

  • Horizontal/vertical XOR scrambling: pixels are displaced using an LFSR-derived mask.
  • Horizontal tearing: selected rows are offset laterally by a pseudo-random amount.
  • Chromatic aberration: each RGB channel receives an independent XOR from the LFSR.
  • Channel swapping: R↔G and G↔B are permuted based on LFSR bits.
  • Inversion flash: at maximum intensity, colors are inverted on select frames.

The glitch engine also triggers automatically approximately every 150 frames while cfg_glitch = 1.


How to Use

  1. Connect the TinyVGA PMOD to the uo_out pins.
  2. Connect a VGA monitor to the PMOD.
  3. Supply a 25 MHz clock on clk.
  4. Assert rst_n = 0 briefly at startup, then release (rst_n = 1).
  5. Control visual effects with the 8 bits of ui_in as described in the pinout table above.

Project Files

File Description
tt_um_uacj.v Top module: animation, effects, RGB output
hvsync_generator.v VGA sync signal generator
bitmap_rom.v Logo bitmap ROM (128×40, 1 bpp)
palette.v 8-color palette LUT
config.json Tiny Tapeout build config (25 MHz clock)

License

Apache 2.0 — © 2024 Tiny Tapeout LTD / UACJ IIT

IO

#InputOutputBidirectional
0cfg_tileR1
1cfg_colorG1
2cfg_invertB1
3cfg_slowVSync
4cfg_flipR0
5cfg_checkerG0
6cfg_scanlineB0
7cfg_glitchHSync

Chip location

Controller Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux Mux tt_um_chip_rom (Chip ROM) tt_um_factory_test (Tiny Tapeout Factory Test) tt_um_utoss_riscv (UTOSS RISC-V core) tt_um_memory_game_top (Number Memory Game) tt_um_danielpenas42 (Ball Display) tt_um_machinelearning (7-Segment Neural Predictor) tt_um_microlane_demo (microlane demo project) tt_um_pixel_processor (Tiny Pixel Processor) tt_um_jpigdon_gps_accelerator_top (GPS_Accelerator) tt_um_rgb_mixer (rgb_mixer) tt_um_bgao43 (Tiny TPU Systolic Array) tt_um_main (Pong in Verilog) tt_um_joannec34_teenytpu (teenytpu) tt_um_apa102_ws2812_squidgeefish (APA102 to WS2812 Translator) tt_um_uacj_bouncing_DVD_screensaver (Custom DVD Screensaver for VGA) tt_um_logoUACJ_MOGA (VGA_screensaver_UACJ) tt_um_grace_spi_led_driver (SPI-Controlled 8-Channel LED Driver) tt_um_rebeccargb_universal_decoder (Universal Binary to Segment Decoder) tt_um_rebeccargb_hardware_utf8 (Hardware UTF Encoder/Decoder) tt_um_happyhop_deadcast2 (happyhop) tt_um_dino7 (Dino-7: 7-Segment Runner Game) tt_um_arty3_mac_engine (Simple MAC Engine w/ Postproc) tt_um_uacj (Custom DVD Screensaver for VGA) tt_um_algofoogle_dottee (DOTTEE VGA demo (TTGF26a)) tt_um_mattvenn_signal_generator (Simple Signal Generator) tt_um_urish_simon (Simon Says memory game) tt_um_tpu (Tensor Processing Unit For GF) tt_um_gojimmypi_ttgf_UART_FSM_TRNG_Lab (Hardware Entropy Explorer: UART/SPI TRNG and PUF) tt_um_wokwi_465483277165299713 (First Tinytapeout) tt_um_prem_pipeline_test (Programmable_Pipeline-RISC-V) tt_um_wokwi_467219410242853889 (Tiny Tapeout testtest 111233) tt_um_wokwi_465549494272929793 (Pacos first design) tt_um_wokwi_465731371445677057 (Arturo's first Wokwi design) tt_um_wokwi_465732744934845441 (Tiny Tapeout Template_1234) tt_um_wokwi_465736492859711489 (Tiny Tapeout Workshop JuanF) tt_um_wokwi_465731430225727489 (Rafa’s first Wokwi design) tt_um_wokwi_465731458365332481 (7 segment Display Fli-Flop Try-out) tt_um_wokwi_465732744245929985 (DiseñoCursoTiny) tt_um_wokwi_465731490568160257 (Matt’s first Wokwi design) tt_um_wokwi_465736691688630273 (test1) tt_um_wokwi_465731458628527105 (Mi copia del Tiny Tapeout) tt_um_wokwi_465731520738845697 (El primer diseño) tt_um_wokwi_465731521356457985 (Tiny Tapeout Template Copy) tt_um_gen1_digital_companion_tile (Gen1 Digital Companion Tile) tt_um_wokwi_465732827753495553 (Tiny Tapeout Template Ayman) tt_um_wokwi_465731394728267777 (Julian_Proyecto) tt_um_wokwi_465731458535202817 (Tiny Tapeout Template Copy) tt_um_wokwi_465732847401723905 (Basic Circuit) tt_um_wokwi_465731452481768449 (El primer diseño de Matt para Wokwi) tt_um_wokwi_465731502018614273 (Tiny Tapeout Template flip flop) tt_um_wokwi_465732616714924033 (Tiny Tapeout RJAP) tt_um_wokwi_465731575275296769 (ocxpkeWokwiDesign) tt_um_wokwi_465732880722332673 (Pedro Template) tt_um_wokwi_465731858252480513 (Paula's first Wokwi design) tt_um_wokwi_465731455677830145 (Tiny Tapeout JMCG) tt_um_wokwi_465737601403996161 (Tiny Number Simon) tt_um_ttmul (Balanced Ternary Multiplier) tt_um_wokwi_465731466664816641 (Tiny Tapeout Workshop Malaga 2jun2026) tt_um_8bit_risc_cpu (8-bit RISC CPU) tt_um_wokwi_451184391728659457 (Simple Sprinkler) tt_um_fhw_appel_spiPWMio (spiPWMio) tt_um_divadnauj_GB_serv_soc_wb (serv_soc_wb) tt_um_8bitcustomcomputer (SAP 8 Bit Computer) tt_um_bioimpedance (Very Low Resource Digital Implementation of Bioimpedance Analysis) tt_um_mgj_bist8 (BIST-8: Built-In Self-Test for 8-bit CLA Adder) tt_um_roberto_tiny_radar_tile (BioPulse Tile) tt_um_systolic_mac_2x2 (2x2 Systolic Array Matrix Multiplier) tt_um_peg_top (2x2 CNN Accelerator PE Grid with UART) tt_um_AlvaroRub_ringcounter (Counter16Outputs) tt_um_wokwi_465731440267947009 (Antonio's first Wokwi design) tt_um_wokwi_465732706576877569 (Guille's first Wokwi design.) tt_um_wokwi_465731481873367041 (MIPS-Lite 8-bit Processor) tt_um_wokwi_465736612213902337 (Juan`s first Worki design) tt_um_wokwi_465731439156454401 (Rhyloo’s first Wokwi design) tt_um_wokwi_465732536551273473 (Tiny Tapeout Marcos Fernandez) tt_um_wokwi_465737290543084545 (Tiny Tapeout Template) tt_um_wokwi_465630130495825921 (ram 1 bit Copy) tt_um_wokwi_465731403724006401 (sdft wokwi 1) tt_um_top (RHD2164-MCU-SPI Bridge) tt_um_line_follower_arvaloez (Line Follower Robot controller) tt_um_xoroshiro64plus_v2 (xoroshiro64) tt_um_ohuettenhofer_tiny_qsim (Tiny Quantum Circuit Simulator) tt_um_santhosh_ring_osc_gf (Ring Oscillator PVT Sensor & TRNG (GF180)) tt_um_santhosh_stoch_stdp_pair_gf (Stochastic neuron + STDP controller (merged, GF180)) tt_um_santhosh_rsd_char_gf (RRAM Characterization Platform (DC sweep + endurance + retention + histogram, GF180)) tt_um_santhosh_xbar_ctrl_gf (Memristive Crossbar Peripheral Controller (GF180)) tt_um_joseph_bf (BF) tt_um_hydrocomms (FSK Modem) tt_um_systolic_array (2x2 MAC Systolic array with DFT) tt_um_kluterirv_rv32e_core (Minimal RV32E SoC with UART Loader) tt_um_algofoogle_ttgf26a_vco (VCO driven by DAC) tt_um_fer_logo_music_vga (UNIZG-FER VGA project) tt_um_maqsudbek_dyadic_pwm (Dyadic PWM) tt_um_waferspace_vga_screensaver (Wafer.space Logo VGA Screensaver) tt_um_htfab_vga_tester (Video mode tester)