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?
... 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.
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 ;
.. und mir fällt noch auf, dass counter nirgends als signal deklariert worden ist, hast du nur einen Ausschnitt gepostet? Gruß
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.