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?
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".
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?
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
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.).
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?
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.
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.
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:
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
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!
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
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.