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:
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
variableNext_state:state_typ;
3
begin
4
ifrising_edge(clk)andclk='1'then-- getaktet
5
:
6
endif;
7
ifzaehler_gesamt=53999then
8
current_state<=next_stateafter20ns;-- kombinatorisch, aber nicht in Sensitivliste
Denn es gibt keine einstellbaren Verzögerungsgleider in einem FPGA.
Wozu das Herumjonglieren mit Variablen für deine Zustände?
1
2
variableNext_state:state_typ;
3
4
begin
5
ifrising_edge(clk)andclk='1'then
6
next_state:=current_state;
7
casecurrent_stateis
> 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
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
Das ist jetzt (ohne Witz) eine asynchrone FSM.
Die funktioniert nur in der Simulation...
Denn die Sensitivliste ist schon wieder unvollständig:
1
whens3=>ifzaehler4=6then
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...
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
signalcnt:unsigned(3downto0):="0000";
2
process(clk)begin
3
cnt<=cnt+1;
4
endprocess;
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
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
entityLCD_Controlleris
2
Port(-- Signale an LCD
3
:
4
lcd_db:outSTD_LOGIC_VECTOR(7downto0);
5
:
6
:
7
typelcdbus_tis(IDLE,LOADDATA,BUSY);
8
signallcdbus:lcdbus_t:=BUSY;
9
:
10
:
11
-- Buszugriff
12
processbegin
13
waituntilrising_edge(clk);
14
caselcdbusis
15
whenIDLE=>
16
lcdidle<='1';
17
lcd_e<='0';
18
if(lcdstart='1')then
19
lcdidle<='0';
20
lcdbus<=LOADDATA;
21
endif;
22
23
whenLOADDATA=>
24
lcd_db<=lcddata;
25
lcd_rs<=lcdrs;
26
pulse_e<=0;
27
lcdbus<=BUSY;
28
waitbusy<=0;
29
30
whenBUSY=>
31
if(pulse_e=63andoneus='1')then
32
if(waitbusy<shorttime)then
33
waitbusy<=waitbusy+1;
34
else
35
lcdbus<=IDLE;
36
endif;
37
endif;
38
endcase;
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?
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!
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!
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?
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