Hallo zusammen
Ich versuch seit Stunden meinen VHDL code zum laufen zu bringen,
eigentlich funktioniert alles, aber ein SIGNAL sechsSekFlag will einfach
nicht = 1 werden. Es bleibt immer undefiniert. Das Signal timer dass an
der selben stelle = 0 gesetzt wird macht dies wunderbar. Hier der
PROCESS (sechsSek ist ein std_logic Signal):
1
sechsSekZaehler:PROCESS(sekTick)
2
BEGIN
3
IFsekTick'EVENTANDsekTick='1'THEN
4
5
IFaktueller_zustand=state_waitTHENtimer<=timer+1;
6
ELSEtimer<=timer;
7
ENDIF;
8
9
IFtimer=6THENsechsSekFlag<='1';timer<=0;--HIER IST DAS PROBLEM
10
ELSEsechsSekFlag<='0';
11
ENDIF;
12
13
ELSEsechsSekFlag<='0';
14
ENDIF;
15
ENDPROCESSsechsSekZaehler;
Hat irgendjemand eine Idee was ich falsch mache?
Im Anhang findet ihr den gesamten Code inkl. tb.
Vielen Dank für die Hilfe im Voraus
Du solltest es debuggen und schauen, ob die Bedingung jeweils erfüllt
ist und ob sie auch ausgeführt wird.
andererseits habe ich gestern ein komisches ergebnis:
obwohl ich einen getakteten Prozess habe, meckert ISIM an, dass Signale
in der sens Liste fehlen.
Du bnutzt nicht zufällig ISM 13.4?
Hallo Andi
Merci für die rasche Antwort!
Nein ich benutze nicht ISM.
Ja ist seltsam, denn die Anweisung "timer <= 0;" in der Selben IF
Bedingung wird ausgeführt. Selstam ist, dass ich das Signal sechsSekFlag
irgendwo setzten kann und es wird doch nie ausgeführt.
Gruss
Stephen
U oder X? Bei letzterem hättest du ausserhalb des Prozesses noch eine
Zuweisung. Wenn das Signal nur für einen takt 1 sein muss, setzt die
Zuweisung doch gleich nach dem 'event-if.
Übrigens ist dein Einrückungsstil sehr schwer zu lesen und
inkonsequent... if/else sollten immer einzeln stehen, beim 'event-if
machst du es ja auch...
Das Signal erscheint als "U", was meinst du mit "Bei letzterem hättest
du ausserhalb des Prozesses noch eine Zuweisung?" Das ist schon der
Fall, im Prozess "innenbeleuchtung" würde es wieder auf '0' gesetzt.
Das Signal sollte eigentlich nicht nur für einen Takt 1 sein, sondern
bis es vom anderen FF gelesen und wieder zurückgesetzt wird. Aber ich
will das Signal ja sowieso nur auf '1' setzten wenn der timer = 6 ist.
Dan muss ich es doch in der zweiten IF-Schleife setzten oder?
Vielen Dank für deine Hilfe!
Gruss
Stephen
Super das hat geholfen! Das Signal lässt sich nun verändern. Nur ist
seltsam dass es immer wenn es auf '1' gesetzt werden sollte, es
undefiniert wird (siehe Bild im Anhang). Ich kann mit das nicht
erklären, es ist doch klar definiert das es '1' werden sollte?
1
sechsSekFlag<='1';
Vielen Dank schon mal! Immerhin ein Teilerfolg nach so langer Zeit..
Das macht man normalerweise anders. Nämlich mit einer Typdefinition für
die Zustände. Dann braucht man auch keinen others Pfad:
http://www.lothar-miller.de/s9y/archives/30-when-others.htmlSparxx schrieb:> Das Signal musst du zuerst initialisieren,es kann ja nicht irgendeinen> Anfangswert annehmen.
Doch: jedes Signal nimmt uninitialisiert den "linkesten" Wert seiner
Typdefinition an. Bei std_logic ist das 'U', bei einem bit die '0',
bei integer die negativste Zahl usw...
Stephen Trowbridge schrieb:> in der zweiten IF-Schleifehttp://www.if-schleife.de> es ist doch klar definiert das es '1' werden sollte?
Sieh dir mal diesen Prozess an:
1
IFsekTick'EVENTANDsekTick='1'THEN
2
....-- bei einer steigenden Flanke mach das hier
3
ELSE
4
sechsSekFlag<='0';-- und sonst das? Häh?
5
ENDIF;
Kurios, nicht wahr?
Zum Hintergrund: eine steigende Flanke hat die Dauer 0 (Null)... :-o
Du hast damit einen eigenartigen Effekt: die Simulation wird dir hier
für die Dauer der '1' des sekTick den Wert aus dem THEN Zweig
ausgeben, und dann beim nächsten sekTick'event in die ELSE gehen...
In der Hardware ist der sekTick dagegen dauerhaft und fest auf '0'
verdrahtet.
Stephen Trowbridge schrieb:> Ich kann mit das nicht> erklären, es ist doch klar definiert das es '1' werden sollte?
Du hast da 2 parallelen(concurrent) Prozessen und in jedem bekommt das
Signal sechsSekFlag einen Wert zugewiesen.Es ensteht einen Konflikt auf
die Leitung.
Kommentier mal eine Zuweisung aus und du bekommt dein '1'.
Lothar Miller schrieb:> Doch: jedes Signal nimmt uninitialisiert den "linkesten" Wert seiner> Typdefinition an. Bei std_logic ist das 'U', bei einem bit die '0',> bei integer die negativste Zahl usw...
Richtig, Danke.
Wollt ihr nicht mal an die FH dozieren kommen? Das geht mit euch
irgendwie einfacher als mit unseren Dozenten!
Vielen Dank für die Hilfe! Jetzt läufts! War tatsächlich eine unlogische
IF-ABFRAGE ;) (Danke Lothar!) und das mit den 2 parallelen Prozessen war
auch ein Fehler (danke Sparxx!). Jetzt geht mein Signal wunderbar auf
'1'.
Vielen Dank euch!
Gruss
du kannst auch std_ulogic anstatt std_logic verwenden, bei ulogic sind
keine resolving funktionen definiert, und der compiler meckert, wenn du
in 2 processen eine zuweisung auf das gleiche signal hast