Forum: FPGA, VHDL & Co. If Statement


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von M. M. (blackcow)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht lesenswert
weil '1' kein std_logic_vector ist

von user (Gast)


Bewertung
2 lesenswert
nicht lesenswert
Data'left ein Integer
und '1' ein std_logic ist

von Klakx (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Data(Data'left) = '1'

aber wurde ja auch gesagt :)

von M. M. (blackcow)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert
Kann man in VHDL den Zuweisungsoperator '=' für den logischen Vergleich 
'==' verwenden?

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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. (achs)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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. (achs)


Bewertung
2 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.