www.mikrocontroller.net

Forum: FPGA, VHDL & Co. FSM States in "if" oder "case" statement schalten

Autor: Markus (Gast)
Datum: 12.05.2008 22:16

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?
Autor: Markus (Gast)
Datum: 12.05.2008 22:19

... mir ist beim kopieren des codes für diesen thread beim nullsetzten
des counters die Zuweisung "Current_State <= Next_State;" dazwischen
gerutscht, das gehört da natürlich nicht rein.
Autor: spartanne (Gast)
Datum: 12.05.2008 23:36

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 ;
Autor: spartanne (Gast)
Datum: 12.05.2008 23:39

.. und mir fällt noch auf, dass counter nirgends als signal deklariert
worden ist, hast du nur einen Ausschnitt gepostet?
Gruß
Autor: Markus (Gast)
Datum: 13.05.2008 08:29

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

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net