Forum: FPGA, VHDL & Co. LCD als Komponente


von Johannes (Gast)


Lesenswert?

Ich habe folgende Problemstellung. Ich habe ein Design für die 
Ansteuerung des LCD Displays eines Spartan 3E 1600 Board geschrieben. 
Dabei benutze ich zwei Arrays.In dem einen sind die Daten gespeichert, 
im anderen die Verzögerungszeiten.Dieses funktioniert auch und kann als 
Komponente von einem anderen Design benutzt werden. Die Daten müssen 
dann von der Anwendung in das Datenarray der Komponente geschrieben 
werden.Leider kann man aber einer Komponente kein Array als Eingang 
geben, daher müssen die Daten seriell der Komponente übergeben werden 
und nach fertigem Kopieren kann das LCD "gestartet" werden.Benutze ich 
also im Top Modul das Datum und die zugehörige Position als Integer für 
die Indizierung des Arrays, so ändern sich die Daten im Hauptprogramm zu 
schnell für die Komponente, nur der letzte zugewiesene Wert wird in das 
Array kopiert. Schreibe ich mir im Hauptprogramm eine Statemachine, die 
z.B. alle 3000 Zyklen ein neues Datum auf die Leitung legt und den Index 
erhöht, funktioniert das einwandfrei, nur benutzerfreundlich ist es 
keineswegs. Der Quelltext wird viel zu lange. Also war meine Idee eine 
Procedure zu schreiben, die als Eingang ein Array bekommt und dann bis 
3000 zählt, und das jeweilige Datum ausgibt. Nur leider funktioniert das 
nicht, da ich in der Procedure nicht zählen kann, weil bei jedem Aufruf 
die Variablen nicht gespeichert werden. Wie bringe ich also meine Daten 
am besten aus dem Top Modul in die Komponente?

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


Lesenswert?

Hauptprogramm, Procedure, Variablen....
Sag mal, kann es sein, dass du sonst Software schreibst?

Meine Einschätzung:
Du hast die komplett falsche Denkweise. Du denkst nicht in Hardware, 
willst aber Hardware mit VHDL beschreiben....

Machen wird doch mal so: du zeigst, was du schon hast, und sagst, wo die 
Probleme liegen. Und dann kann man drüber diskutieren.



BTW: natürlich lassen sich Arrays an Ports "übergeben".

von Johannes (Gast)


Lesenswert?

Vielen Dank. Ja du hast Recht, ich entwickle normalerweise 
Software(C++,C,C#), daher kommt wahrscheinlich auch diese eingefleischte 
Denkweise, alles als Funktionen und Objekte anzusehen. Daher fällt mir 
VHDL auch schwer, weil im concurrent Teil alles gleichzeitig abläuft.
Ich hab jetzt das Datenarray als Porteingang benutzt und in der 
Simulation sieht es gut aus, ich werde es am Board testen sobald ich ins 
Labor kann. Nur eine Sache will mir noch nicht in den Kopf. Mein Display 
läuft im 8 bit Modus, nur bei den Daten wird immer nur der höherwertige 
Nibble übertragen und dann mit dem höherwertigen Nibble des nächsten 
Bytes konkateniert. Sind meine Daten z.B. x"41",x"41,x"41",x"41", also 4 
mal A, so zeigt das Display dann 2 mal D an, also x"44", x"44". Die 
Befehle werden aber normal übertragen. Woran könnte das liegen, mein 
Prof hat auch keine Ahnung?

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


Lesenswert?

Johannes schrieb:
> weil im concurrent Teil alles gleichzeitig abläuft.
Naja, es "läuft" da nicht gleichzeitig ab, sondern es ist alles 
gleichzeitig vorhanden. Denn du beschreibst ja eine Schaltung, die genau 
so in Hardware abgebildet wird.

> Woran könnte das liegen,
An der Beschreibung...
> mein Prof hat auch keine Ahnung?
Aber er konnte wenigstens mal einen Blick auf die Beschreibung werfen... 
:-/

> Sind meine Daten z.B. x"41",x"41,x"41",x"41", also 4 mal A,
> so zeigt das Display dann 2 mal D an, also x"44", x"44".
Und was kommt raus, wenn du z.B. x"12", x"34", x"56", x"78" überträgst?

> Mein Display läuft im 8 bit Modus
Evtl. doch nicht, denn das hier ist ein Indiz für den 4-Bit-Modus:
> nur bei den Daten wird immer nur der höherwertige Nibble übertragen

von P. K. (pek)


Lesenswert?

Was für ein Modul hast denn Du? (stelle mir ein Character-Display vor, 
welches I2C, 4-bit und 8-bit Mode zur Verfügung stellt)

Bist Du sicher im richtigen Mode?

Das mit dem "konkatenieren" ist in Deinem Fall nicht eindeutig. Nimm 
eindeutigere Testdaten (z.B. 0x41, 0x52, usw.).

von Johannes (Gast)


Lesenswert?

Es ist im 8-bit Modus, da ich es nicht explizit in den 4 bit Modus 
versetze. Verwende ich z.B 0x44,0x12,0x36,0x42 so wird daraus
0x41,0x34.

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


Lesenswert?

Johannes schrieb:
> Es ist im 8-bit Modus, da ich es nicht explizit in den 4 bit Modus
> versetze. Verwende ich z.B 0x44,0x12,0x36,0x42 so wird daraus
> 0x41,0x34.
Dann liegt der Fehler im unbekannten Code. Siehst du diesen Fehler 
(auch) in der Testbench?

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Nein, da ist es noch richtig.Hier mal der Code,ich weiß sieht sehr sehr 
wild aus und ist ein ganz schönes Durcheiander aber es läuft. Bin offen 
für Kritik. Danke für eure Hilfen.

von PittyJ (Gast)


Lesenswert?

Hm, wenn ich es recht verstehe, wird das Display mit Hex 28 
initialisiert.
Meines muss ich immer mit 38 initialisieren, damit es 8-bittig bleibt.


und wenn aus
0x44,0x12,0x36,0x42
exakt
  4    1    3    4

wird, dann kann man doch nicht die Augen davor verschliessen, dass 
wirklich nur 4 Bit ankommen, und weiter behaupten man wäre auf 8 Bit.

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


Lesenswert?

Johannes schrieb:
> Hier mal der Code
Da fehlt noch das Package definitions für DATA...

PittyJ schrieb:
> Meines muss ich immer mit 38 initialisieren, damit es 8-bittig bleibt.
Richtig, das ist üblich:
1
             7  6  5  4  3  2  1  0 
2
Funktionen   0  0  1  DL N  F  X  X  --> 0011 1000 = 0x38
3
4
            0                   1 
5
DL   4-Bit Interface      8-Bit Interface
6
N    1-zeiliges Display   2/4-zeiliges Display
7
F    5×7-Font             5×10-Font

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Also mein jetziges Timing sieht wie folgt aus:
750000 Zyklen warten, x"38", 250000, 
x"38",250000,x"38",250000,x"38",250000,x"28",3000,x"06",3000,x"0C",3000, 
x"01",100000,x"44",3000,x"19",3000,x"47",3000,usw.
Ergebnis ist aber:aus 44 und 19 wird wieder 41

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


Lesenswert?

Johannes schrieb:
> Ergebnis ist aber:aus 44 und 19 wird wieder 41
> 250000,x"38",250000,x"28"
Wie war das nochmal mit 0x38 und 0x28? Was ist das letzte Kommando?
Du sagst dem Display 3x hintereinander: 8 Bit bitte (0x38).
Und kurz vors losgeht sagst du: Ab hier 4 Bit (0x28)...  :-o

Lass die 0x28 einfach mal WEG!

von Johannes (Gast)


Lesenswert?

Wenn ich die x"28" weglasse, wird das display gecleart, aber es 
erscheint nichts, auch kein cursor.Dachte ich brauche die, weil im 
user-guide nach der Initialisierung Function Set verlangt wird:
Sets interface data length, number of display lines, and character font.
The Starter Kit board supports a single function set with value 0x28.
Execution Time: 40 us

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


Lesenswert?

Johannes schrieb:
> weil im user-guide
Von welchem Board?
Die Info reicht noch nicht ganz aus:
>>> eines Spartan 3E 1600 Board

von Johannes (Gast)


Lesenswert?

Spartan 3E XCS1600E,Package FG320,bzw am User Guide steht MicroBlaze 
Development Kit Spartan-3E 1600E Edition.

von Christian R. (supachris)


Lesenswert?

Johannes schrieb:
> The Starter Kit board supports a single function set with value 0x28.

Bei der Aussage könnte es natürlich sein, dass das Display nur mit 4 
Datenleitungen angeschlossen ist.

von Johannes (Gast)


Lesenswert?

Das würde dann wohl alles erklären,danke.

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


Lesenswert?

Johannes schrieb:
> Das würde dann wohl alles erklären,danke.
Warum, frage ich mich, sind die Pins aber im ucf-File alle 
angeschlossen?

von Martin (Gast)


Lesenswert?

ich vermute mal, es handelt sich um dieses Board:
http://www.digilentinc.com/Products/Detail.cfm?Prod=S3E1600
User Guide:
http://www.digilentinc.com/Data/Products/S3E1600/ug257.pdf
Schaltplan:
http://www.digilentinc.com/Data/Products/S3E1600/S3E-1600_sch.pdf

im User Guide findest Du auf Seite 50:
"The board uses a 4-bit data interface to the character LCD."
Dort findest Du auch einige Informationen zur Initialisierung und 
Datenübertragung...

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


Angehängte Dateien:

Lesenswert?

> Schaltplan:
> http://www.digilentinc.com/Data/Products/S3E1600/S...
Wie ist denn das Display an den dort abgebildeten J13 angeschlossen?

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.