mikrocontroller.net

Forum: FPGA, VHDL & Co. Latches in FSM


Autor: Philipp Seifert (scrippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich will eine FSM erzeugen, bei der einige Zustandsuebergaenge abhaengig 
von einem 8-bit Eingangssignal "input" sind.
Genauer gesagt soll es ein UART sein, das input seriell rausgeschickt. 
Jetzt moechte ich, dass nachdem das Senden des Signals begonnen hat es 
komplett gesendet wird, auch wenn sich waehrendessen der Eingang input 
aendert.

Darum habe ich einen Zustand der vor dem Senden input auf ein Signal 
inputbuffer schreibt:

when startbit =>  data_out <= '0';
      inputbuffer <= input;
      if (input1(0)='1') then
          next_state <= send1;
      else next_state <= 1send0;
       end if;

die Zustaende send1 bzw. send0 sehen so aus:

when send0   =>    data_out <= '0';
      inputbuffer <= inputbuffer;
        if bitnumber = 8 then
        next_state <= stopbit;
                          else
         if (inputbuffer(bitnumber)='1') then
           next_state <= send1;
        else next_state <= send0;
        end if;
      end if;

Das funktioniert wunderbar, aber natuerlich wird dabei ein Latch erzeugt 
und ich habe einmal gelernt, dass es sehr unfein ist, wenn in der 
kombinatorischen Logik der FSM Speicher erzeugt wird, warum genau weiss 
ich nicht mehr.
Ich bin mir aber nicht sicher, ob das auch hier ein Problem darstellt. 
Ich denke, man mag keine Latches, weil dann die Kombinatorik eventuell 
nicht rechtzeitig zum naechsten Takt den naechsten Zustand berechnet.
Ist dieses Latch fuer mein Design problematisch? Ich glaube, da es sich 
um ein externes Signal handelt, das nicht vom Zustand abhaengt ist es 
schon richtig was ich gemacht habe. Oder gibt es eine bessere Loesung?

Fuer Hinweise bin ich sehr dankbar!

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergiss die ganzen Latches!! Mach einfach eine getakteten Prozess und 
gut. Das ist der korrekte und professionelle Weg. Latches gabs in den 
Siebzigern, so wie LSD und Hippies. Alles Schnee von gestern ;-)

MfG
Falk

Autor: Jannulis Tembridis (tembridis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es besteht für dich die Möglichkeit eine default-Zuweisung vor dem 
CASE-Statement einzufügen. Latches entstehen, wenn ich mich richtig 
entsinne, in kombinatorischen Prozessen immer genau dann wenn ein Signal 
nicht in alle Fällen zugewiesen wird (sprich also sein alten Wert ja 
irgendwie halten muss).

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau.

MfG
Falk

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jepp, das ganze abcklocken verbraucht nur 8 FlipFlops, dafür sind die 
Timing-Probleme locker erschlagen.

Autor: Philipp Seifert (scrippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer die Tipps, aber ich glaube ihr versteht mich nicht richtig. 
Ich glaube ich habs selber nicht richtig verstanden. Jetzt ist mir die 
Loesung eingefallen:

Ich habe natuerlich auch einen getakteten Prozess in der FSM mit 
state<=next_state usw...

Das Problem ist nicht, dass ich das Signal nicht in jeden Zustand 
(case-statement) zuweise, das Problem ist, dass es sich ja nur in einem 
Zustand aendern soll und da gibt es natuerlich ein Latch, wenn ich das 
im kombinatorischen Prozess mache und in den Zustaenden in denen das 
Signal gleichbleiben soll inputbuffer <= inputbuffer reinschreibe.

Die Anweisung das das Signal sich nur in einem Zustand aendern soll muss 
in den getakteten Prozess:

process(rst,clk)
 begin
...
  if (clk'event and clk='1') then
    if (state=startbit) then
      inputbuffer = input;
    end if;
   state <= next_state;
  end if;
 end process;

Und schon wird aus dem Latch ein Register.

Ich denke, das ist das was du mit abclocken meinst Martin, oder?

MfG
Philipp

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.