www.mikrocontroller.net

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


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: smay4finger. (Gast)
Datum:

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

mfg, Stefan.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Albi (Gast)
Datum:

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

Autor: smay4finger. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: smay4finger. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

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

Autor: smay4finger. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.