Initialisierung LCD-Display

OP #1920634
Lesenswert?

Hallo Zusammen,
um meinen Thread von letzter Woche nochmal aufzugreifen, also vielleicht 
bin ich ja echt doof (kann ich eigentlich ausschließen! ;-)) aber mein 
LCD Display geht immer noch nicht, kein Lebenszeichen und langsam nervt 
es mich...
Ich habe zuerst versucht den Code von Lothar zum Laufen zu bringen, aber 
das ging so gar nicht, deshalb habe ich mich dann dafür entschieden 
einen eigenen (auf Basis von Lothars) zu schreiben, aber auch dieser 
bleibt erfolglos.
Kann mir bitte Einer/Eine helfen? Wäre total nett, weil ich nämlich 
langsam Verzweifel.
Im Anhang meinen Code..vielleicht nützt es ja etwas,
schon mal danke.

Gruß

Flo
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1920688
Lesenswert?

Aber holla:
> if rising_edge(clk) and clk = '1' then
Was ist denn das?
Sieh dir mal die Funktion rising_edge() im Quelltext an.


Was sagt denn die Simulation?
Klappt es dort?
Gib es zu: du hast das nicht simuliert!
Denn...
> einen eigenen (auf Basis von Lothars) zu schreiben
Das ist eine mächtig lange Sensitiv-Liste:
1
FSM: process ( zaehler1, zaehler2, zaehler3,zaehler4 ,reset, current_state, clk )
und abgesehen vom clk sind die meisten Signale unnötig...

Dafür fehlt durch die ungünstige Vermischung von getaktetem und 
kombinatorischem Prozess ein Signal
1
FSM: process ( zaehler1, zaehler2, zaehler3,zaehler4 ,reset, current_state, clk )  -- viel zuviel... und doch zu wenig: zaehler_gesamt fehlt!!!
2
variable Next_state : state_typ;
3
begin
4
   if rising_edge(clk) and clk = '1' then -- getaktet
5
   :
6
   end if;
7
   if zaehler_gesamt = 53999 then
8
      current_state <= next_state after 20ns; -- kombinatorisch, aber nicht in Sensitivliste
9
   end if;
10
end process;

Sowas lässt sich nicht synthetisieren:
1
      current_state <= next_state after 20ns; -- kombinatorisch
Denn es gibt keine einstellbaren Verzögerungsgleider in einem FPGA.


Wozu das Herumjonglieren mit Variablen für deine Zustände?
1
  
2
variable Next_state : state_typ;
3

4
begin
5
  if rising_edge(clk) and clk = '1' then 
6
    next_state := current_state; 
7
    case current_state is

>  also vielleicht bin ich ja echt doof (kann ich eigentlich ausschließen!
>  ;-))
Muss nicht unbedingt sein... ;-)
Aber: hast du schonmal die einfacheren Geschichten wie z.B. ein 
komplexeres Lauflicht durcherxerziert und verstanden?

Die Simulation ist der Debugger der Hardware. Du wirst hier ohne 
Simulation garantiert nur sehr sehr beschwerlich zum Erfolg kommen...
OP #1920719
Lesenswert?

Hallo,

vorneweg, doch ich habe das Simuliert, es laufen auch alle States durch 
und es werden Daten aus dem Speicher gelesen und 
geschrieben....faszienierend nicht war?!

So zu deinen Anmerkungen:

Was ist mit meiner rising_edge Funktion, bzw welche meinst du denn? Die 
oben mit den Zählern oder die in der State-Machine??? Aber beide 
arbeiten.
Dass Sachen mit 20ns nicht Synthesierbar sind, ist mir bewusst, aber es 
war so ein Verzweiflungsding, um es mal zu testen.
Das Herumjongliere mit den Variablen, habe ich bei meinem VHDL Prof zum 
Thema FSM abgeschrieben.
Ja einfachere Projekte, Lauflicht, auch schon einen Drehgeber mit 
Links/rechts erkennung habe ich gemacht, auch schon einen Sigma-Delta 
Modulator 1. Ordung habe ich lauffähig bekommen, also dachte ich (und 
die Arbeit) jetzt ist der Display dran.

Anbei sende ich mein Simulationsergebnis, zum Beweis, dass ich wirklich 
simuliere ;-)
Danke schonmal wieder für die Hilfe...aber es ist ja noch nicht ganz 
durchgestanden ;-)

Gruß

Florian
Angehängte Dateien:
OP #1920741
Lesenswert?

Ja,
das habe ich auch schon festgestellt, dass die Hochschulen, ein Leben im 
Simulator haben, aber dennoch kann man ja die eine oder andere Zeile 
abschreiben, um einen richtigen start zu finden, wenn das alles ist an 
wissen das man zur verfügung hat muss man damit das Arbeiten beginnen.
Moderator (Firma: Titel) Persönliche Seite #1920746
Lesenswert?

Florian Z. schrieb:
> vorneweg, doch ich habe das Simuliert, es laufen auch alle States durch
> und es werden Daten aus dem Speicher gelesen und
> geschrieben....faszienierend nicht war?!
Ja.
Denn deine Simultaion ist falsch, weil deine Sensitivliste falsch ist.
Du hast aber "Glück", dass es trotzdem funktioniert (in der Simulation), 
denn der Prozess wird ja ständig durch den clk aufgerufen. Nur bekommst 
du auf dem Signal current_state dadurch einen (scheinbaren) Takt 
Latency...

> Das Herumjongliere mit den Variablen, habe ich bei meinem VHDL Prof zum
> Thema FSM abgeschrieben.
Böse (und vor allem unnötige) Sache, das...
In einer 1-Prozess-FSM wird der Folgezustand direkt auf das 
Zustandssignal zugewiesen. Da braucht es keine "Zwischenvariable".

> Was ist mit meiner rising_edge Funktion
Wenn du mal nachsiehst, was in der rising_edge() drinsteht, dann findest 
du sofort heraus, dass dort die Abfrage nach "and clk='1'" schon 
integriert ist. Such dort im Package std_logic_1164 mal nach der 
Funktion rising_edge(): 
http://optimal.vlsi.uwaterloo.ca/NEW/std_logic_1164_vhd.htm

> Duke Scarring schrieb:
>> Lothar Miller schrieb:
>>> Denn es gibt keine einstellbaren Verzögerungsglieder in einem FPGA.
>> Aha ;-)
>> Und was sind die IODELAYs im Virtex 4 ?!?
In einem FPGA... ;-)
Die IO-Zellen zählen für mich schon wegen der schlechten Zugänglichkeit 
und der schlechten Skalierbarkeit zur Aussenwelt. Zudem haben wir es 
hier mit einem S3 zu tun...
Moderator (Firma: Titel) Persönliche Seite #1920786
Lesenswert?

Das ist jetzt (ohne Witz) eine asynchrone FSM.
Die funktioniert nur in der Simulation...

Denn die Sensitivliste ist schon wieder unvollständig:
1
    when s3 => if zaehler4 = 6 then   
2
                    ort <=  ort + 1 ;
ort fehlt in der Liste....

Es bringt aber nichts, das reinzumachen, denn das hier ist die 
klassische kombinatorische Schleife: Sobald im Zustand s3 der 
zaehler4 gleich 6 ist, zählt ort mit irrsinniger Geschwindigkeit 
hoch:
http://www.lothar-miller.de/s9y/categories/36-Kombinatorische-Schleife
Lustigerweise merkt das die Synthese nicht mal unbedingt...
OP #1920814
Lesenswert?

Hallo Lothar,
macht er aber laut meiner Simulation nicht, schau dir mal das Bild an...
Ich habe immer bei S4 einmal datenlesen, also klappt das doch oder habe 
ich da was falsch verstanden?
Also vom Abruf der Hex-Zahlen passt es genau zum 
Initialisierungsbeispiel meines LCDs.
Wie löse ich denn das Problem, wenn es eines ist, mit der 
Kombinatorischen Schleifen? Soll ich jetzt wieder die Clock dazu 
schalten, damit wird es wenigstens wieder Synchron, oder?
Danke für all die Hilfe und Erklärungen
Moderator (Firma: Titel) Persönliche Seite #1920836
Lesenswert?

Florian Z. schrieb:
> macht er aber laut meiner Simulation nicht
Sag ich doch. Die Simulation ist falsch, weil die Sensitivliste 
unvollständig ist: ort fehlt.

Zur vereinfachten Darstellung:
1
signal cnt : unsigned (3 downto 0) := "0000";
2
process (clk) begin
3
  cnt <= cnt+1;
4
end process;
Simulier das mal: es sieht aus wie ein Zähler, der mit jeder 
Taktflanke hochgezählt wird.

Florian Z. schrieb:
> Kombinatorischen Schleifen? Soll ich jetzt wieder die Clock dazu
> schalten, damit wird es wenigstens wieder Synchron, oder?
Ja. Aber dann brauchst du nur clk in der Senslist...
OP #1920845
Lesenswert?

also alles raus aus der Sensitivlist und clk rein, dann wirds was mit 
dem Display, verstehe ich das dann so richtig?
Und als Abfrage mach ich das  " if rising_edge (clk) then
                                      -- dann die states--"

na da bin ich ja mal gespannt ob das vor meiner Mittagspause noch was 
wird.
schon mal danke und ich melde mich wieder!
OP #1921000
Lesenswert?

Hallo Zusammen,

also entweder mag mich mein Display einfach nicht, oder ich mach noch 
was grundlegendes Falsch ;-)
Also hier nochmal der Überarbeitete und abgeänderte Quellcode...
Vielleicht kann mir noch jemand einen Tip geben, oder ach langsam weiß 
ich nicht mehr weiter.
Danke schon mal an alle, die mir helfen...
Flo
Angehängte Dateien:
OP #1921918
Lesenswert?

Morgen Zusammen,
nach einer Kurzen nacht, aber ohne erfolge bin ich wieder auf der 
Arbeit,
klar habe ich Datenblätter für den Display, sind beide im Anhang.
Beim Dokument EA_dog-m finde ich nur die Seiten 6 und 7 interessant, ich 
habe übrigens den EA DOGM162 und im Dokument st7036 ist die Seite 54, 
das ist die mit dem Timing interessant...in diesem Dokument sind auch 
ein C-Programmierbeispiel, aber ich kann ja nicht "wait 20ns " 
schreiben...
ok, ich hoffe es hilft, weiter.
Ach ja mein Systemtakt sind 50MHz.
Danke schon mal wieder vorneweg für eure tolle Hilfe, ich hoffe ich 
bekomm das ding demnächst zum laufen, sonst trete ich es in die Tonne.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1921935
Lesenswert?

Florian Z. schrieb:
> ich hoffe ich bekomm das ding demnächst zum laufen,
Warum nimmst du nicht meine Beschreibung aus dem 
Beitrag "Re: EA DOG-M initialisieren" und machst die 
4-Bit-Ansteuerung einfach raus?

Ich würde einfach mal das ändern:
1
entity LCD_Controller is
2
    Port ( -- Signale an LCD
3
           :
4
           lcd_db : out  STD_LOGIC_VECTOR(7 downto 0);
5
:
6
:
7
type lcdbus_t is (IDLE, LOADDATA, BUSY);
8
signal lcdbus : lcdbus_t := BUSY;
9
:
10
:
11
   -- Buszugriff
12
   process begin
13
      wait until rising_edge(clk);
14
      case lcdbus is
15
         when IDLE =>
16
                     lcdidle <= '1';
17
                     lcd_e   <= '0';
18
                     if (lcdstart='1') then
19
                        lcdidle <= '0';
20
                        lcdbus <= LOADDATA;
21
                     end if;
22
                    
23
         when LOADDATA =>    
24
                     lcd_db <= lcddata;
25
                     lcd_rs <= lcdrs;
26
                     pulse_e <= 0;
27
                     lcdbus  <= BUSY;
28
                     waitbusy <= 0;
29
                     
30
          when BUSY =>
31
                     if(pulse_e=63 and oneus='1') then 
32
                        if (waitbusy<shorttime) then 
33
                           waitbusy <= waitbusy+1; 
34
                        else
35
                           lcdbus <= IDLE;
36
                        end if;
37
                     end if;
38
      end case;  
39
:

BTW: Welche Leitungen vom Display hast du denn alle angeschlossen?
OP #1921961
Lesenswert?

Hi,
also die Änderungen, die du mir da jetzt beschrieben hast, hatte ich bis 
auf ein paar kleinigkeiten schon versucht, aber mein Display macht so 
gar nichts... es leuchtet Grün ;-) , dass ist schon alles, aber ich 
hoffe, dass da noch mehr geht.
Auch mit deinen Änderungen passiert da nichts.
Wie ich es angeschlossen habe, so wie es auf seite 4 im EA_dog-m 
Datenblatt  für 8 Bit 3,3 V erklärt ist. Und Anbei sende ich dir dann 
meinen Schaltplan, wie es auf meinem Board verbaut ist, da liegt nämlich 
noch ein bisschen mehr rum... ;-) Ist ein Kleines Projekt von mir.
Aber es will nicht und ich bekomm das kotzen...
danke für eure tolle Hilfe, ich hoffe ich bekomm das ding demnächst zum 
laufen.
Angehängte Dateien:
OP #1922070
Lesenswert?

So alle Pins nochmal nachgelötet aber es bleiben 2,5V genau so wie an 
VDD,
da stimmt wohl was mit meiner 3,3V Versorgung nicht aber ich finde den 
Fehler nicht, hab gerade die ganze Platine abgesucht, im Anhang sende 
ich dir mal die ganze Platine mit, wenn du ein Target hast, kann ich es 
dir auch als Target file geben, vielleicht findest du ja den Fehler.
Ein dickes Dankeschön!
Angehängte Dateien:
Gast #1922075
Lesenswert?

Also viel passt da ja nicht zusammen:

1. Es fehlen die 40 ms Pause nach dem Power on 
(st7036_init_by_instruction.png)
  (ist evtl. zu verschmerzen, weil der FPGA auch seine Zeit braucht, 
aber sicher ist sicher...)

2. Es wiederholt sich die Initialiierungs- und Ausgabesequenz alle Nase 
lang (laut Simulation)

3. Man erkennt (leider nicht sehr gut) im Timing-Diagramm 
(st7036_timing_diagram.png) das E(nable) ein wichitges Signal ist. Vor 
der steigenden Flanke müssen RS und R/W gesetzt werden und vor der 
fallenden Flanke auch entsprechend die Daten. Bei Dir wackelt E in der 
Simulation gar nicht und die Daten werden auch viel später erst gesetzt.
Siehe auch die Pinbeschreibung (st7036_pin_functions.png).

4. Für die Initialisirung müssen RS=0 und R/W=0 gesetzt werden 
(ea_dogm163_init_3_3V.png). Das stimmt bei Dir nicht (simulation.png)


Das einzige was zu stimmen scheint ist die Initialisierungssequenz 
(ea_dogm163_init_3_3V.png), aber ohne Enable wird Dein Display nicht 
viel machen...

Duke
OP #1922122
Lesenswert?

Hallo,
ich dachte man muss das mit dem Timing nicht so genau nehmen weil ja nur 
min. Werte angegeben sind, und ich bin bei mir überall in den min werten 
drinnen, ok, das mit dem e(nable) hab ich irgendwie übersehen. Die 40ms 
Pause für den Controller brauche ich nicht, da das display, auf einem 
Externen Board sitzt, und es dort lange genug Spannung bekommt.
Ich habe noch ein wenig an meinem Code geschrieben, kann mal noch jemand 
drüber schauen, besser bekomm ich die Timings nicht hin, ich bin echt am 
verzweifeln.
Danke schon mal für eure tolle Unterstützung!
Angehängte Dateien:
Gast #1922236
Lesenswert?

Florian Z. schrieb:
> Timing nicht so genau nehmen

Naja. Kann man als Bastler machen. Aber vielleicht willst Du ja mal 
Ingenieur werden?!

Also nochmal langsam: Du hast 50 MHz Systemtakt, also 20 ns Zykluszeit.

Enable muß (lt. Seite 54) tEWH = 200 ns = 10 Takte high sein und tEWL = 
150 ns = 8 Takte low sein.
Ob Du Schreiben oder Lesen (R/W) willst und welches Register (RS) muss 
tAW6 = 20 ns = 1 Takt vor der steigenden Flange von Enable gesetzt 
werden.
Die zu schreibenden Daten müssen tDS6 = 100 ns = 5 Takte vor der 
fallenden Flanke von Enable anliegen. Da Enable ja 10 Takte high sein 
muß, kannst Du die Daten auch gleich mit RS und R/W ausgeben, einen Takt 
warten und Enable für 10 Takte hochziehen.

Ich hab keine Ahnung, was Du in Deinem Code vermurkst hast, aber ich 
habe mal ein paar Timing-Checks in die Testbench eingebaut. (@all: 
Verbesserungsvorschläge um das eleganter/übersichtlicher zu schreiben 
sind gerne willkommen.)

Vielleicht hilft Dir das weiter.

Duke
Angehängte Dateien:
OP #1922340
Lesenswert?

Hallo,
so ich habe nun mal alle Timings überarbeitet und sie alle angepasst,
weil ich ja Ingenieur werden will ;-)
Jetzt sieht es in der Simulation ganz gut aus, aber leider nicht auf 
meiner Hardware, die Leuchtet nämlich immer noch nur grün!
Kann nochmal bitte jemand reinschauen, ob er/sie noch was findet.
Danke für die tolle Hilfe.
Angehängte Dateien:
Gast #1922354
Lesenswert?

Ich hab die Testbench nochmal erweitert. Jetzt sieht man, ob und wohin 
geschrieben/gelesen wird:
1
# ** Note: write       to instruction register: 84 (T)
2
#    Time: 11880100 ns  Iteration: 2  Instance: /lcd_daten_tb
3
# ** Note: write       to instruction register: 69 (E)
4
#    Time: 12959920 ns  Iteration: 2  Instance: /lcd_daten_tb
5
# ** Note: write       to instruction register: 83 (S)
6
#    Time: 14040160 ns  Iteration: 2  Instance: /lcd_daten_tb
7
# ** Note: write       to instruction register: 84 (T)
8
#    Time: 15119980 ns  Iteration: 2  Instance: /lcd_daten_tb

Wenn Du "TEST" ins Instruction- statt ins Datenregister schreibst, ist 
das sicher auch nicht sehr hilfreich.

Duke
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1922368
Lesenswert?

Florian Z. schrieb:
> so ich habe nun mal alle Timings überarbeitet und sie alle angepasst,
> weil ich ja Ingenieur werden will ;-)
Ich bin da (als fertiger Ing.) nicht so streng mit den Timings. Denn ich 
würde gefühlt erst die Daten und die Steuersignale stabil anlegen, und 
dann den Enable-Puls bringen. Denn es tut garantiert nicht weh, wenn 
die Setupzeit tDS6 länger ist...

Und den Chip-Select CSB könntest du doch auch dauernd auf low lassen...
OP #1922392
Lesenswert?

So Hallo,

also ich habe die Hardware nochmal durchgeschaut, und man kann ihn auch 
mit den 2,5 betreiben, weil ich finde beim besten willen nicht den Punkt 
an dem die Spannung abfällt. Aber es sollte trotzdem Funktionieren.
Weiter zu den Timings, soll ich jetzt weiter an der Perfektion arbeiten 
oder einfach alle Signale passend anstehen lassen und dann Enable auf 1 
setzen, also quasi
R/W auf 1
RS auf 0
CSB auf 0
Daten da
und danach Enable auf 1
oder das Timing wie es im Handbuch steht.
Wer meint was? Ich hättte jetzt einfach nur gerne einen laufenden 
Display, damit da mal was geht und ich ein Erfolgserlebnis habe...
Danke für die Hilfe
Moderator (Firma: Titel) Persönliche Seite #1922431
Lesenswert?

Florian Z. schrieb:
> Aber es sollte trotzdem Funktionieren.
Wenn du nicht mal sicher bist, dass deine Hardware i.O. ist, dann suchst 
du derzeit an der falschen Stelle. Aus deinem Schaltplan geht klar 
hervor, dass über diese beiden Widerstände R18 oder R21 entweder 0V oder 
3,3V an den Pin angelegt werden. R21 ist nicht bestückt. Wenn also 
logischerweise R18 bestückt ist, und am RSB nur 3,3V sind, passt schon 
deine Versorgungsspannung nicht.

Oder: mir schwant Übles... Ist R18 etwa auch nicht bestückt? Und RSB 
daher einfach offen?
OP #1928568
Lesenswert?

Hallo Leute,
so nach langer Schaltplan suche reaktiviere ich den Thread, denn habe 
ich einen Hardwarefehler gefunden und ihn behoben.
Nun Funktioniert die Hardware so wie sie soll, und ich habe auch 
nochnmal an meinem Code und den Timings gebastelt, aber leider sehe ich 
immer noch nichts auf meinem Display, bitte helft mir, ich bin am 
Verzweifeln.
Anbei den Code und die TB
thx
Flo
Angehängte Dateien:
Gast #1929106
Lesenswert?

Meine Testbench (siehe oben) sagt zu Deinem Code:
1
# ** Note: read        to data        register: 0 (
2
#    Time: 50001880 ns  Iteration: 2  Instance: /lcd_daten_tb
3
# ** Note: read        to data        register: 57 (9)
4
#    Time: 50766280 ns  Iteration: 2  Instance: /lcd_daten_tb
5
# ** Note: read        to data        register: 57 (9)
6
#    Time: 51845800 ns  Iteration: 2  Instance: /lcd_daten_tb
7
# ** Note: read        to data        register: 20 ()
8
#    Time: 52926100 ns  Iteration: 2  Instance: /lcd_daten_tb
9
# ** Note: read        to data        register: 85 (U)
10
#    Time: 54006400 ns  Iteration: 2  Instance: /lcd_daten_tb
11
# ** Note: read        to data        register: 109 (m)
12
#    Time: 55086700 ns  Iteration: 2  Instance: /lcd_daten_tb
13
# ** Note: read        to data        register: 120 (x)
14
#    Time: 56167 us  Iteration: 2  Instance: /lcd_daten_tb
15
# ** Note: read        to data        register: 15 ()
16
#    Time: 57246520 ns  Iteration: 2  Instance: /lcd_daten_tb

Und read to data register sieht für mich nicht nach
write to command register aus...

Duke

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