finite state machine

Gast #297525
Lesenswert?
• ▲
▼
Eine beliebte Aufgabe für den Anfang ist die Ampelsteuerung auf einer
Modellbahnanlage. Die Hersteller von CPLDs und FPGAs stellen oft solche
Applikationen zur Verfügung, schau mal bei www.xilinx.com oder
www.altera.com
73
Christoph
Gast #297526
Lesenswert?
• ▲
▼
nich lange um den heißen Brei geredet, hier ist mal ein Beispiel
für eine simple FSM mit 3 States, die auf ein Startsignal
wartet und dann 2 Bytes nacheinander auf einem Port ausgibt :

type STATE_TYPE is (IDLE, B1, B2); -- FSM hat 3 States
signal state : STATE_TYPE; -- Signal, welches den aktuellen State
speichert

-- irgendwelche Datenbytes
constant DATA1 : std_logic_vector(7 downto 0) := x"12";
constant DATA2 : std_logic_vector(7 downto 0) := x"FF";

process(reset, clk)
begin
   if reset='1' then
      state <= IDLE;

   elsif rising_edge(clk) then

      case state is -- in welchem State sind wir gerade ?

        when IDLE => -- wir warten hier auf den Startschuss
           if start='1' then -- jetzt wirds Zeit, was zu tun
              state <= B1;
              d_out <= DATA1; -- schieb das 1. Byte zum Port d_out
           end if;

        when B1 =>
           state <= B2;
           d_out <= DATA2; -- und jetzt das 2. Byte

        when B2 =>
           if acknowledge='1' then -- eine Bestätigung abwarten
              state <= IDLE;
           end if;
      end case;
   end if;
end process;
Gast #297527
Lesenswert?
• ▲
▼
Oder, wie es einem in der Schule beigebracht wird, noch mal das obige
Beispiel in drei Prozesse Eingabe, Zustandsspeicher und Ausgabe.
Wie man sieht, es ist ein Mealy-Automat ;)

type STATE_TYPE is (IDLE, B1, B2); -- FSM hat 3 States
signal state : STATE_TYPE; -- Signal, welches den aktuellen State
speichert
signal new_state: STATE_TYPE;

-- irgendwelche Datenbytes
constant DATA1 : std_logic_vector(7 downto 0) := x"12";
constant DATA2 : std_logic_vector(7 downto 0) := x"FF";

-- Eingabe-Logik
process(acknowledge, start, state)
begin
   case state is
      when IDLE =>
         if start = '1' then
            new_state <= IDLE;
         end if;
      when B1 =>
         new_state <= B2;
      when B2 =>
         if acknowledge = '1' then
            new_state <= IDLE;
         end if;
      when others => new_state <= IDLE;
   end case;
end process

-- Zustandsspeicher
process(reset, clk, new_state)
begin
   if reset = '1' then
      state <= IDLE;
   elsif clk = '1' and clk'event then
      state <= new_state;
   end if;
end process;

-- Ausgabe-Logik
process(state, start)
begin
   case state is
      when IDLE =>
         if start = '1' then
            d_out <= DATA1;
         end if;
      when B1 =>
         d_out <= DATA2;
      when others => null;
   end case;
end process;
Gast #297529
Lesenswert?
• ▲
▼
hallo

danke für eure schnellen antworten.

@fpga user
dein bsp ist schon mal nicht schlecht nur weiß ich nicht genau was da
gemacht wurde und wie das hergeleitet wurde.

@alex
auf diese art habe ich auch gelernt vhdl zu programmieren.

jetzt wurde mir gesagt dass ich ein bsp. mit fsm lösen sollte.

mich interessiert jetzt was der unterschied zwischen prozessen und fsm
ist und wie man ein fsm beispiel löst. angeblich geht das mit
irgendwelchen kreisen.

kennt vielleicht jemand eine gute doku dazu
Gast #297530
Lesenswert?
• ▲
▼
Ja das geht mit Kringeln und Bögen... eine Statemachine oder auf Deutsch
Zustandsdiagramm ist eine Möglichkeit, einen Programmablauf
darzustellen, ähnlich wie ein Flußdiagramm. Ein einfacher
Vier-Bit-Zähler hat beispielsweise 16 Zustände nämlich die Zahlenwerte
von 0 bis 15. Das Zustandsdiagramm ist sehr einfach, jeder Zustand ist
ein Kreis, der mit einer der 16 Zahlen nummeirert ist, und von Kreis
Nr. 0 geht ein gebogener Pfeil zu Zustand Nr.1 usw. Von Zustand 15
gehts wieder zu Nr. 0
Ein Reseteingang sorgt schon für einige weitere Pfeile, die alle auf
Nr.0 enden.
Neben jedem Pfeil wird die Bedingung beschriftet, unter der dieser
Zustandsübergang stattfindet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren