Da ich im Internet immer nur die Info gefunden habe ein Text LCD
Controller sei zu "komplex" und man solle doch einen Softcore verwenden
habe ich mir selber einen geschrieben.
Unterstüzt zur Zeit 16x2 im 8-Bit Modus, sollte sich aber leicht
anpassen lassen.
Braucht etwa 80 Slices, wobei 32 auf einen Schattenspeicher entfallen,
d.h. man kann in die Komponente mit vollem Systemtakt schreiben und der
Controller überträgt die Daten dann kontinuierlich an das LCD.
Getestet habe ich das ganze mit meinem Spartan3A Startet Board mit
folgendem Code, es wird einfach bis zum init gewartet und dann
kontinuierlich in die erste Zeile ein '#' Zeichen geschrieben.
Hallo Herr Läubi,
Ich bin auf der Suche nach einem möglichst einfachen Display controller.
Dieser sollte endlos einen logic_vector am Display anzeigen.
Mein FPGA: Altera MAX II EMP2210F324C3N / 50 MHz
LC-Display: EA DIP204B-4NLW mit 4x20 Zeichen
dieser enthällt den KS0073 kontroller welcher zu 100% mit dem HD44780
kompatibel ist.
Das Signal welches am Display angezeigt werden sollte ist:
display : IN std_logic_vector(639 downto 0);
Dieses ist folgendermassen zu interpretieren: (80 ASCII zeichen)
display(639 downto 632) 1. Zeile(oben) 1. ASCII-Zeichen (links)
display(159 downto 152) 4. Zeile(unten) 1. ASCII-Zeichen (links)
display(007 downto 000) 4. Zeile(unten) 20. ASCII-Zeichen (rechts)
... etc ...
Die Signale zum Display sind:
lcd_data : OUT std_logic_vector(7 downto 0);
lcd_rs : OUT std_logic;
lcd_rw : OUT std_logic;
lcd_e : OUT std_logic
Der Code sollte möglichst wenig Logik zellen im FPGA verwenden.
Kann du mir erklären, wie ich das implementieren kann?
Mit freundlichen Grüsse
LOSIjunior
nur schrieb:> Hallo,> es wäre auch schon wenn deine codes synthezierbar wäre.
Zumindest auf XILINX FPGAs mit Block-RAM ist er das, ohne etwas mehr
Infos kann aber niemand sagen wo es bei dir ggf. hängt.
LOSIjunior schrieb:> Das Signal welches am Display angezeigt werden sollte ist:> display : IN std_logic_vector(639 downto 0);
Was spricht gegen die RAM Lösung?
LOSIjunior schrieb:> Der Code sollte möglichst wenig Logik zellen im FPGA verwenden
Der Verbrauch ist oben angegeben.
Newbie-Antwort:
Ich hab auch Fehler bei der Synthesis für die oben gezeigten Codes
(einkopiert in neue Files vhd und ucf):
ERROR:Xst:2585 - Port <LCD_Enable> of instance <LCD16x2> does not exist
in definition <CHAR_LCD_CTR>. Please compare the definition of block
<CHAR_LCD_CTR> to its component declaration to detect the mismatch.
ERROR:Xst:2585 - Port <LCD_RW> of instance <LCD16x2> does not exist in
definition <CHAR_LCD_CTR>. Please compare the definition of block
<CHAR_LCD_CTR> to its component declaration to detect the mismatch.
ERROR:Xst:2585 - Port <LCDData> of instance <LCD16x2> does not exist in
definition <CHAR_LCD_CTR>. Please compare the definition of block
<CHAR_LCD_CTR> to its component declaration to detect the mismatch.
CHAR_LCD_CTR.vhd hab ich noch nicht ausprobiert. Was mache ich falsch?
Karl-Heinz M. schrieb:> CHAR_LCD_CTR.vhd hab ich noch nicht ausprobiert. Was mache ich falsch?
Was heißt das? Ohne die Datei funktioniert es nicht, das oben angegeben
ist nur der Testcode für das Modul welches in CHAR_LCD_CTR.vhd steckt!
Karl-Heinz M. schrieb:> Ich brauche also den Testcode nicht?
Nur wenn du es auf ein "echtes" Board bringen willst, dann mußt du aber
ggf. die Pinzuordnungen anpassen.
Wenn du das ganze nur synthetisieren/simulieren möchtest reicht auch das
reine Modul.
Falls deine Erfahrung in VHDL noch recht neu ist würde ich erstmal mit
einem einfachem Beispiel beginnen.
Läubi .. schrieb:> Falls deine Erfahrung in VHDL noch recht neu ist würde ich erstmal mit> einem einfachem Beispiel beginnen.
Dank Dir, aber mein Prob ist trotzdem nicht viel anders als das von
Basti. Offenbar hatte jeder hier damit Probleme für die ich keine Lösung
seh und das nicht nachvollziehen kann.
Im XILINX Tut sieht das für mich ziemlich ähnlich aus, wie das hier.
Nach kurzem drübersehen vermute ich, dass ich den Block CHAR_LCD_CTR
brauche. An diesen übergebe ich nun meine gewünschte Andresse (also
Zeile 1 Zeichen 1) und meine Daten. ????
Basti schrieb:> Nach kurzem drübersehen vermute ich, dass ich den Block CHAR_LCD_CTR> brauche. An diesen übergebe ich nun meine gewünschte Andresse (also> Zeile 1 Zeichen 1) und meine Daten. ????
So ist es. Der CHAR_LCD_CTR ist im Prinzip für dich ein
Write-Only-Memory, welches die Geschriebenen Daten auf dem LCD ausgibt.
Alles auf der linken Seite deiner Grafik ist dabei das, was du benutzt,
das auf der rechten Seite wird an die Pins des LCD verdrahtet (Ausnahme:
Init done).
Das Beispiel zeigt nur wie man das ganze verwenden könnte muss aber
wie gesagt für das konkrete Board angepasst werden!
Basti schrieb:> Also drahte ich das INIT_DONE an meinen eigenen Block. Wenn da was> kommt, heißt das für mich, ich kann daten rüber schieben?
So ist es. Aus Platz- und Anpassungsgründen nutze ich das Ram auch für
die Init Sequenz des LCD, wenn vorher geschrieben wird wird ggf. diese
überschrieben, deshalb im Usercode erst auf init_done warten.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang