Forum: FPGA, VHDL & Co. If Statement


von M. M. (blackcow)


Lesenswert?

Was an diesem VHDL-Konstrukt funktioniert hier nicht?
1
procedure Calc_Flags_Logic(
2
  constant Data : in  std_logic_vector)
3
  is
4
  begin
5
    if (Data'left = '1') then
6
      do something;
7
    end if;
8
end procedure;

Modelsim bringt die Fehlermeldung: no feasible entry for "="

von user (Gast)


Lesenswert?

weil '1' kein std_logic_vector ist

von user (Gast)


Lesenswert?

Data'left ein Integer
und '1' ein std_logic ist

von Klakx (Gast)


Lesenswert?

Data(Data'left) = '1'

aber wurde ja auch gesagt :)

von M. M. (blackcow)


Lesenswert?

Lösungen? ;-)

Also Data'left ist der Wert des linkesten Bits des std_logic_vectors. 
Ein Integer, der dem Status entspricht (also X,0,1 und was es halt sonst 
noch so gibt). Eine Möglichkeit wäre somit Data'left=3, da Pos('1') bei 
std_logic 3 entspricht?

Geht das auch schöner?

von Lars Schmitt (Gast)


Lesenswert?

Kann man in VHDL den Zuweisungsoperator '=' für den logischen Vergleich 
'==' verwenden?

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


Lesenswert?

M. M. schrieb:
> Also Data'left ist der Wert des linkesten Bits des std_logic_vectors.
Nein. Es ist der Index des linkesten Bits.

Wenn du z.B. sowas hast: signal a : std_logic_vector(7 downto 3);
dann ist a'left = 7 und a'right = 3.

Lars Schmitt schrieb:
> Kann man in VHDL den Zuweisungsoperator '=' für den logischen Vergleich
> '==' verwenden?
Man kann nicht. Man MUSS, denn es gibt kein '==' in VHDL, weil gilt 
"VHDL ist nicht C"

Leih' dir mal das Buch "VHDL-Synthese" aus und lies das...

: Bearbeitet durch Moderator
von Lars Schmitt (Gast)


Lesenswert?

Lothar M. schrieb:
> Man kann nicht. Man MUSS, denn es gibt kein '==' in VHDL, weil gilt
> "VHDL ist nicht C"

Das doppelte Verwenden des '='-Operators für den logischen Vergleich ist 
ja keine reine C-Sache. Schade das man sich für diese Lösung entschieden 
hat.

von bitwurschtler (Gast)


Lesenswert?

Lars Schmitt schrieb:
> Lothar M. schrieb:
>> Man kann nicht. Man MUSS, denn es gibt kein '==' in VHDL, weil gilt
>> "VHDL ist nicht C"
>
> Das doppelte Verwenden des '='-Operators für den logischen Vergleich ist
> ja keine reine C-Sache. Schade das man sich für diese Lösung entschieden
> hat.

Also ich finde die VHDL Regelung besser als in C


                            VHDL  C
Zuweisung         variable  :=   =
Zuwesung Signal             <=   n.a.
Vergleich                    =   ==

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


Lesenswert?

Lars Schmitt schrieb:
> Das doppelte Verwenden des '='-Operators für den logischen Vergleich ist
> ja keine reine C-Sache. Schade das man sich für diese Lösung entschieden
> hat.
Naja, sieh mal das hier:
1
  if (a=3)
2
    machwas();
Du hast in C noch nie sowas programmiert? Ich schon.
In VHDL aber noch nie...  ;-)

von Lars Schmitt (Gast)


Lesenswert?

bitwurschtler schrieb:
> VHDL  C
> Zuweisung         variable  :=   =
> Zuwesung Signal             <=   n.a.
> Vergleich                    =   ==

Im Prinzip ist es ja auch nur eine Syntax die irgendwann am Anfang mal 
festgelegt wurde. Mir gefällt die Zuweisung im Sinne der Definition in 
Mathe. Der Vergleich finde ich aber trotzdem mit dem doppelten 
'=='-Zeichen intuitiver ;-)

Lothar M. schrieb:
> Naja, sieh mal das hier:  if (a=3)
>     machwas();
> Du hast in C noch nie sowas programmiert? Ich schon.
> In VHDL aber noch nie...  ;-)

Ich verstehe den Witz irgendwie nicht. Wo steckt er denn?

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


Lesenswert?

Lars Schmitt schrieb:
> Ich verstehe den Witz irgendwie nicht. Wo steckt er denn?
Im "if (a=3)" ...
Ist dir das echt noch nie passiert?
Das ist eine Zuweisung, obwohl da sicher ein Vergleich gewollt war. 
Und der Compiler verdaut das (mehr oder minder) klaglos. Heute spuckt er 
wenigstens eine Warnung aus, weil das jeder (Compilerbauer auch) schon 
mal falsch gemacht hat...

von berndl (Gast)


Lesenswert?

Lothar M. schrieb:
> Im "if (a=3)" ...

deshalb hab ich's mir mittlerweile angewoehnt (auch wenn's am Anfang 
bloed ausschaut), das ganze so zu schreiben: "if (3==a)" ...
Wenn ich dann ein = vergesse hagelt es keine Warning sondern einen 
Error. Und ja, es ist reine Gewohnheitssache...

von Lars Schmitt (Gast)


Lesenswert?

Lothar M. schrieb:
> Ist dir das echt noch nie passiert?

Doch klar natürlich. Hatte nur nicht geblickt was du gemeint hattest, 
sry :-)

berndl schrieb:
> deshalb hab ich's mir mittlerweile angewoehnt (auch wenn's am Anfang
> bloed ausschaut), das ganze so zu schreiben: "if (3==a)" ...

Ich versuche es mittlerweile auch so, auch wenn es mir vom Lesefluss 
immer ein Dorn im Auge ist da es einfach nicht das ist was ich in einer 
Condition erwarte. Der Vorteil überwiegt aber dagegen klar.

Mir fällt wieder auf das ich in solchen Sachen manchmal einfach zu 
pingelig bin.

von Burkhard K. (buks)


Lesenswert?

berndl schrieb:
> Lothar M. schrieb:
>> Im "if (a=3)" ...
>
> deshalb hab ich's mir mittlerweile angewoehnt (auch wenn's am Anfang
> bloed ausschaut), das ganze so zu schreiben: "if (3==a)" ...

Ungewohnt vielleicht, aber blöd bestimmt nicht. Beide Schreibweisen sind 
äquivalent - also spricht nichts dagegen, sich vom Compiler vor eigener 
Schussligkeit schützen zu lassen.

von A. S. (Gast)


Lesenswert?

Burkhard K. schrieb:
> berndl schrieb:
>> Lothar M. schrieb:
>>> Im "if (a=3)" ...
>>
>> deshalb hab ich's mir mittlerweile angewoehnt (auch wenn's am Anfang
>> bloed ausschaut), das ganze so zu schreiben: "if (3==a)" ...
>
> Ungewohnt vielleicht, aber blöd bestimmt nicht. Beide Schreibweisen sind
> äquivalent - also spricht nichts dagegen, sich vom Compiler vor eigener
> Schussligkeit schützen zu lassen.

Lesbarkeit das höchste Gut ist. Lint und Warnungen es für alles andere 
gibt. Yoda-Sprech in C nicht blöd aber nervig ist.

von Burkhard K. (buks)


Lesenswert?

> Lesbarkeit das höchste Gut ist.

Was bitte an (3 == a) ist nicht lesbar???

Tatsächlich gehört diese Schreibweise zu den etablierten Praktiken der 
C-Programmierung, siehe z.B. Andrew Koenig's "C Traps and Pitfalls" 
(literateprogramming.com/ctraps.pdf) und erfahrene Programmierer kennen 
(und lesen) sie selbstverständlich.

Wer das "Yoda-Sprech" nennt, hat Grundlegendes nicht verstanden - ein 
Programm ist eben keine Prosa.

von Klops (Gast)


Lesenswert?

Burkhard K. schrieb:
>> Lesbarkeit das höchste Gut ist.
>
> Was bitte an (3 == a) ist nicht lesbar???
>

Warnungen -> Fehler und dann darauf verzichten, die Katze von hinten 
nach vorne bürsten.

> Andrew Koenig's "C Traps and Pitfalls"

Ja, der gute Koenig von 1888, als die Compiler noch mit Dampf betrieben 
wurden (ok, ich will nicht übertreiben - ein paar immer noch brauchbare 
Tipps kann man dort natürlich finden).

von Markus F. (mfro)


Lesenswert?

Klops schrieb:
> Warnungen -> Fehler und dann darauf verzichten, die Katze von hinten
> nach vorne bürsten.

So halte ich das auch und compiliere immer mit -Wall. Dann will der 
gcc um die Zuweisung noch ein zusätzliches Klammerpaar sehen.

Und das ist für mich die richtige, moderne und "schöne" Schreibweise.

von A. S. (Gast)


Lesenswert?

Burkhard K. schrieb:
> Wer das "Yoda-Sprech" nennt, hat Grundlegendes nicht verstanden - ein
> Programm ist eben keine Prosa.

was denn dann? Der Computer käme auch mit Nullen und Einsen klar.

Wenn (Ausgaben==5€)...: ist nahe an Prosa.
Wenn (5€==Ausgaben)...: ist Yoda.
Wenn (Einnahmen=Ausgaben)..: Wofür brauche ich Yoda, wenn er mir nicht 
dort hilft, wo mir WALL sowieso hilft?

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.