www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Probleme mit state machine


Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit folgender state machine:

type cam_state_type is (WARTEN_RES, ENDE_RES);
signal cam_state2 : cam_state_type := WARTEN_RES;

reset_all <= RESET and reset2;
  
  reset_sl <= PER_RESET when rising_edge(CLOCK_IN_0);

  process (CLOCK_IN_0)
  begin
    if rising_edge(CLOCK_IN_0) then
      if reset_sl = '0' then
        cam_state2 <= WARTEN_RES;
        reset2 <= '0';
      else
        case cam_state2 is
        
          -- WARTEN_RES
          when WARTEN_RES =>
            reset2 <= '0';
            if GPIO = '0' then
              cam_state2 <= ENDE_RES;
            end if;
            
          --ENDE_RES
          when ENDE_RES =>
            reset2 <= '1';
            
          -- OTHERS
          when others =>
            cam_state2 <= WARTEN_RES;
        end case;
      end if;
    end if;
  end process;

Zur Aufgabe:
der externe RESET wird irgendwann auf '1' gesetzt.
Danach soll der reset2 erst auf '1' gehen, wenn das GPIO signal '0' ist.
Dann bleibt reset2 solange '1', bis der externe RESET wieder Reset gibt.

Nun habe ich das Problem, dass nach dem Beschreiben des FPGA alles 
wunderbar funktioniert. Also RESET ist '0', wird dann auf '1' gesetzt, 
alles läuft los, bis dann irgendwann RESET wieder auf '0' geht.
Nach diesem ersten Durchlauf wird reset2 nicht mehr auf '1' gesetzt, 
deswegen vermute ich das Problem in dieser statemachine.

Ich habe die Sache 100mal durchgedacht und kann nirgendwo erkennen, wo 
cam_state2 irgendwann ins Nirvana springt oder wo das Problem liegt.

Hat jemand einen Hinweis für mich?

Vielen Dank!
Andi

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas B. schrieb:
>           --ENDE_RES
>           when ENDE_RES =>
>             reset2 <= '1';

Du gehst ja auch nicht mehr aus dem Zustand heraus. Deswegen bleibt 
reset2 auf '1'.
Ein others wird nämlich nicht synthtisiert...

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, Mist.. wer ordentlich liest ist klar im vorteil...

Autor: Andreas B. (loopy83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

aber ganz am Anfang im
 if reset_sl = '0' then
        cam_state2 <= WARTEN_RES;
        reset2 <= '0';
wird doch der Ausstieg definiert zum Warte state... nämlich wenn RESET = 
'0' ist. Und das tritt ja zwischendurch definitiv ein.

Danke, Andi :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dorthin springt die FSM garantiert nicht, denn für others wird 
keinerlei Logik generiert, weil alle Zustände von cam_state2 verwendet 
werden:
          -- OTHERS
          when others =>
            cam_state2 <= WARTEN_RES;
Siehe dazu http://www.lothar-miller.de/s9y/categories/25-when-others

> Nach diesem ersten Durchlauf wird reset2 nicht mehr auf '1' gesetzt,
> deswegen vermute ich das Problem in dieser statemachine.
Nachdem die FSM nur 2 Zustände hat, kann sie eigentlich nur im ersten 
hängen, denn im 2. Zustand wäre reset2 ja definitiv '1'.

Woher kommt der PER_RESET, der das garantiert beeinflussen könnte?

BTW:
           if GPIO = '0' then
Ich würde hierhin auch ein Fragezeichen setzen, wenn GPIO nicht 
einsynchronisiert ist

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.