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.).
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.
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:
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 |
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: > weil im user-guide Von welchem Board? Die Info reicht noch nicht ganz aus: >>> eines Spartan 3E 1600 Board
Spartan 3E XCS1600E,Package FG320,bzw am User Guide steht MicroBlaze Development Kit Spartan-3E 1600E Edition.
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.
Johannes schrieb: > Das würde dann wohl alles erklären,danke. Warum, frage ich mich, sind die Pins aber im ucf-File alle angeschlossen?
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...
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.