Forum: FPGA, VHDL & Co. "OR" Operator für nicht boolesche typen?


von GS (chromosoma)


Lesenswert?

Abend.
Ich habe sowas hier:

TYPE COLOR(RED,GREEN,BLUE);
SIGNAL CLR: COLOR:=RED;

A<=B WHEN CLR= RED OR GREEN;


Leider gibt mein Compiler ein Fehler aus, da die RED, GREEN etc. nicht 
boolesche Typen sind, also darf man die nicht mit "OR" Verknüpfen.

Gibt es ein Umweg, wie ich sowas richtig schreiben kann?

von Georg A. (georga)


Lesenswert?

A<=B WHEN CLR=RED OR CLR=GREEN;

Aber was willst du zuweisen, wenn die Bedingung mal nicht zutrifft? Ein 
Else-Zweig ist unbedingt notwendig...

von GS (chromosoma)


Lesenswert?

Ja, ELSE Zweig ist vorhanden, ich wollte nur viele Bedienungen 
möglichst kompakt zusammenfassen.=)

von W. M. (thematsche)


Lesenswert?

Böser Kommunist schrieb:
> Ja, ELSE Zweig ist vorhanden, ich wollte nur viele Bedienungen
> möglichst kompakt zusammenfassen.=)

Danke, waere die bessere Antwort gewesen. ;)

von GS (chromosoma)


Lesenswert?

Danke:D

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


Lesenswert?

Böser Kommunist schrieb:
> A<=B WHEN CLR= RED OR GREEN;
>
> Leider gibt mein Compiler ein Fehler aus, da die RED, GREEN etc. nicht
> boolesche Typen sind, also darf man die nicht mit "OR" Verknüpfen.
>
> Gibt es ein Umweg, wie ich sowas richtig schreiben kann?
Du könntest den OR Operator überladen. Der ist schließlich auch nur 
als Funktion definiert.
Allerdings kann ich mir nicht so richtig vorstellen, wie man überhaupt 
Farben verodern könnte. Und auch nicht, wie wie die Ergebnisfarbe 
z.B. der Berechnung von "rot oder grün" bzw. "rosa oder braun" aussehen 
würde. Und am allerwenigsten, was man damit anfangen könnte...
Du erkennst das Dilemma?

> Gibt es ein Umweg, wie ich sowas richtig schreiben kann?
Ergo ergibt sich aus meinen obigen Überlegungen, dass du die Farben 
tatsächlich nicht verodern wolltest, sondern (wie vorgeschlagen) 
abfragen wollstest, ob entweder die Farbe=rot oder ob die Farbe=grün 
ist...

: Bearbeitet durch Moderator
von Georg A. (georga)


Lesenswert?

Man müsst auch noch = überladen, aber dann wird es schwierig, auf 
einzelne Werte zu vergleichen. Das Problem ist daher eigentlich, dass 
unabhängige = und OR nicht funktionieren, wenn das = auch noch "normal" 
gehen soll.

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


Lesenswert?

Georg A. schrieb:
> Man müsst auch noch = überladen
Nicht, wenn "RED OR GREEN" wieder eine Farbe zurückliefern würde. Ich 
kann mir aber wie gesagt nicht vorstellen, was das für eine Farbe wäre, 
bzw. wie eine Veroderung von Farben überhaupt definiert sein könnte...

von Georg A. (georga)


Lesenswert?

Naja, wenn es erstmal um den "Use-case" geht, dass man ein = mit 
veroderten Einzelfarben als Möglichkeit der Auswahl hat, kann man ja die 
Einzelfarben diskret auf die Bits eines Vektors legen und noch ein 
Flagbit für die Mischung setzen. Das = müsste das Bit dann auswerten und 
dann selbst nochmal binär ORen und bei !=0 (äh, /=0...) true 
zurückliefern.

Anekdote am Rande: Das mit OR aus Auswahl ist recht intuitiv. Ich hatte 
mich bei meinen ersten Basteleien am ZX81 schon gefragt, warum "PRINT 2 
OR 3" immer nur 1 ergab und nicht mal 2 oder 3 ;)

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


Lesenswert?

Georg A. schrieb:
> "PRINT 2 OR 3"
:-D

von GS (chromosoma)


Lesenswert?

Hallo,
Danke für die Hilfe.
Die Farben repräsentieren einfach einen Zustand eines FSM:

A<=B  wenn Zustand  RED oder Zustand Blau.

So habe ich es gemeint.

von Schlumpf (Gast)


Lesenswert?

Böser Kommunist schrieb:
> A<=B  wenn Zustand  RED oder Zustand Blau.

Wenn du es dann auch so hinschreibst, tut es ja

A<=B when CLR=RED or CLR=BLUE;

Der Vergleich CLR=RED  liefert ein Ergebnis (Wahr oder Falsch)
Der Vergleich CLR=BLUE liefert ein Ergebnis (Wahr oder Falsch)
Der Operator OR verknüpft die beiden
Wenn mindestens ein Vergleichsergebnis wahr ist, dann ist die Logische 
Verknüpfung wahr.

Wenn du aber schreibst:
..when CLR=RED or BLUE, dann kann das keine logische Operation sein.

CLR=RED liefert wahr oder falsch. Aber BLUE? Was soll das sein? wahr 
oder falsch?
Also kann das or nichts damit anfangen.

Das ist das Problem des alltäglichen Sprachgebrauchs.
Gehe aus der Kneipe, wenn DU=BESOFFEN or PLEITE.
Das ist aber Umgangssprache. Es wir implizit angenommen, dass sich 
PLEITE auch auf dich bezieht. Genaugenommen ist das aber falsch. Es 
könnte auch heißen, dass dein Kumpel pleite sein muss.
Dann müsste die Gleichung Lauten:

Gehe nach Hause, wenn DU=BESOFFEN or KUMPEL=PLEITE

Und da der Compiler nicht raten kann, was du meinst, wer hier pleite 
sein soll, geschweige denn, Umgangssprache beherrscht, musst du ihm 
sagen, WER PLEITE sein muss .. oder in deinem Fall eben BLAU :-)

von Markus F. (mfro)


Lesenswert?

Schlumpf schrieb:
> DU=BESOFFEN or PLEITE.

Das passt zwar nicht mehr zum ursprünglichen Problem, aber wenn 
"besoffen" und "pleite" std_logic's sind, kann man in VHDL 2008 durchaus 
schreiben:
1
IF ?? besoffen OR pleite THEN
2
...
bzw. in dem Fall die ?? sogar weglassen.

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.