RGB Mixer Chip¶
Why this project¶
I work at a FabLab with high school students. I wanted a project that is concrete enough for a beginner — turn a knob, see an LED change — but technical enough to go deep: encoder decoding, debouncing, PWM, synthesis, timing closure, tapeout. RGB Mixer works on both levels.
This was also personally hard. I made many mistakes throughout this course — wrong PDK paths, broken netlists, failed GDS exports — and had to work through each one. That process is documented in the session pages. The chip design itself is not complex, but understanding why each step works took real effort.
Reference design: tt05 RGB Mixer by Matt Venn — reimplemented from scratch.
What it does¶
Three rotary encoders control the brightness of Red, Green, and Blue LEDs independently via PWM. Turn clockwise to increase brightness, counter-clockwise to decrease. Three identical pwm_channel modules run in parallel inside rgb_top.
Block Diagram¶

Each channel: encoder input → debounce → 8-bit counter → PWM generator → LED output. Clock: 10 MHz.
Simulation¶

All three PWM channels verified with an iverilog testbench. At reset each channel defaults to 50% duty cycle.
Synthesis¶

270 Sky130 standard cells after Yosys synthesis. 48× dfrtp_1 flip-flops (the three 8-bit counters). Zero latches.
Place & Route¶


270 cells placed in 2658 µm² at 11% utilization. Timing closed with 98.29 ns slack against a 100 ns clock period.
Layout¶

dfxtp_1 D flip-flop from the Sky130 standard cell library — the building block of the counters.

Numbers¶
| Parameter | Value |
|---|---|
| Process | Sky130 — 130nm |
| Standard cells | 270 |
| Design area | 2658 µm² |
| Utilization | 11% |
| Total power | 54.3 µW |
| Timing slack | 98.29 ns (MET ✓) |
| Critical path | 1.58 ns |
| Supply voltage | 1.8V |
Tools¶
| Stage | Tool |
|---|---|
| RTL Simulation | iverilog + GTKWave |
| Linting | Verilator |
| Synthesis | Yosys |
| Place & Route | OpenROAD |
| Layout Viewer | KLayout |
| Analog Verification | ngspice |
| PDK | SkyWater Sky130 |