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
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 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Sowas lässt sich nicht synthetisieren:
1 | |
Denn es gibt keine einstellbaren Verzögerungsgleider in einem FPGA. Wozu das Herumjonglieren mit Variablen für deine Zustände?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
> 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...
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
Gast
#1920729
Lothar Miller schrieb: > Denn es gibt keine einstellbaren Verzögerungsglieder in einem FPGA. Aha ;-) Und was sind die IODELAYs im Virtex 4 ?!? Duke
Gast
#1920735
Florian Z. schrieb: > meinem VHDL Prof zum > Thema FSM abgeschrieben Ganz gefährlich. Das was ich an der Hochschule zum Thema VHDL hatte, habe ich kurz in der Praxis probiert, um dann festzustellen, das davon so gut wie nix zu synthetisieren geht. Duke
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.
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...
Hallo, so ich habe nun mal meinen Code abgeändert, danke für den tip mit der rising_edge, dass wusste ich noch nicht, hier also nun der Abgeänderte Code und die neue Simulations, wenn einer noch was sieht, oder der Meinung ist, nun müsste es gehen nur Posten, danke schon mal für alle die Hilfe, Tips, Tricks
Hier noch die Simulation, die wollte gerade nicht ;-)
Das ist jetzt (ohne Witz) eine asynchrone FSM. Die funktioniert nur in der Simulation... Denn die Sensitivliste ist schon wieder unvollständig:
1 | |
2 | |
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...
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
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 | |
2 | |
3 | |
4 | |
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...
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!
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
Gast
#1921107
Das nächste Mal bitte die Testbench gleich mitliefern. Wie schnell ist denn Dein Systemtakt? Hast Du ein Datenblatt/Timingdiagramm von dem Displaychip? Duke
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.
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
BTW: Welche Leitungen vom Display hast du denn alle angeschlossen?
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.
Florian Z. schrieb: > Und Anbei sende ich dir dann > meinen Schaltplan, wie es auf meinem Board verbaut ist, Derzeit hast du über R18 und R21 einen Kurzschluss zwischen 3V3 und GND... :-o Welchen Pegel hat PSB? Welchen hat Reset?
Hallo Lothar, also der Kurzschluss bleibt aus,weil R21 nicht bestückt ist, also klappt das doch, zu den Pegeln Reset = 3,3 V und PSB hat 2,4 V ...
Florian Z. schrieb: > und PSB hat 2,4 V ... Das sollte laut DB aber ziemlich genau 3,3V sein. Denn dorthin gehört für den 8-Bit Modus der Pin angeschlossen... :-o
Dann werd ich mir jetzt mal die Lötstellen nochmal genau anschauen, nicht dass da eine kalte dabei ist...ich hoffe es ist da was mechanisches, sonst weiß ich nicht mehr weiter.
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!
Gast
#1922075
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
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!
Gast
#1922236
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
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.
Florian Z. schrieb: > Kann nochmal bitte jemand reinschauen, ob er/sie noch was findet. Funktioniert deine Hardware? Hast du die Sache mit den 3,3V == 2,4V schon erledigt?
Gast
#1922354
Ich hab die Testbench nochmal erweitert. Jetzt sieht man, ob und wohin geschrieben/gelesen wird:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Wenn Du "TEST" ins Instruction- statt ins Datenregister schreibst, ist das sicher auch nicht sehr hilfreich. Duke
Gast
#1922367
Achja: Warum veränderst Du die Breite der RS und R/W-Impulse? Solltest Di nicht eher die Wartezeiten zwischen den Zugriffen (lt. Datenblatt) variieren? DUke
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...
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
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?
Nein, da kann ich dich beruhigen, r18 ist bestückt. Aber ich mach mich jetzt nochmal mechanisch auf die suche nach einem Fehler und melde mich wieder, wenn ich weiß, dass die Hardware 100% geht. Danke aber für all euere Hilfe CU flo
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
Und für alle die es noch Interessiert, hier mein Simulationsergebnis ;-)
Gast
#1929106
Meine Testbench (siehe oben) sagt zu Deinem Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
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.








