Forum: FPGA, VHDL & Co. EA DOG-M initialisieren


von Florian Z. (floz)


Angehängte Dateien:

Lesenswert?

Morgen zusammen,

also ich habe einen Lattice XP2 auf einem Brevia Board.
Ich habe eine Erweiterunsplatine gebastelt, die über den 40 Poligen 
stecker angeschlossen wird.
Auf dem Erweiterungsboard ist ein Drehgeber ein paar LEDs und ein paar 
Taster und dieser (siehe Datenblatt ) EA DOGM162 angebracht.
Alle anderen Teilchen habe ich schon erfolgreich in betrieb genommen und 
nun wage ich mich an den Display, aber ich weiß nicht so recht wie? Ich 
habe mir schon ein paar Inits von Xilinx displays angeschaut aber nicht 
sorecht durchgeblickt, außerdem habe ich auch eine C Implementierung für 
dieses Display gefunden, aber auch diese fand ich komisch/ 
unverständlich.
Kann mir einer ein Kochrezept zur Initialisierung posten oder einen 
Quellcode den man umschreiben kann, oder ähnliches.

Danke schon mal.

Flo

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


Lesenswert?

Florian Z. schrieb:
> Auf dem Erweiterungsboard ist ein Drehgeber ein paar LEDs und ein paar
> Taster und dieser (siehe Datenblatt ) EA DOGM162 angebracht.
Wie ist das Display versorgt und angeschlossen?
Immerhin gibt es ja 3 verschiedene Betriebsarten (8-Bit, 4-Bit, SPI).

von Florian Z. (floz)


Lesenswert?

Sorry, dass hatte ich vergessen zu posten,
ich habe mich für die 8 Bit Variante entschieden...
Da ich es zu beginn für das einfachste hielt.

von bjnass (Gast)


Lesenswert?

Hatte die SPI Variante auf Anhieb zum Laufen gebracht, weniger Kabel -> 
weniger Fehler. Schau mal die einfache Ini von Peter Danneger an, 
einfacher geht's nimmer.

Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode"


Florian Z. schrieb:
> Sorry, dass hatte ich vergessen zu posten,
> ich habe mich für die 8 Bit Variante entschieden...
> Da ich es zu beginn für das einfachste hielt.

von Florian Z. (floz)


Lesenswert?

Hi,
danke für den Post!
Ich hab mir uach gerade die SPI-Variante durchgelesen,
aber leider ist die in C geschrieben und meine C Kentnisse sind mehr 
schlecht als recht...mir ist schon klar, dass ich diese 
Initialisierungssignale senden muss, und dazwischen immer ein bisschen 
warten, aber irgendwie fidne ich da keinen start um es in VHDL zu 
realisieren.
Wenn einer so etwas schon in VHDL hat und es verständlich ist, fänd 
ichdas toll.
Danke !!!

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


Lesenswert?

Florian Z. schrieb:
> Wenn einer so etwas schon in VHDL hat und es verständlich ist, fänd
> ichdas toll.
Ich hab da was für ein 4-Bit Interface. Das kann ich heute Abend mal 
posten...

von Florian Z. (floz)


Lesenswert?

Das wäre doch cool,
hauptsache mal was zum reinschauen und nachvollziehen,
dass dann für 8 Bit umwandeln, wird dann wohl möglich sein.
Ist das dann speziell für ein Xilinx board oder allgemein für LCDs?
Weil ich festgestellt habe das die XilinX LCDs so ein bisschen eigen 
sind.
Aber danke, da hoffe ich mal dass dies mir weiter hilft.

von Florian Z. (floz)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,
damit ich den ganzen Tag nicht so untätig rumsitze habe ich versucht die 
Initialisierung selbst zum laufen zu bekommen,
aber es klappt nicht, zumindest sieht man mal nichts, und das ist doch 
immer das beste...
Im File sind ein paar, Signale, Ausgänge die nicht gebraucht werden, ich 
weiß,aber zu Testzwecken (reagiert der Pin überhaupt etc.) verwendet 
worden sind, also seht es mir nach.
Ich gebe auch zu, meine realisierung der Wartezeiten ist nicht super 
toll, aber im Simulator tut sie was sie soll.
Im Anhang mein File...hoffe mir kann jemand Helfen, oder Lothar postet 
seines und ich vergleiche morgen ;-)
Danke schon mal

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


Lesenswert?

Ohne jetzt den ganzen Code angeschaut zu haben:
1
:
2
rising_edge (clock)
3
:
4
rising_edge (delay)
5
:
So macht man das nicht.

Hier nochmal meine Postulate für Anfänger:
Es gibt nur 1 Takt im Design.
Es wird nur 1 Flanke dieses Takts abgefragt (rising oder falling).
Es gibt keinen (und schon gar keinen asynchronen) Reset.
Es wird jedes asynchrone Signal mit 2 FFs einsynchronisiert.
Ausnahmen von den genannten Regeln sind nur mit fundierter Begründung
möglich.

Dir wird für deinen Code keine fundierte Begründung einfallen...  :-/

BTW:
Ich sollte das noch erweitern um:
Es werden keine Variablen verwendet.

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


Angehängte Dateien:

Lesenswert?

Hier die versprochenen Daten.
Die Datei LCD_CTRL.vhd verwaltet ein DPRAM, das zu Beginn die 
Initialisierungssequenz und später die Daten für das LCD enthält. Über 
ein Interface können dann unter Angabe der x und y-Position Zeichen in 
das DPRAM geschreiben werden, die dann laufend auf das LCD ausgegeben 
werden.
Das Einschreiben ins RAM übernimmt das Modul top_LCD.vhd. Hier werden 
zur Demo einfach ASCII-Zeichen ins DPRAM abgelegt.

EDIT:
Ich sehe gerade, dass die Zeile
x"20", -- 8-Bit Interface
richtigerweise
x"20", -- 4-Bit Interface
heissen muß...  ;-)

Und über den Port sf_cen wird das Strataflash auf dem S3 Evalboard 
deselektiert. Dieser Port ist für eine andere Plattform nicht nötig...

von Florian Z. (floz)


Angehängte Dateien:

Lesenswert?

Morgen Lothar, Morgen Zusammen

erstmal danke für deine Files, ich habe sie auch schon eifrig studiert, 
aber ein paar Sachen sind mir noch nicht ganz klar, ich weiß ich bin 
erst ein VHDL Anfänger, aber ich habe jetzt schon ein paar Projekte 
realisiert und lerne gerne, deshalb: Du erzeugts durch prescale einen 
Takt von einer µs, richtig? dann nutzt du diesen quasi als Zähler, weil 
wie ja oben steht gibt es nur einen wahren Systemtakt. ;-) Das gleiche 
machst du dann auch mit fosc und prellus, als Zähler.
Des weiteren würde ich gerne wissen, wie der Kompiler den Speicher 
anlegt? weil aus anderen Programmiersprachen kenne ich das so, wenn 
nichts gesagt wird wird es ein 1D Array, sprich linear und dann brauchst 
man ja keine y-Koordinate, oder habe ich da was falsch verstanden?
Dann nutzt du quasi 2 statemachine zum laden der Werte aus dem speicher 
und zum schreiben der Werte an den Display, aber meine große Frage, ich 
habe bei mir unzählige Timings zu beachten, aber bei dir finde ich da 
sehr wenig Berücksichtigung oder ich finde es einfach im Quelltext 
nicht.
Zur besseren verdeutlichung schicke ich nochmal 2 Seiten mit die in 
meiner Sicht ausschlaggebend sind.
Wenn mir noch mal jemand Helfen könnte, vielleicht hat auch schon jemand 
diesen Display mit einem XP2 angesteuert und kann mir da weiterhelfen.
Aber an dieser stelle schonmal DANKE Lothar für deine tolle Hilfe und 
ich werde auch den Beitrag oben berücksichtigen, versprochen! :-)

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


Lesenswert?

Florian Z. schrieb:
> Du erzeugts durch prescale einen Takt von einer µs, richtig?
Nein. Es gibt nur 1 Takt.
Dieser 1us "Takt" ist ein Clock-Enable.

> Des weiteren würde ich gerne wissen, wie der Kompiler den Speicher
> anlegt?
Es gibt keinen Compiler. Das macht hier der Synthesizer. Und wenn das so 
beschrieben ist, wie es im XST-Userguide steht, dann wird da ein 
Dual-Port-BlockRAM draus.

> weil aus anderen Programmiersprachen kenne ich das so, wenn
> nichts gesagt wird wird es ein 1D Array, sprich linear und dann brauchst
> man ja keine y-Koordinate, oder habe ich da was falsch verstanden?
Diese y-Koordinate wird dann ja auch einfach in die Adresse mit 
aufgenommen. Es ist nur zur Virtualisierung der Schnittstelle zum User 
hin gedacht, dass der wie beim PC eine Zeile und eine Spalte und ein 
Zeichen angibt. Den Rest (=die Speicherverwaltung) macht die Hardware...

>  ich habe bei mir unzählige Timings zu beachten,
Nein, du hast normalerweise irgendwelche Minimalzeiten, du darfst die 
auch gern länger machen. Es dauert dann nur länger.
Und so mache ich das in der Initialisierung: einfach pauschal lang genug 
warten (ich brauche hier max 2ms). Fertig. Und die ganz lange Zeit am 
anfang mache ich einfach, indem ich oft den selben Wert (0x30) 
rausschreibe...  ;-)
Und die 2ms Wartezeit passieren hier:
1
          when BUSY =>
2
                   if (oneus='1') then -- 1us vorbei?
3
                       if (waitbusy<shorttime) then -- 2ms vorbei?
4
                           waitbusy <= waitbusy+1; 
5
                       :

EDIT: Du kannst das ja einfach mal Simulieren. Du mußt nur an top_LCD 
einen Takt anlegen... ;-)

von Florian Z. (floz)


Lesenswert?

Hallo,

ja einfach pauschal langenug warten ist ja schon ok. Das habe ich auch 
eingesehen.
Zum Ram, ich habe leider kein XST-Userguid, da ich mit lattice arbeite 
und nicht mit XilinX.
Mit Clock-Enable ist eine "Aktivierungsbedingung" gemeint, verstehe ich 
das richtig?

Danke Lothar, dann werde ich mal versuchen es auf meinen FPGA zu flashen 
und du / ihr kannst/könnt sicher sein, ich melde mich wieder, wenn was 
nicht läuft.

besten gruß

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


Lesenswert?

Florian Z. schrieb:
> Zum Ram, ich habe leider kein XST-Userguid, da ich mit lattice arbeite
> und nicht mit XilinX.
Es gibt von Lattice auch solche Synthese-Guidelines:
http://www.latticesemi.com/lit/docs/technotes/tn1008.pdf

> Mit Clock-Enable ist eine "Aktivierungsbedingung" gemeint, verstehe ich
> das richtig?
Ja. Sieh dir mal so ein FF genauer an:
Es gibt einen Takteingang, Setz- und Rücksetz-Eingänge und eben den 
Clock-Enable-Eingang. Der sagt dann, ob die (nächste) Taktflanke auf 
diesem FF wirken soll oder auch nicht...

von Florian Z. (floz)


Lesenswert?

Hallo,
danke nochmal für deine Hilfe...
was wär ich nur ohne dieses Formum?! ;-)
Gut dann werde ich mich mal an das Arbeiten machen, und mir eine LCD 
Lösung für 8 Bit schreiben.
Ich hoffe das klappt mit der großen Vorhilfe auch ziemlich gleich.

von Beginner (Gast)


Lesenswert?

Lothar Miller schrieb:
> Hier die versprochenen Daten. Die Datei LCD_CTRL.vhd verwaltet ein
> DPRAM, das zu Beginn die Initialisierungssequenz und später die Daten
> für das LCD enthält.
Hallo,

ich habe versucht ein Display mit HD44780 Controller anzusteuern. 4 
Datenleitungen auf einem Spartan 6. Ich habe einfach den Code von Lothar 
genommen und bei mir eingebunden, sonst nichts verändert.

Ich bekomme eine Warnung

PhysDesignRules:2410 - This design is using one or more 9K Block RAMs
   (RAMB8BWER).  9K Block RAM initialization data, both user defined and
   default, may be incorrect and should not be used.  For more 
information,
   please reference Xilinx Answer Record 39999.

und es erscheint nichts auf dem Display.

Kann mir jemand sagen was ich falsch mache?
Viele Grüße
Beginner

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


Lesenswert?

Beginner schrieb:
> Kann mir jemand sagen was ich falsch mache?
Du gibst die ISE-Version nicht an.
Du liest die Fehlermeldung nicht.
Siehe einfach mal http://www.xilinx.com/support/answers/39999.htm
Dort findest du dann einen Link auf
http://www.xilinx.com/support/documentation/errata/en148.pdf
Und dort gehts weiter auf Seite 5 oben.

von Beginner (Gast)


Lesenswert?

Lothar Miller schrieb:
> Du gibst die ISE-Version nicht an.

14.1

von Beginner (Gast)


Lesenswert?

Danke für die Tips,
soweit ich das verstehe ist das hinfällig solange man eine Version älter 
als 13.2 benutzt.
Block RAM used in the 9K mode (RAMB8BWER) can fail to initialize 
user-specified data or default values (all zeros) during configuration 
in all Spartan-6 devices using ISE 13.1 and prior software versions. A 
fix has been implemented beginning in ISE Design Suite 13.2.

Oder muss ich den Ram irgendwie mit dem Block Memory Generator neu 
erzeugen. Entschuldigt meine Fragen, ich hab noch nie was mit Blockram 
gemacht, aber im Prinzip ist das ja ganz normaler sram.

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


Lesenswert?

Beginner schrieb:
> aber im Prinzip ist das ja ganz normaler sram.
Ja, eben nicht...
Denn beim SRAM kommt sofort (naja, ziemlich bald) nach dem Anlegen einer 
Adresse was heraus. Beim BRAM erst nacht dem nächsten Takt.

BTW: was sagt denn die Simulation deines Designs?

von Beginner (Gast)


Lesenswert?

Danke für deine Hilfe.
Ich habe jetzt noch mal alles schnell neu gemacht und nur die Dateien 
von dir eingebunden (sf_cen habe ich ignoriert, weiß nicht was das ist).
Was hilft mir die Simulation? Bei dir scheint es ja zu funktionieren. 
Ich habe das Sim-file mal angehängt (50 ms).

Hast du eine Idee was falsch läuft? Muss ich den Ram irgendwie neu 
beschreiben? Ich habe keine Ahnung von Ram.

von Beginner (Gast)


Lesenswert?

Oh das war wohl nur die Konfiguartion, würdest du die bitte löschen. 
Danke

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.