FSM States in "if" oder "case" statement schalten

Gast #865495
Lesenswert?
• ▲
▼
Hallo.

Ich möchte eine FSM auf bestimmte Werte eines einfachen Counters 
schalten. Dazu habe ich folgenden code:

type State is (S0, S1, S2);
signal Current_State, Next_State: State;

Counter: Process (reset, clk)
begin
  if reset ='1' then
    counter <= "00000";
                Current_State <= S0;
  elsif  rising_edge(clk)then
      counter <= counter + '1';
    if counter = "10100" then -- 20
      Current_State <= Next_State;
            counter <= "00000";
    end if;

      case counter is
      when "01001" => Current_State <= Next_State;
      when "10011" => Current_State <= Next_State;
      when "10100" => Current_State <= Next_State;
      when others  =>
      end case;
  end if;

end process ;

Bei der Simulation passiert aber gar nichts, die FSM bleibt konstant auf 
S0. Ich habe es auch schon mit dem IF statement versucht, aber auch das 
funktioniert nicht. Warum ist das so, kann ich eine FSM so nicht 
schalten?
Gast #865549
Lesenswert?
• ▲
▼
Ich kann es gerade nicht testen, aber müsste hinter
      when others  =>
nicht zumindest ein "null;" stehen?

Naja, egal, aber der Fehler ist dass du Current_state Next_State 
zuweist, aber Next_state wird in deinem Code kein Zustand zugewiesen 
(S0, S1 oder S2).
Die Simulation nimmt dann wohl für Next_state per default S0, wobei 
ModelSim (falls du dieses verwendest) das eigentlich durch ein 'U' 
(undefined) anzeigen müsste.

Mir erschließt sich nicht ganz der Sinn, für was brauchst du Next_State 
??

Für mich wäre es so sinnvoller, falls du nur die 3 Zeitphasen S0, S1, S2 
erzeugen willst:

type State is (S0, S1, S2);
signal Counter_state: State;

Counter: Process (reset, clk)
begin
  if reset ='1' then
    counter <= "00000";
    Counter_State <= S0;
  elsif  rising_edge(clk)then
    counter <= counter + '1';
    if counter = "10100" then -- 20
      counter <= (others => '0');
    end if;

    case counter is
      when "01001" => Counter_State <= S1;
      when "10011" => Counter_State <= S2;
      when "10100" => Counter_State <= S0;
      when others  => null;
    end case;
  end if;

end process ;
Gast #865634
Lesenswert?
• ▲
▼
Hi spartanne,

danke für deine schnelle Antwort, es läuft jetzt. Ich brauche den 
next_state gar nicht, da hast du recht. Das war wieder einmal mehr um 
die Ecke gedacht und dann findet man seinen eigenen dummen Fehler 
nicht...

Ja ich hatte den Counter bereits deklariert, das hatte ich hier nicht 
mit rein geschrieben, hätte ich vielleicht der Vollständigkeit halber 
tun sollen.
Und ja, nach "when others" reicht ein "=>", das hab ich getestet.

Also, besten Dank nochmal!

Gruß,
Markus

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.