Forum: FPGA, VHDL & Co. LCD in VHDL schwierig?


von habichvergessen (Gast)


Lesenswert?

Hallo,

viele Leute die ich gefragt habe meinen ein normales Text Display (2x16) 
mit HDxxx Controller sei per µC viel einfacher anzusteuern als mit einem 
FPGA?
Das konnte ich nicht glauben...
Haber gerade mal geschaut.... Xilinxs Starterboard 3E verwendet einen 
Softcore um das Display anzusteuern, es gibt aber auch VHDL Code im 
Netz.

Ist das wirklich soooo schwierig? Was macht es schwieriger?

von Mop (Gast)


Lesenswert?

Hi, habe einige LCD-Integrationen gemacht, aus meiner Sicht also:
Die Initialisierung ist meist der springende Punkt. Es macht einfach 
auch keinen Sinn, die Init-Sequenzen "hart" zu implementieren, 
besonders, wenn mal der betreffende LCD nicht mehr verfügbar sein 
sollte. Meistens stimmt auch was beim Timing nicht, dann sucht man erst 
mal eine lange Zeit den Fehler.
Es geht deutlich schneller, einen simple Software-CPU wie z.B. die ZPU 
einzubinden.
Gibt hier einige interessante Anwendungen:

http://forum.gadgetfactory.net/index.php?/page/articles.html/_/papilio/quadrature-encoders-and-lcd-r20

http://forum.gadgetfactory.net/index.php?/topic/1220-lcd-experiments/page__st__10

von J. S. (engineer) Benutzerseite


Lesenswert?

In VHDL ist ein sequenzieller Ablauf (auch mit Verschlachtelungen) sehr 
einfach zu implementieren, wenn man sich einiger Hilfsmittel bedient. 
Solche Sachen kann man leicht mit Excel machen, das als Codesynthesizer 
fungiert und die Enumeration von states, die Abfragen und die Sprünge zu 
den nächsten states automatisch deklariert und den Code erzeugt. Das hat 
aber seine Grenzen, weil es früher oder später unübersichtlich wird und 
nicht so gut pflegbar ist.

Alles, was langsam genug ist, sollte mit einer flexiblen state machine 
bedient werden, die den Ablauf von der Generation des Timings trennt, 
weil sich der Code sonst sehr schnell aufbläht und die Zusammenfassung 
von Redundanz durch die Synthese zu oxorbtanten Synthesezeiten führt. In 
der Ablaufsteuerung sitzen dann abstrakte Codes=Befehle, ihrerseits 
sequenziell abgearbeitet werden und die durch den Einsprung in die 
states der untergeordneten state machine den Ablauf regeln. Das bläht 
zwar die Verwaltung auf, führt aber letztlich zu quantitav weniger Code. 
Es wird quasi in code-Intelligenz investiert und nicht in die Menge.

Die Frage ist dann immer, ob man das alles selber implementieren muss, 
oder ob die Komplexität soviele "Befehle" erfordert, dass man nicht 
besser auf einen vorgefertigen Softcore zurückgreift.

Bei einem einfachen LCD Controller, der nur ein bischen was anzeigt, 
würde ich es noch in VHDL machen. Aufwändige Init kann man mit einem 
sequenziell ablaufenden ROM-zugriff erschlagen. Wenn aber ständig 
unregelmässige Aktualisierungen vorkommen und auch noch unterschiedliche 
Arten von Anzeigeoptionen (Fliesstext, blinkender Text, Rolltext), 
verwendet werden, dann wird die Steuerung einfach zu komplex und man 
muss irgendeine Art von Softcore implementieren.

Wenn man über dies noch mit virtuellen Datenstrukturen arbeitet und z.B. 
String-Verarbeitung braucht, ist ein dedizierter Softcore unerlässlich, 
weil man dann die Methoden- und Strukturunterstützung in Sachen 
Variablen der jeweiligen Hochsprache verwenden kann.

von dito (Gast)


Lesenswert?

J. S. schrieb:
> die Enumeration von states, die Abfragen und die Sprünge zu
> den nächsten states automatisch deklariert und den Code erzeugt.

Wie sieht denn das genau aus? Hast du mal ein Beispiel oder ein Template 
dafür? Das würde mich echt interessieren, weil ich gerade an einem 
ähnlichen Problem sitze.

von J. S. (engineer) Benutzerseite


Lesenswert?

Du machst Dir ein Excel in der vorne die Zeilennummern der Excelzeile, 
dann die Quell- und die Ziel-states stehen. Mit Zahlen2Text-Konversion 
kannst Du diese automatisch nummerieren. Oder schreibst die state namen 
manuell vorne hin und adressierst den ausprung per "=XY".

Den gesamten VHDL Konstrukt baust du ein einer Zeile auf. Geht alles mit 
Textsynthese.

dito schrieb:
> oder ein Template
Mehrere. Die haben aber Zeit gekostet und stellen einen Teil meines 
Knowhows dar, das ich den Kunden verkaufe :-)

von dito (Gast)


Lesenswert?

J. S. schrieb:
> Du machst Dir ein Excel in der vorne die Zeilennummern der Excelzeile,
> dann die Quell- und die Ziel-states stehen. Mit Zahlen2Text-Konversion
> kannst Du diese automatisch nummerieren. Oder schreibst die state namen
> manuell vorne hin und adressierst den ausprung per "=XY".
>
> Den gesamten VHDL Konstrukt baust du ein einer Zeile auf. Geht alles mit
> Textsynthese.

Ja, so ähnlich mache ich das auch. Dachte schon ich wäre damit alleine. 
Schön zu sehen, dass andere das auch machen ;-)

J. S. schrieb:
> Mehrere. Die haben aber Zeit gekostet und stellen einen Teil meines
> Knowhows dar, das ich den Kunden verkaufe :-)

Na gut, dann will da mal nicht weiter nachbohren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich habe das so gemacht wie im 
Beitrag "Re: EA DOG-M initialisieren"

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

habichvergessen schrieb:
> Ist das wirklich soooo schwierig? Was macht es schwieriger?

So schwer ist es nicht, außer man versucht es "stur nach Anleitung" wie 
in einer Programmiersprache, es geht aber auch recht einfach über einen 
Zustandsautomaten siehe: Beitrag "[VHDL] 16x2 LCD Textcontroller / HD44780" 
(sehe gerade das Lothar ein ähnlichen Ansatz verfolgt hat). Wichtig 
dabei ist nur sich klar zu machen, dass "mindestens 40µS" nicht bedeutet 
dass man nicht auch länger warten könnte.

von Klaus (Gast)


Lesenswert?

J. S. schrieb:
> Solche Sachen kann man leicht mit Excel machen, das als Codesynthesizer
> fungiert und die Enumeration von states, die Abfragen und die Sprünge zu
> den nächsten states automatisch deklariert und den Code erzeugt.

Excelbasierter Spagetticode Generator? Seriously? Ich hoffe ich muss nie 
an einem Projekt arbeiten, an dem du vorher gesessen hast ;-)

von dito (Gast)


Lesenswert?

Wenn er die Excel-Datei mitliefert, ist es doch die beste Dokumentation.

von J. S. (engineer) Benutzerseite


Lesenswert?

Klaus schrieb:
> Excelbasierter Spagetticode Generator? Seriously? Ich hoffe ich muss nie
> an einem Projekt arbeiten, an dem du vorher gesessen hast ;-)

Es geht darum, sich in den Fällen, in denen man normale FSMs nutzt, die 
Tipperei und eventuelle Fehler zu ersparen. Das Einfügen um 
Umnummerieren von states, geht einfacher und ohne Copy&paste-Fehler. 
Dasselbe gilt bei rechnenden pipelines mit ihren verzögerten Werten, die 
zwischengespeichert werden müssen, um sie in Folgetakten zu verarbeiten. 
Da habe ich in 15 Jahren kein besseres Entwurfsystem gefunden.

dito schrieb:
> Wenn er die Excel-Datei mitliefert, ist es doch die beste Dokumentation.
Eben, die ist aussagefähiger, als das Gewirr von Pfeilen in vielen state 
diagrammen und eignet sich sehr gut, um die Übersicht zu behalten, weil 
auf dem ersten Blatt nur die wesentlichen Dinge zu sehen sind, und 
Code-Konstrukte nicht sichtbar sind.

von Duke Scarring (Gast)


Lesenswert?

> Excelbasierter Spagetticode Generator? Seriously
Also ich würde ja auch gern mal ein Beispiel dazu sehen.
Meine States in meinen FSM haben keine Nummern, sondern lesbare Namen.
Und bei rechnenden Pipelines, gibt es zu jedem Wert das passende 
enable und es wird erst weitergerechnet, wenn das enable hinten 
wieder rauskommt. Da ist es egal ob die Berechnung zwei, drei oder 100 
Takte braucht.

Zum Originalposter:
Mit zwei aufeinander aufbauenden FSM läßt sich auch ein Textdisplay 
relativ übersichtlich ansteuern. Das ist aber nur bedingt 
Einsteigertauglich.
1
    type lowlevel_state_t is (INIT, RESET, RESET2, RESET3, SET_MODE, WAIT_FOR_READY, READY, LCD_COMMAND, LCD_DATA, NIBBLE, LCD_CLEAR, LCD_HOME);
2
    type state_t is (LOWLEVEL_INIT, SET_DISPLAY, SET_ENTRY, CLEAR, LINE1, NEW_LINE, LINE2, IDLE);

Duke

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.