Forum: FPGA, VHDL & Co. Signal bleibt ständig undefiniert


von Stephen T. (trowbste)


Angehängte Dateien:

Lesenswert?

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
  IF sekTick'EVENT AND sekTick = '1' THEN
4
     
5
     IF aktueller_zustand = state_wait THEN  timer <= timer + 1;
6
     ELSE    timer <= timer;
7
     END IF;
8
     
9
     IF timer = 6 THEN sechsSekFlag <= '1'; timer <= 0;   --HIER IST DAS PROBLEM
10
     ELSE sechsSekFlag <= '0';
11
     END IF;
12
     
13
  ELSE sechsSekFlag <= '0';
14
  END IF;
15
END PROCESS sechsSekZaehler;

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

von Andi (Gast)


Lesenswert?

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?

von Stephen T. (trowbste)


Lesenswert?

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

von Georg A. (georga)


Lesenswert?

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...

von Stephen T. (trowbste)


Lesenswert?

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

von Sparxx (Gast)


Lesenswert?

Stephen Trowbridge schrieb:
> Das Signal erscheint als "U"

Das Signal musst du  zuerst initialisieren,es kann ja nicht irgendeinen 
Anfangswert annehmen.
1
...
2
  signal sechsSekFlag : std_logic := '0';  -- oder '1',wie es dir gefällt
3
...

von Stephen T. (trowbste)


Angehängte Dateien:

Lesenswert?

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..

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
--Zustand Kodierung
2
CONSTANT state_idle      :std_logic_vector(1 downto 0) := "00";
3
CONSTANT state_licht    :std_logic_vector(1 downto 0) := "11";
4
CONSTANT state_wait      :std_logic_vector(1 downto 0) := "01";
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.html

Sparxx 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-Schleife
http://www.if-schleife.de

> es ist doch klar definiert das es '1' werden sollte?
Sieh dir mal diesen Prozess an:
1
  IF sekTick'EVENT AND sekTick = '1' THEN
2
      ....                  -- bei einer steigenden Flanke mach das hier
3
  ELSE 
4
      sechsSekFlag <= '0';  -- und sonst das? Häh?
5
  END IF;
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.

von Sparxx (Gast)


Lesenswert?

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.

von Sparxx (Gast)


Lesenswert?

Übrigens das hier brauchst du nicht,glaube ich:
1
WHEN state_wait =>    --Wenn im Wartezustand (tür zu, licht noch an)
2
  IF sechsSekFlag = '1'THEN folge_zustand <= state_idle; sechsSekFlag <= '0';--hier
denn,sechsSekFlag  ist '1' für die dauer einer Taktperiode,wenn timer 6 
erreicht.
Die Experten können dir eine bessere Lösung anbieten.
Gruß

von Andi (Gast)


Lesenswert?

Lothar ht es mal wieder - ich habe den ELSE Pfad beim clock event glat 
überlesen.

von Stephen T. (trowbste)


Lesenswert?

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

von user (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.