Hallo Leute In einem VHDL Design verwende ich einen Automaten. Da es Probleme gibt, hab ich zum Debuggen Folgendes gemacht: Jedem Zustand im Automat wird eine LED zugeordnet, die dann leuchtet wenn er sich in dem jeweiligen Zustand befindet. Manchmal kommt es aber nun vor, dass auf einmal gar keine LED mehr leuchtet. (alle LEDS intakt, die Zuweisung zu den Zuständen klappt auch) So ein Automat muss doch eigentlich immer in einem definierten Zustand sein, oder ? Das heißt eine LED müsste immer an sein. Mittlerweile glaube ich auch an einen Hardwaredefekt im FPGA. Ist das möglich? THX
@Detlef: Es müsste heissen: Nein,das ist extrem unwahrscheinlich. Ich tippe mal auf eine Fehler im Automaten.Hast du dir einen Zustandsgraphen gezeichnet?Interne Zustände,Folgezustände....etc
Das geht ja richtig schnell hier :) Ich frage mich nur, was man beim Automaten falsch machen kann? Im Prinzip sieht der bei mir so aus: (alles Unnötige weggelassen) process (Takt) begin if Takt = '1' and Takt'event then case zustand is when a => blabla leds <= "001"; if irgendwas then zustand <= b; end if; when b => blabla leds <= "010"; if irgendwas then zustand <= c; end if; when c => blabla leds <= "100"; if irgendwas then zustand <= a; end if; end case; end if; end process;
Hmm....ein Automat wertet interne Zustände aus und wechselt aufgrund externer Ereignisse in Abhängigkeit der internen Zustände in den nächsten.Da ist es schon relevant,was du in dem Zustand machst. Male dir einen Graphen auf,dann wird es allen klarer,was das Ziel ist.
Wenn die Zustandswechsel von externen asynchronen Signalen abhängen, kann es bei Verletzung der Setup/Hold-Zeiten der Register schon zu nicht vorgesehenen Zustandswechseln kommen. Ob du solche Signale benutzt, lässt sich aber leider nicht aus dem Schnipsel erkennen, wenn ja, sollte man die Signale vorher durch FFs einsynchronisieren. T.M.
Bleibt dein Automat beim Anschalten aus oder mitten während des Betriebs? Du hast One-Hot kodiert. Dass heisst es gibt noch Zustände deines Zustandsvectors, die in deinem Automaten nicht näher definiert sind. Evtl. hiflt ein synchroner Reset. G Raini
Noch ein kleiner Tip: Das "if irgendwas" kannst du mit in die Case Anweisung reinpacken - dann hast du auf jeden Fall alle möglichen Zustände abgedeckt: case bla is when a => when b => when c => when others => end case; Gruß, Thomas
Ich würde mal die LEDs einzeln kombinatorisch steuern, da siehst Du nämlich die realen Zustände. So, wie Du es machst, siehst Du nur den vorherigen Zustand!
Hallo Hab das Problem gelöst, indem ich alle externen asynchronen Signale synchronisiert hab. Danke ! P.S: Eine Verringerung der Taktrate hätte das Problem auch behoben - habs ausprobiert.
>P.S: Eine Verringerung der Taktrate hätte das Problem auch behoben - >habs ausprobiert. Fragt sich nur wie lange. Du musst von aussen kommende asynchrone Signale immer über Flip-Flops einlesen, evtl. sogar über zwei oder noch mehr.
Hallo nochmal Angenommen ich synchronisiere die Signale, die von außen kommen, mit dem Takt des Automaten. Dann würde doch das Signal genau in dem Moment übernommen, in dem der Automat seinen Zustand wechselt? Führt das nicht eher zu Instabilität ?
Wenn dies passiert, gelangt das Signal NICHT an den Automaten, da das Eingangs-FF nicht transparant ist, bzw der sich infolge des dort gerade aktiven Taktes nach hinten durchsetzende Eingangszustand nicht schnell genug an folgezellen fortpflanzen kann, um dort noch eine Flanke zu sehen: er packt die dortige Setup-Zeit nicht! Dies genau ist ja die Grundfunktion der gesamten synchronen Taktung! Der Sinn der Einsynchronisierens ist damit genau der, einen solchen Zustandswechsel kurz vor einer Flanke zu unterbinden. Ein statistisch unsicheres Ausgangssignal hat man also nur nach dem ersten FF - der zweite Ausgang kann nicht mehr zum Zeitpunkt der Taktflanke wackeln.
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.