WS2812 RGB LED String Driver

WS2812 RGB LED String Driver


Category: Uncategorized

Created: October 28, 2013

Updated: January 27, 2020

Language: VHDL

Other project properties

Development Status: Beta

WishBone compliant: No

WishBone version: n/a

License: LGPL


Have you ever wanted to add some color to your project? Then this might be your answer. The WS2812 RGB LED "pixels" and WS2811 driver ICs are available for an encouragingly low cost from various sites on the internet, and they come in strips which can be cut or joined to the desired length. Since the Red/Green/Blue (RGB) LEDs inside the WS2812 part are driven by the serial driver IC which is also inside the part, only three wires are needed, and your project can set each LED color independently of the others.

The connections to the LED strip include 3 wires: +VCC, GND, and data. It turns out that these LEDs will work over a pretty wide supply voltage range. The ones I got said 4-7VDC, but I've found that they work pretty well using +3.3V as the supply voltage!

The format of the serial data stream used to drive the LEDs is given in the comments inside the VHDL code, and it can also be found by browsing the internet. For those who don't read Chinese (myself included) there is now a data sheet available in English! The color settings are 8-bits for each color, for a total of 2^24 combinations.

The VHDL module in this project was recently used in a Lattice Semiconductor FPGA. However, it does not include architecture specific macros, so it should be easy to use on any given FPGA or CPLD. It is parameterized so that the user can determine how many LEDs to drive.

The color data is provided to the module by an input data bus, using an address to select which LED and which color is being loaded.

My VHDL coding style uses the "unsigned" type instead of the "std_logic_vector" type. It is easy to translate between the two using functions in "convert_pack.vhd", or you can go through and modify the code to use std_logic_vector instead.