mikrocontroller.net

Forum: FPGA, VHDL & Co. Verilog Ausdruck "(| OOPS)" in VHDL


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte Fragen, wie das (| OOPS) Konstrukt in VHDL übersetzt wird?

OOPS ist ein 2 Bit Vektor,
OOPS_S ist ein 5 Bit Vektor
assign BACK_UP = (| OOPS) & (STATE == OOPS_S);

Mein Vorschlag:
BACK_UP  <= '1' when (OOPS(0) = '1' or OOPS(1) = '1') and STATE = OOPS_S else '0';

Ich bin mir aber nicht sicher, ob da jetzt ein UND / ODER zwischen OOPS 
(x) gehört.

Was meint ihr?

Danke für eure Hilfe!

Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du sicher, dass das ein "|" ist und kein "!"

Laut
http://www.asic-world.com/verilog/operators1.html#...
ist ein "|" ein bitweises ODER.
Das ergibt aber nur zusammen mit einem zweiten Argument einen Sinn.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist tatsächlich ein "|". Ich habe mir jetzt den Begleittext zu diesem 
Codeabschnitt nochmal durch den Kopf gehen lassen, und da steht 
geschrieben, dass OOPS ungleich 0 sein soll. Das Problem hat sich also 
erledigt.

Ich weiß schon, warum wir hier nicht Verilog sondern VHDL 
programmieren...

Gruß

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Laut
> http://www.asic-world.com/verilog/operators1.html#...
> ist ein "|" ein bitweises ODER.
> Das ergibt aber nur zusammen mit einem zweiten Argument einen Sinn.

Nein. Alle bitwise operators stehen auch als unäre Varianten zur 
Verfügung. Das Ergebnis entspricht dann der Reduktion des Vektors.
|OOPS == OOPS[0] | OOPS[1] | ...

Praktisch, da das Ergebnis ebenfalls vierwertig sein kann. In einer 
vergleichbaren VHDL Variante kann man lediglich eine boolsche Auswertung 
machen. Generisch würde man das in VHDL in etwa so schreiben:
BACK_UP  <= '1' when (OOPS != (others => '0')) and STATE = OOPS_S else '0';

Gruß
Marcus

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marcus,

danke für die Einführung in Verilog - wieder was gelernt!

Bei deinem VHDL Code muss ich dich leider berichtigen:

Ungleich ist in VHDL "/=" nicht "!=", und
(others => '0') darf nur bei einer Zuweisung verwendet werden, aber 
nicht bei einer Abfrage.

Man könnte es dann so schreiben:
BACK_UP  <= '1' when (OOPS /= conv_std_logic_vector(0,OOPS'length)) and STATE = OOPS_S else '0';


Trotzdem vielen Dank für deine Hilfe!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Das Ergebnis entspricht dann der Reduktion des Vektors.
Krass... ;-)

> (others => '0') darf nur bei einer Zuweisung verwendet werden
Richtig, weil bei others die Breite des Vektors nicht definiert ist. 
Das explizite Ausschreiben eines Vektors kann aber z.B. mit dem Attribut 
range umgangen werden:
BACK_UP  <= '1' when OOPS /= (OOPS'range => '0') and STATE = OOPS_S else '0';

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>
> BACK_UP  <= '1' when OOPS /= (OOPS'range => '0') and STATE = OOPS_S else
> '0';
> 

Nun ja, Ihr seht schon, mein VHDL ist etwas eingerostet. Aber es ging ja 
um das Prinzip :-)

Gruß
Marcus

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(OOPS'range => '0')

diese Konstrukt ist mir bis jetzt auch noch nicht über den Weg gelaufen.
Wieder was gelernt - cool!!!

danke!

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.