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


von Guest (Gast)


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
1
assign BACK_UP = (| OOPS) & (STATE == OOPS_S);

Mein Vorschlag:
1
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ß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bist du sicher, dass das ein "|" ist und kein "!"

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

von Guest (Gast)


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ß

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> Laut
> http://www.asic-world.com/verilog/operators1.html#Bit-wise_Operators
> 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.
1
|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:
1
BACK_UP  <= '1' when (OOPS != (others => '0')) and STATE = OOPS_S else '0';

Gruß
Marcus

von Guest (Gast)


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:
1
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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
BACK_UP  <= '1' when OOPS /= (OOPS'range => '0') and STATE = OOPS_S else '0';

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

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

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

Gruß
Marcus

von Guest (Gast)


Lesenswert?

1
(OOPS'range => '0')

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

danke!

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.