Verilog Ausdruck "(| OOPS)" in VHDL

Gast #1697372
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ß
Gast #1697423
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ß
Persönliche Seite #1697630
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
Gast #1697646
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!
Moderator (Firma: Titel) Persönliche Seite #1697652
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';

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren