Forum: FPGA, VHDL & Co. case/when mit 'Löchern?


von Tom (Gast)


Lesenswert?

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?

von smay4finger. (Gast)


Lesenswert?

Du kannst dafür "x" benutzen, das steht für "don't care".

mfg, Stefan.

von Tom (Gast)


Lesenswert?

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.

von Der Albi (Gast)


Lesenswert?

Mach doch eine Bitweise UND-Verknüpung mit 0b1001 dann fallen die
mittleren Bits immer raus..
MFG

von smay4finger. (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von smay4finger. (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

Ok, das mit dem 'when others' hat sich erledigt. Wozu gibts
schliesslich den finalen 'else' Zweig?

von smay4finger. (Gast)


Lesenswert?

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.

von Axel (Gast)


Lesenswert?

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