Forum: FPGA, VHDL & Co. FPGA Neopixel Implementierung


von Hirosh D. (Gast)


Lesenswert?

Hallo,

ich wollte mein Projekt auf 
https://github.com/splinedrive/fpga_neo_pixel vorstellen.

Es geht darum, das ein Device (Soc, whatever)
ueber SPI LED-RGB-Daten an das FPGA schicken kann und mit einem Syncwort 
werden die Daten vom FPGA zu den ws2812-LEDs gerecht uebertragen.

Die Methoden der Adafruit-Library lassen sich auch nutzen,
wie das geht steht sieht man unter 
https://github.com/splinedrive/fpga_neo_pixel/tree/master/src

Die Adafruit-Library laesst sich leicht auf andere Plattformen 
portieren, da man die Show-Methode, die fuer die die Uebertragung 
verantwortlich ist, nicht mehr braucht. Der Rest verwaltet den Zustand 
der Leds. Die Show-Methode braucht nur eine SPI-Schnittstelle zur Not 
ein BitBang (wir muessen ja keine Timings einhalten). Es ist leicht den 
verilog-Code auf mehr Outputpins zu erweitern. Am Besten schickt man vor 
dem Synch noch ein Datum welches angibt, auf wieviel Pins die Daten 
aufgeteilt werden sollen. Das ist mein erstes verilog-Projekt und hat 
Spass gemacht und meinen Weihnachtsurlaub ausgefuellt.

Weitere Infos unter 
https://github.com/splinedrive/fpga_neo_pixel/blob/master/Readme.md

LG

Hirosh

Beitrag #6127745 wurde von einem Moderator gelöscht.
von chris (Gast)


Lesenswert?

>ich wollte mein Projekt auf
>https://github.com/splinedrive/fpga_neo_pixel vorstellen.

Nett gemacht. Das Repository mit dem Make-File für Yosys sieht ziemlich 
aufgeräumt aus.

Ich nehme an, das ganze läuft bei Dir unter Linux.
Hier gibt's die Möglichkeit, NeoPixel-Led-Panels auf dem PC 
"vorzusimulieren":

https://github.com/marcmerlin/ArduinoOnPc-FastLED-GFX-LEDMatrix

Vielleicht kannst Du noch ein wenig Inspiration schöpfen.

von Amir D. (splinedrive)


Lesenswert?

Hi Chris,

ja das ganze laeuft stabil, ich habe es mit 60 Leds ueber Tage in 
Kombination mit einem Arduino laufen lassen. Ich wollte ein Device 
schaffen das die Timingconstraints fuer den ws2812 uebernimmt.
Man muss die RGB-Daten ueber SPI schicken und den Rest uebernimmt der 
FPGA. Das schoene daran ist, das man die Adafruit-Neopixel-Library in 
gewohnterweise nutzen kann und es kein grosser Aufwand ist, diese auf
andere Plattformen zu portieren, da man den ganzen Assemblercode nicht 
mehr braucht. Die Show-Routine braucht nur SPI, zur Not implementiert 
man dies ueber SPI-Bitbang.

Das Thema ist fuer mich durch, ich habe FPGAs neu entdeckt. Da gibt es 
soviele Themen noch zu entdecken und nachzuimplementieren von 
Filterstrukturen, AI, CPUs (RISCV), Controller, etc.

Das Projekt war eine gute Uebung fuer mich bzgl.: Crossclockdomains, 
Statemachines, verilog, ...

Vielleicht hat ja jemand eine Anwendung dafuer.

LG

Hirosh

von c-hater (Gast)


Lesenswert?

Hirosh D. schrieb:

> ja das ganze laeuft stabil, ich habe es mit 60 Leds ueber Tage in
> Kombination mit einem Arduino laufen lassen. Ich wollte ein Device
> schaffen das die Timingconstraints fuer den ws2812 uebernimmt.
> Man muss die RGB-Daten ueber SPI schicken und den Rest uebernimmt der
> FPGA.

Damit das klappen kann, muss der FPGA aber Speicher haben, um die Daten 
zu puffern, richtig?

Also habe ich die Wahl, einen zusätzlichen FPGA und zusätzlichen 
Speicher zu verwenden oder einfach Programmieren zu lernen, um das 
Problem mit dem µC zu erschlagen. Richtig?

Also ich ziehe Variante 2 deutlich vor... Hab' allerdings auch nix mit 
Arduino am Hut...

von Baendiger (Gast)


Lesenswert?

c-hater schrieb:
> Also habe ich die Wahl, einen zusätzlichen FPGA und zusätzlichen
> Speicher zu verwenden oder einfach Programmieren zu lernen, um das
> Problem mit dem µC zu erschlagen. Richtig?

Bei sehr vielen LEDs und hohen Bildwiederholraten kann der FPGA schon 
nötig werden

von Amir D. (splinedrive)


Lesenswert?

FPGA Neopixel Device
====================
I was really impressed with the Adafruit Neopixel demo. The rainbow 
effect looks so nice :).
It cost me around 5 minutes to setup the environment for the Adafruit 
Neopixel.
While studying the Adafruit Neopixel implementation and the datasheet of 
the ws2812,
some things immediately stood out: Assembly for each soc, disabling 
interrupts to get the
right timings for each soc shape, etc.

Now I have a reason to buy an oscilloscope to the see the output of the 
1-wire.
I experiemented with my own assembly implementation counting the 
machinecode cycles of
ATmega328 to setup ws2812 leds over one wire. The protocol has heavy 
time constraints +-150ns and the the data of
leds has to transmit one after another 
(https://cdn-shop.adafruit.com/datasheets/WS2812.pdf).
Here is an example of a 36 foot long neopixel strip 
https://www.youtube.com/watch?v=I-lR19_kigs.
The conclusion is that it makes no sense for me, since it is not 
portable.
To disable interrupts in impeded environments with sensitive application 
is not ideal.
There are some exceptions, such as the Rasperry Pi which has a real-time 
implementation
by using PWM with supported DMA 
(https://learn.adafruit.com/neopixels-on-raspberry-pi/overview).
Keeping timings conditions on a ATmega328 is feasible but on a CORTEX-A 
without HW-Support
running a sensitive application with caches, disabling interrupts is a 
bit extreme.
So I started my FPGA hobby project and dove right into FPGA programing 
and verilog.
My approach is using a SPI to collect 24-RGBs-Strips-Data and a SYNC 
from a impeded SoC.
Another approach I came up with is to reuse the 
Adafruit-Neopixel-Library.
I attached my FPGA_NeoPixel.h file. Technically it inherits from 
Adafruit_NeoPixel and overwrites
the void show() with SPI-Code so you are able to use the methods from 
Adafruit_Neopixel to set
leds or calculate color spaces. I have tested it on an Arduiono-Nano but 
it is easy to
port the Libs to other SoCs. The only things that matter are the SPI and 
Neopixel managment.

The implementation is based on an iceFun (ice40-hx8k, 
https://www.robot-electronics.co.uk/icefun.html). It is easy to port it 
to another FPGA,
you only have to specify the frequency and pins. The current 
implementation is using a 16K-Fifo (ice40-hk8),
maybe you can even try to control an 16k strip with it ;)
A short video shows the result 
https://www.youtube.com/watch?v=bKlIKz7Y1Lk of my implementation.

A FPGA has many I/Os just extend it to many 1-wire-outputs to handle 
more strips in parallel.
I will make my fpga project available on github and if you find the time 
to take a
look and tinker with it, I would be grateful for any feedback.
Some background why I started this project.

I searched for an open source command based verilog compiler and I found
Icarus Verilog  (http://iverilog.icarus.com/) + gtkwave from  Stephen 
Williams.
In this context I found verilator which is awesome. 
(https://www.veripool.org/)
Probably by accident I found the icestorm project by Mr.
Cliffword and I was so impressed by yosys and arachne-pnr/nextpnr 
because Synthesis is a domain
of some companies like synopsis, cadence, mentor graphics with very 
expensiv license costs.
In my opinion Mr. Cliffword changed the rules in circuit design 
(http://opencircuitdesign.com/).
I am very greatful to him. Now we have compilers for programming 
languages,
operating systems and circuit design tools FOSS like - it is so amazing.

von Martin S. (strubi)


Lesenswert?

Moin,

nettes Projekt. Du koenntest auch gleich noch eine CPU mit in den ICE40 
reinbauen, sollte locker fuer einige LEDs reichen.
Ich hab' so einen WS2812-Spass etwas anders aufgezogen und eine PWM-Bank 
(eigentlich fuer Motoren gedacht) drauf angesetzt.
Pro Pixel schreibt man dann nur noch je einen 32-bit-Wert (effektiv 24 
benoetigt) in die entsprechende PWM-Unit, die PWM clockt dann je nach 
Bit das eingestellte Pulssignal ein.
Kann man dann im Timer-Interrupt machen, derweil die CPU dann 
irgendwelche lustigen Farbanimationen berechnen darf. Fuer die grossen 
LED-Panels hat's dann allerdings DMA gebraucht. Mit einem uC waere das 
in der Form eine heillose Frickelei geworden.

von Amir D. (splinedrive)


Lesenswert?

Hallo Martin,

hoert sich gut an. Der Ice40 war halt zur Hand und habe auch billige 
FPGAs von Gowin, da hat die Portierung 10 Minuten gedauert. Ich wollte 
die Komplexitaet auf SW-Ebene weg haben. Ich hatte ja selber in 
AVR-Assembler was ausprobiert mit WS2812 und hatte die Adafruit-Library 
studiert und dachte mir, das kann es doch nicht sein :). Und auf einem 
Cortex-A ist die Sache richtig schwer hinzubekommen, siehe z.B. 
Raspi-Implementierung (Realtime nur ueber DMA-PWM).

LG

von Michael W. (Gast)


Lesenswert?

Hirosh D. schrieb:
> A FPGA has many I/Os just extend it to many 1-wire-outputs to handle
> more strips in parallel.
> I will make my fpga project available on github and if you find the time
> to take a

But this has already been done a lot of times so far, if i have a closer 
look on the open source projects. I also recognized several projects in 
the industrial invironment. Most 2D-LED large scale graphic arrays are 
organized this way. The only issue compared to DIY project is update 
rate.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.