LCD als Komponente

Gast #2651983
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?
Moderator (Firma: Titel) Persönliche Seite #2652390
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".
Gast #2653198
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?
Moderator (Firma: Titel) Persönliche Seite #2653220
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
#2653222
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.).
Gast #2654094
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.
Moderator (Firma: Titel) Persönliche Seite #2654099
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
Gast #2654857
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
Angehängte Dateien:
Gast #2654928
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
Gast #2659417
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren