Forum: FPGA, VHDL & Co. Entscheidungsoperation IF/else oder ?


von Magneto F. (fpga_stud)


Lesenswert?

Hallo zusammen

Ich arbeite mich im Moment in die Programmiersprache Verilog ein. Bei 
einigen Beispielen sehe ich die Enscheidungsoperatoren "?"
Gibt es irgend einen Vorteils diese "?"? Ich persönlich finde solchen 
Code nämlich sehr unschön.

von Trundle T. (shaheed)


Lesenswert?

Das "?" ist kürzer!

Nachteil zu if/else-Konstrukten:

if()...
else if()...
else if()...
else if()...
-> so viele Fälle auf einer Ebene wie du brauchst

... <= (Bedingung)? Fall 1 (Bed. erfüllt) : Fall 2 (Bed. nicht erfüllt);
oder
... <= (Bedingung)? Fall 1 (Bed. erfüllt) : ((Bedingung 2)? Fall 2.1 : 
(Bedingung 3) Fall 3.1 ...;
-> nur 2 Fälle pro Entscheidungsebene, mehrere Fälle nur über 
Verschachtlung möglich.

Zusammenfassung:
? bei einfachen Ja/Nein-Abfragen praktischer

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


Lesenswert?

Daniel T. schrieb:
> Gibt es irgend einen Vorteils diese "?"?
In der Kürze liegt die Würze...

> Ich persönlich finde solchen Code nämlich sehr unschön.
Über Schönheit darf gestritten werden. Der ?-Operator gefällt mir schon 
in C sehr gut. In VHDL vermisse ich so was knackiges und kompaktes...

EDIT:
Hurra, ich hab ihn wieder gefunden, den 
Beitrag "Re: VHDL: 4Bit Hex -> ASCII" mit dem 
Fragezeichenoperator...  ;-)

: Bearbeitet durch Moderator
von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Daniel T. schrieb:
> Gibt es irgend einen Vorteils diese "?"?

Da es sich um einen Ausdruck (expression) handelt kann man den Operator 
auch innerhalb eines Ausdrucks verwenden. Das wiederum kann in 
bestimmten Situationen notwendig sein.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Trundle Trollkönig schrieb:
> -> nur 2 Fälle pro Entscheidungsebene, mehrere Fälle nur über
> Verschachtlung möglich.

Wenn du das als If-Else-Kette hinschreibst, ist diese ebenfalls
verschachtelt. Normalerweise würde sie so aussehen:
1
  if(Bedingung1) {
2
    Fall1;
3
  }
4
  else {
5
    if(Bedingung2) {
6
      Fall2;
7
    }
8
    else {
9
      if(Bedingung3) {
10
        Fall3;
11
      }
12
      else {
13
        if(Bedingung4) {
14
          Fall4;
15
        }
16
        else {
17
          Fall5;
18
        }
19
      }
20
    }
21
  }

Oft wird diese Verschachtelung etwas kaschiert, indem man überflüssige
Klammen und die Einrückung weglässt:
1
if (Bedingung1) Fall1;
2
else if (Bedingung2) Fall2;
3
else if (Bedingung3) Fall3;
4
else if (Bedingung4) Fall4;
5
else Fall5;

Entsprechendes kann man aber beim ?:-Operator ebenfalls machen:
1
Bedingung1 ? Fall1 :
2
Bedingung2 ? Fall2 : 
3
Bedingung3 ? Fall3 :
4
Bedingung4 ? Fall4 :
5
             Fall5 ;

Das sieht dann sogar noch etwas übersichtlicher aus als das Beispiel
davor.

: Bearbeitet durch Moderator
von Trundle T. (shaheed)


Lesenswert?

ich kann gerade nicht 100 prozentige Bestätigen ob
1
if(Bedingung1) {
2
    Fall1;
3
  }
4
  else {
5
    if(Bedingung2) {
6
      Fall2;
7
    }
8
    else {
9
      if(Bedingung3) {
10
        Fall3;
11
      }
12
      else {
13
        if(Bedingung4) {
14
          Fall4;
15
        }
16
        else {
17
          Fall5;
18
        }
19
      }
20
    }
21
  }

und
1
if (Bedingung1) Fall1;
2
else if (Bedingung2) Fall2;
3
else if (Bedingung3) Fall3;
4
else if (Bedingung4) Fall4;
5
else Fall5;

in verilog wirklich das gleiche ist???

beim ersten gibts es klar ne Priorisierung der Abfragen (ich will es 
jetzt nicht Sequenz nennen weil ja alles noch in einem Takt passieren 
kann).

und ich weiß nicht ob das bei Fall 2 ebenso ist, speziell wenn man 
Bedingungen betrachtet wo Bedinung 2 eine Untermenge von Bedingung 1 
oder so ist.

ich will nicht behaupten, das man mit beiden konstrukten nicht gleiches 
Verhalten herstellen kann, aber ob das immer so ist ohne nochmal was 
umzustellen keine ahnung...

: Bearbeitet durch Moderator
von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Trundle Trollkönig schrieb:
> ich kann gerade nicht 100 prozentige Bestätigen ob
> [beides] in verilog wirklich das gleiche ist???

Mal abgesehen, dass die entsprechende Verilog Syntax im ersten Fall 
natürlich etwas anders aussieht ist es das gleiche.

> beim ersten gibts es klar ne Priorisierung der Abfragen
> und ich weiß nicht ob das bei Fall 2 ebenso ist, speziell wenn man
> Bedingungen betrachtet wo Bedinung 2 eine Untermenge von Bedingung 1
> oder so ist.

Wenn die Syntese beweisen kann, dass zwei Fälle mutually exclusive 
sind, kann sie damit machen was sie will. Wenn nicht, muss priorisiert 
werden. Der Simulation ist das alles sowieso egal.

In SystemVerilog kann man mit unique if auch der Simulation bekannt 
geben, dass man keinen Prioritätsencoder haben möchte. Dann wird zur 
Laufzeit überprüft ob die Exclusivität der Fälle gegeben ist.

: Bearbeitet durch User
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.