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.