Für einen etwas komplexerer Zustandandsautomaten suche ich eine Möglichkeit Bitgruppen deren Belegung egal ist anzugeben. Also statt when "1001" | "1011" | "1101" | "1111" => eben when "1$$1" => wobei $$ eben für 0 oder 1 stehen kann. Allerdings befinden sich diese Bitgruppen mehrfach an verschiedenen Stellen. Oder muss ich das ganze über geschachtelte case Anweisungen lösen die dann jeweils diese Bits übergeht?
Also zumindest bei ghdl hat das nicht funktioniert, da wurden dann die entsprechenden Zuweisungen nicht ausgeführt (und assert hat keine Meldung gegeben). Oder sollte das mit dem dem Datentyp std_logic in Verbindung stehen. Das 'X' nicht funktioniert habe ich mir eben so erklärt das der Simulator testet ob das entsprechende Bit '0' und '1' gleichzeitig ist. Bei '-' sucht sich der Simulator aus welche Bitkombination besser passt und 'W' funktioniert auch nicht :-( Meine Hoffnung liegt nun darin das man ein Macro oder ähnliches benutzen kann das den Ausdruck dann expandiert, oder anderweitig diese Logik erzeugt.
Mach doch eine Bitweise UND-Verknüpung mit 0b1001 dann fallen die mittleren Bits immer raus.. MFG
Sorry, ich lag daneben. Asche auf mein Haupt. http://www.eda.org/comp.lang.vhdl/FAQ1.html#dont_cares std_logic_vector und - ist also das was Du suchst. mfg, Stefan. P.S. Google: vhdl dont care; zweiter Link, ein Forumpost, gleiches Problem. :-)
Vielen Dank, die Lösung ist leider immer noch nicht (so richtig) dabei :-/ (oder ich steh gewaltig auf dem Schlauch, was auch eine Möglichkeit wäre) Das Ausmaskieren mit and funktioniert nicht da die auszumaskierenden Bitgruppen über einen 16 Bit breiten Vektor verstreut liegen. (Es geht um Befehlsdekodierung mit etlichen Befehlsformaten). Ja google hab ich bemüht, nur leider nicht den Suchterm "don't care" benutzt, statt dessen etwas blind mit 'fsm', 'state machine' etc. rumprobiert. '-' ist eben leider keine Lösung, was auch in VHDL-FAQ beim Beispiel dabeisteht: "an 'address' value of "111000" or "101000" will match the 'others' clause!". Allerdings gibts da noch std_match, damit sollte es relativ einfach möglich sein das ganze auf if/elsif umzustellen ...
Huch, ich hätte lesen sollen. :-) Irgendwie ist mir nicht klar, warum Du den komplexen Zustandsautomaten mit den Bit-Werten kodierst. Warum machst Du Dir nicht einen eigenen Enumeration-Typen, in dem Deine Zustände Namen bekommen? Das wird doch viel übersichtlicher als die Bitfelder! mfg, Stefan. P.S. der Tip mit Google war kein Vorwurf.
Ja, die Zustände haben schon eigene Namen. Nur muss ich ja die Befehle dekodieren wozu ich eben gerne ein grosses case-Konstrukt benutzt hätte, eben mit Löchern an den entsprechenden Stellen wo Register,Direktoperanden etc. kodiert sind. Fand ich eine gute Idee, das ganze als flache Liste zu implementieren bei dem die Befehlsgruppen jeweils entsprechend grosse Sprünge machen. Schon für die Fehlersuche erschien es mir sinnvoll wenn die einzelnen Zuweisungsgruppen geordnet im Quelltext auftauchen. Das Problem das ich bislang bei if/elsif sehe ist das ich ein "when other" händisch realisieren muss. Hier hätte ich gerne ein von der Architektur eh vorgesehenen 'illegal/unknown instruction' Trap auch für noch nicht implementierte Befehle benutzt. Den Tipp mit google hab ich auch nicht als Vorwurf aufgefasst, nur manchmal muss man halt wissen wonach man sucht, und wenns nichts bringt frag ich im Forum nach. Hatte schon ein paarmal das Erlebnis das ich beim Frage formulieren von selbst auf eine Löung gekommen bin und die Frage letztendlich doch nicht stellen musste.
Ok, das mit dem 'when others' hat sich erledigt. Wozu gibts schliesslich den finalen 'else' Zweig?
Ach, sind dann die Bitmuster Deine Eingangsdaten? Dein Argument mit when other verstehe ich auch nicht. if(bed1) then -- bla elif(bed2) then -- blubb else -- das ist Dein when others?? end if; Dann ist doch std_match genau das was Du brauchst. Nur daß es eben kein case-Konstrukt ist. Aber ist das so schlimm? mfg, Stefan.
Ich glaube, er will so etwas machen: if(bed1) then -- 16 Bit auskodiert -- bla elif(bed2xxx) then -- 13 Bit auskodiert, rest egal -- blubb elif(bed3xxbed3) then -- 14 Bit auskodiert, zwei Bit in der Mitte egal -- blubb elif(bed4) then -- 16 Bit auskodiert -- blubb else -- das ist Dein when others?? end if; Das sollte theoretisch mit xxx gehen. Gruss Axel
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.