There is a type of RGB LED from Grove called the "Chainable RGB LED", which uses the P9813 driver IC. This core drives a string of those. It is not a complicated core, but it definitely might save someone the time and effort required to put something like this together and test it out, when they are in need of an RGB pixel of this type in their project.
I put my modules together into VHDL packages. The P9813 driver core is contained in the file "rgb_pixel_pack.vhd", along with two other RGB pixel drivers (which have separate projects here on OpenCores).
There is a complete Lattice Diamond project, showing the core being used in a Lattice Brevia FPGA development board. The example project only has one P9813 RGB "pixel" but I did test this core out with two pixels, and it works. You can add many such pixels, by just updating the N_LEDS generic of this fully parameterized core.
To use with multiple pixels, simply use the "c_adr_o" signal to select which RGB values get driven into the red_i, grn_i and blu_i inputs.
It is very simple, really. There is no documentation. For years I have been using "unsigned" instead of "std_logic_vector." It is my choice, because it makes it easier for me to do conversions in VHDL to and from the integer type, and I can use the resize function directly.
If you need to convert from unsigned to std_logic_vector, just add a conversion statement such as this:
output
Please enjoy this small core, and let me know if it works for you.