Forum: FPGA, VHDL & Co. Latches in FSM


von Philipp S. (scrippo)


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!

von Falk (Gast)


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

von Jannulis T. (tembridis)


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).

von Falk (Gast)


Lesenswert?

Genau.

MfG
Falk

von Martin K. (mkohler)


Lesenswert?

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

von Philipp S. (scrippo)


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

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
Noch kein Account? Hier anmelden.