Forum: FPGA, VHDL & Co. RGB LED Matrix mit FPGA?


von Pepe (Gast)


Lesenswert?

Hallo,

ich bin in Sachen FPAG noch ganz am Anfang und lerne gerade 
autodidaktisch mit nem Xilinx S3AN StarterKit und  folgenden beiden 
Büchern:
VHDL-Snythese Entwurf digitaler Schaltungen und System von Reichardt und 
Schwarz
FPGA Prototyping by VHDL Examples von Pong P. Chu

Dazu gleich die erste Frage: Sind das geeignete Lehrmittel zum Einstieg 
in die Materie? Was ich bisher gelesen habe scheint mir ganz gut 
verständlich und einige Beispiele konnte ich schon gut nach-bauen. Aber 
vielleicht gibt es ja noch weitere / bessere Literatur?

Im Moment bin ich wie gesagt noch dabei alles von Null auf zu erlernen. 
Vorerfahrungen habe ich  nur mit AVRs gemacht.

Wenn ich mit dem Durcharbeiten der Literatur fertig bin habe ich 
folgendes Projekt ins Auge gefasst und würde gern von euch wissen ob das 
so realisierbar ist und wie ihr das angehen würdet. Ich erwarte keine 
fertigen Lösungen, der Lerneffekt ist mir äußerst wichtig!

Zum Projekt:

Ich habe eine LED-Matrix der Größe 32x16 in RGB. Diese habe ich 
seinerzeit mit einem (einzigen!) ATMEGA 328 in Betrieb genommen und 
(meiner Meinung nach) alles aus dem µC rausgeholt was geht. Ich mache 
damit Multiplexing auf 3x512 LEDs simultan und komme mit den 16MHz 
Systemtakt auf 216 Farben bei noch hinnehmbarer Wiederholrate. Mehr 
schafft der AVR einfach nicht. Das Projekt kann man sich hier anschauen:

https://sites.google.com/site/arduinodiyprojects/projects/Modular-Plasma-Wall

Ich dachte ich mir nun, dass es doch eine gute Herausforderung und ein 
wahnsinniger Lerneffekt wäre die bereits fertige Matrix mal mit nem 
FPGA anzusteuern um zu schauen ob es nicht möglich wäre 24bit (8 pro 
Farbe) Farbtiefe zu realisieren. Schön wäre es natürlich wenn die 
Farbtiefe in Wirklichkeit bei 12 oder 13 bit pro Farbe läge und ich über 
den FPGA ne exponentielle Anpassungen hinbekäme um dann auf 256 echte 
lineare Farbstufen zu kommen.

Nun kommt erschwerend hinzu, dass meine Matrix NICHT im klassischen 
Sinne aufgebaut ist, d.h. ich habe nicht  16 Zeilen mit je 32 LEDs und 
muxe NICHT  1:16. Vielmehr funktioniert das Ganze so:

Die Gesamtkonstruktion besteht aus insgesamt 8 Segmenten mit jeweils 8x8 
LEDs. Hinter jedem Segment sitzt ein „Treiberboard“ mit 4 
Schieberegistern (1xr; 1xg; 1xb; 1xZeilen).  Die Segmente sind in zwei 
Reihen angeordnet eine obere und eine untere. In den beiden Reihen sind 
die Schieberegister einer Farbe sowie die Schieberegister für die Zeilen 
immer in Reihe geschaltet. Ich habe also insgesamt. 8 Datenleitungen die 
vom µC weggehen. Zur besseren Übersicht habe ich unter oben genanntem 
Link ein paar Schemata gezeichnet.

Wenn ich das Ganze jetzt auf den FPGA portieren möchte werde ich mir 
natürlich die Tatsache zur Nutze machen, dass so ein Teil mit sehr 
vielen I/Os daherkommt. Also soll jedes Schieberegister eine extra 
Datenleitung  bekommen.

Der ganze Aufbau soll dann also so aussehen:

Der FPGA bekommt über SPI Daten vom µC. 512 byte pro Farbe. Nun soll der 
FPGA die 512 byte in 8 Segmente teilen und für jedes Segment ein 
multiplexing machen und dann an das entsprechende Schieberegister 
ausgeben.

Ich hoffe das ist einigermaßen anschaulich!?

Ich stelle mir nun die Frage ob ich nicht ein Problem mit der Kapazität 
bekomme? Ich denke ich bekomme es irgendwie hin ein Schieberegister in 
VHDL zu schreiben welches 512byte aufnimmt. Das bräuchte ich dann aber 3 
mal (r,g,b). Also müssten im FPGA rund 1.5kB „zwischengespeichert“ 
werden. Geht das überhaupt?

Jetzt haben also die 3 virtuellen Schieberegister 3*512 byte 
aufgenommen. Und nun müssen diese auf 8*3=24 „MUX-Bausteine“ aufgeteilt 
werden die dann parallel laufen. Und zum Schluss hängt an jedem 
MUX-Baustein noch ne Logig die die Daten bit-weise raus schaufeln muss. 
Die Ansteuerung der Zeilen habe ich jetzt mal außen vor gelassen, die 
sollte das Kraut nicht fett machen :-)

Bevor ich jetzt zu viel Gehirnschmalz da reinstecke wollte ich euch 
fragen ob das denn überhaupt irgendwie realisierbar ist und wie ihr das 
angehen würdet?

Sorry für den vielen Text und schon einmal besten Dank für die 
Antworten!

LG,

Pepe

von Duke Scarring (Gast)


Lesenswert?

Pepe schrieb:
> VHDL-Snythese Entwurf digitaler Schaltungen und System von
> Reichardt und Schwarz
> FPGA Prototyping by VHDL Examples von Pong P. Chu
Ja, die beiden sind ganz gut; relativ anschaulich und auch 
praxistauglich, zumindest für kleine bis mittlere Projekte. Was besseres 
habe ich (leider) noch nicht gefunden, denn Verbesserungspotential sehe 
ich bei beiden Büchern.


Pepe schrieb:
> Bevor ich jetzt zu viel Gehirnschmalz da reinstecke wollte ich euch
> fragen ob das denn überhaupt irgendwie realisierbar ist und wie ihr das
> angehen würdet?
Prinzipiell ist Deine Idee schon für einen FPGA geeignet. Wie Du schon 
erkannt hast, kannst Du Deine Module damit parallel ansteuern (nicht 
nacheinander wie beim AVR).

Meine Herangehensweise wäre: divide et impera
Immer eine kleine Funktionalität ausgiebig testen (Stichwort: Testbench) 
und zu größeren Modulen kombinieren.

Achja, die 3x512 Byte passen auch schon in einen kleineren FPGA.
Mit z.B. einem GODIL_XC3S500E [1] solltest Du ganz gut hinkommen.

Duke

[1] 
http://www.trenz-electronic.de/de/produkte/fpga-boards/oho-elektronik.html

von Pepe (Gast)


Lesenswert?

Hallo Duke,

vielen Dank für die schnelle Antwort!

Da bin ich ja schon mal beruhigt wenn sich das prinzipiell machen lässt!

Ich habe die Hardware übrigens schon da in Form eines Xilninx Spartan 
3AN Starter Kits bestückt mit einem XC3S700AN.

>Immer eine kleine Funktionalität ausgiebig testen (Stichwort: Testbench)
und zu größeren Modulen kombinieren.

Genau darin tue ich mich gerade schwer. Ich weiß immer nicht so recht 
was als "klein" sinnvoll ist und was nicht! Bsp.: Ich brauche ja 
definitiv drei Eingangsregister mit einer Breite von 512 byte. Nun 
stelle ich mir die ganze Zeit die Frage ob man das besser als eine 
entity macht oder ob man erst mal ein einfaches 8bit-SR schreibt und 
dann zu nem großen zusammenstückelt. Ähnlich wird es mir sicher bei den 
MUX-Einheiten ergehen. :-/

Ein generelle Frage hätte ich noch: In den Büchern sind zu jeder 
Problemstellung und zu jedem Beispiel immer so praktische Flussdiagramme 
bzw. später FSM-Diagramme gedruckt. Gibt es dafür spezielle Programme? 
Ich möchte mir für meine Aufgabenstellung auch so etwas zeichnen würde 
da aber ungern mit PowerPoint oder Paint anfangen!?

Besten Dank,

Pepe

von Duke Scarring (Gast)


Lesenswert?

Pepe schrieb:
> Spartan
> 3AN Starter Kits bestückt mit einem XC3S700AN.
Das dürfte völlig ausreichend sein.

> erst mal ein einfaches 8bit-SR schreibt und
> dann zu nem großen zusammenstückelt
Ja, erstmal 8-Bit. Aber nicht zusammenstückeln, sondern die Bitbreite 
verallgemeinern und dann per generic aufblasen.

> Gibt es dafür spezielle Programme?
Keine Ahnung. Ich hab für ein paar Geschichten Graphviz [1] verwendet. 
Das läßt sich auch wunderbar per Skript generieren.

Duke

[1] http://de.wikipedia.org/wiki/Graphviz

von Pepe (Gast)


Lesenswert?

Super! Das war genau das was ich gesucht habe!

Noch einmal zu dem Eingangsregister: Du sagst ein allgemeines SR bei dem 
ich die Breite als generic deklariere. Nun wäre das in meinem Fall 512x8 
und ich müßte im Folgenden die Werte für die PWMs aus den einzelnen Bits 
zusammenbasteln. Wäre es da nicht besser ein einfaches 8bit SR zu nehmen 
und nach Empfang der 8 Bits das Ganze in eine Art Fifo zu übergeben? In 
dem werden dann 512 signed Werte abgelegt und er wird dann von den 
MUX-Einheiten ausgelesen?

LG

Pepe

von Pepe (Gast)


Lesenswert?

Ich überlege grad: muss es denn überhaupt ein FIFO sein? Ein normaler 
Speicher tut's eigentlich auch!?

Pepe

von Lattice User (Gast)


Lesenswert?

Pepe schrieb:
> Ich überlege grad: muss es denn überhaupt ein FIFO sein? Ein normaler
> Speicher tut's eigentlich auch!?

Ja, am besten als Dualport Memory ausgelegt. Auf einer Seite der 
Displayrozess um die LEDs anzusteuern, und von der anderen Seite kann er 
mit neuen Werten beschrieben werden.

von Falk B. (falk)


Lesenswert?


von Pepe (Gast)


Lesenswert?

Hallo Falk,

Deinen Beitrag zur 9x9-Matrix hatte ich mir schon im Vorfeld ausgiebig 
durchgelesen und auch den Code runtergeladen. Sehr tolles Projekt, 
Respekt! Um genau zu sein war Dein Projekt sogar der Anstoß für mich den 
Versuch mit dem FPGA zu starten!

Nun ist Dein Projekt schon etwas anders, da Du ja die LEDs (Zeilen und 
Spalten) direkt ansteuerst und nicht wie ich über SRs. Aber es ist 
dennoch eine super Grundlage. Den Teil wo Du die DMX Daten einließt 
werde ich sicher in Teilen übernehmen können um die Kommunikation mit 
dem µC zu realisieren.

Sicher werden mir dabei noch einige Fragen einfallen mit denen ich Dich 
/Euch zu gegebener Zeit noch nerven werde :-)

Besten Dank und LG

Pepe

von Pepe (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mir mal Gedanken gemacht wie ich das Ganze so gut wie möglich 
"gekapselt" aufbauen könnte. Herausgekommen ist das Bild im Anhang. 
Könnte mir jemand sagen ob das so funktionieren könnte?

Wenn ja würde ich mich Stück für Stück daranmachen die einzelnen 
Entities zu entwerfen und zu testen!

Besten Dank,

Pepe

von Pepe (Gast)


Lesenswert?

Das Schema ist im Übrigen nur für eine Farbe und ohne Zeilenansteuerung 
gemacht!

von Falk B. (falk)


Lesenswert?

So Pi mal Daumen ist das brauchbar.

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.