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!
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
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).
Jepp, das ganze abcklocken verbraucht nur 8 FlipFlops, dafür sind die Timing-Probleme locker erschlagen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.