mikrocontroller.net

Forum: FPGA, VHDL & Co. If-Abfrage und std_logic


Autor: Hans-werner M. (hanswerner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häufig werden in VHDL die Typen std_logic und std_logic_vector 
verwendet.
Wie sieht es jedoch bei If-then-else Abfragen aus (blabla ist 
std_logic):

If blabla = '1'
then

else

end if;

Stillschweigend wird sehr wahrscheinlich davon ausgegangen das der 
else-Zweig ausgeführt wird wenn blabla = '0' ist. std_logic kann jedoch 
9 verschiedene Werte annehmen. Was passiert wenn blabla gleich X,Z oder 
U ist ? Sollte man explizit auf '0' abfragen (elsif blabla = '0') oder 
lieber boolean oder bit verwenden ?

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

X,Z,U sind eigentlich nur für die Simulation interessant.
In der Schaltung hast du entweder '0' oder '1'-Pegel (oder die Leitung 
floatet, was man aber verhindern sollte).

Am besten du testest es einfach mal selbst aus, wenn blabla gleich X,Z 
oder
U ist. Für die Simulation kannst du dazu gut die report-Anweisung 
nutzen.

Viel Spass
Der Besucher

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Stillschweigend wird sehr wahrscheinlich davon ausgegangen das der
> else-Zweig ausgeführt wird wenn blabla = '0' ist.
In realer Hardware gibt es nur '1' und '0'.
Es gibt auf jeden Fall kein Bauteil, das z.B. auf 'Z' abfragen könnte. 
Also wird ein
   if blabla = 'Z' then ... 
in realer Hardware nicht implementierbar sein.

Wenn du aber schreibst
If    blabla = '1' then
  :
elsif blabla = '0' then
  :
end if;
dann beschreibst du für die Simulation quasi ein Latch, das bei 
Zuständen ungleich '0' und '1' seinen Wert halten muß.
In der Hardware gibt es nur '0' und '1', deshalb kommt auch mit dieser 
expliziten Beschreibung genau das selbe heraus, wie mit dem else.

> Sollte man explizit auf '0' abfragen (elsif blabla = '0')
> oder lieber boolean oder bit verwenden ?
Drei Fragen, drei Antworten: Nein, nein und nein.

BTW:
Die Designtools werden in die Richtung weiterentwickelt und optimiert, 
in die sich die Mehrheit der Entwickler bewegt. Heutzutage werden 
Beschreibungen umgesetzt, bei denen alte Entwickler nur den Kopf 
schütteln würden.
Fazit: Mach es wie alle anderen. Dann lernst du nichts in Richtung 
"Sackgasse" und gibt es am wenigsten Verwirrungen und Fragerei... ;-)

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

>Was passiert wenn blabla gleich X,Z oder
>U ist ? Sollte man explizit auf '0' abfragen (elsif blabla = '0') oder
>lieber boolean oder bit verwenden ?

Dann schreib es doch einfach so:


process(blabla)
begin
sig <= '0';   -- Default-Zweisungen immer am Anfang, dann brauchst du 
keine
              -- else-Abfragen. Wenn blabla /='1' dann greift immer 
diese
              -- Default-Zuweisung

If blabla = '1' then
sig <= '1';
end if;

end process;

Gruß,
SuperWilly

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sig <= '0';   -- Default-Zweisungen immer am Anfang
Diese Default-Zuweisungen kommen aus der 2- und 
mehr-Prozess-Schreibweise von FSM. Dort hat man sich ohne eine solche 
Defaultzuweisung schnell mal ein Latch eingefangen  :-o

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Default-Zuweisungen sollten aber auch in Ein-Prozess-Darstellungen 
verwendet werden.

Vorteile:
1. übersichtlicher
2. ELSE-Zweige entfallen

Dabei sollten die Default-Zuweisungen aller im Prozess getriebenen
Signale zu Beginn des Prozesses erscheinen.

Bsp.:
process
begin
    wait until rising_edge(Clk);
    ls_a <= ls_a;                 --(*)
    ls_b <= '0';

    if ls_set_a='1' then
       ls_a <= '1';
    end if;

    if ls_set_b='1' then
       ls_b <= '1';
    end if;

    ...
    if ls_clr_a='1' then
       ls_a <= '0';
    end if;

end process;

Auch wenn die (*)-Zuweisung nicht notwendig ist, wird man darauf 
aufmerksam gemacht, dass es im Prozess eine Rücksetzbedingung (ls_clr_a) 
geben muss.
Ohne Default-Zuweisung könnte man diesen Aspekt meiner Meinung nach
vergessen.

Gruß,
SuperWilly

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ELSE-Zweige entfallen
Sie entfallen nicht, sie werden nur weiter nach vorn verlagert. Dadurch 
wird aber u.U. der Zusammenhang, in dem das Signal bearbeitet wird, 
zerrissen.

> ... wird man darauf aufmerksam gemacht ...
Ich könnte es auch mit der Default-Zuweisung (*) vergessen, denn es 
gibt leider keinen Automatismus, der sowas abfängt (und nicht mal eine 
Info wie bei einem Latch).
Ich muß diese Zeile lesen und händisch suchen, ob das Signal irgendwo 
gesetzt und zurückgesetzt wird. Insgesamt ist m.E. die Zuweisung
    ls_a <= ls_a; 
eine syntaktische Krücke. Ein guter Kommentar wirkt genausoviel.

Aber das sind (wie Einrückungen und Quellcodeformatierungen) persönliche 
Vorlieben und Gewohnheiten   ;-)

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein guter Kommentar wirkt genausoviel.

Es gibt keine besser wirkenden Kommentare als solche, die direkt im 
Quellcode
verankert sind und direkt ins Auge schießen ;O)

Meine Erfahrung hat mich gelehrt (gerade bei größeren 
if-Verschachtelungen und vielen Codezeilen pro Prozess), dass 
Defaultzuweisungen am Anfang des Prozesses Gold wert sind.

Klar, letztendlich macht es jeder so, wie er es für richtig und 
hilfreich hält.

Gruß,
SuperWilly

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich verwende in asynchronen Prozessen auch gern eine 
Defaultzuweisung zu Beginn, weil ich mir dann sicher sein kann, KEIN 
Latch zu erhalten. Und ich muss mich nicht um jeden else-Zweig kümmern, 
wo sowieso nur das selbe drin stehen würde, wie in der Defaultzuweisung.

Es gibt noch genug Möglichkeiten, wie man sich so ein Teil ungewollt 
einfangen kann, ohne das es erstmal in der Simulation auffällt. Zum 
Glück verraten die meisten Synthesetools solche Schnitzer recht schnell.

Sicherlich ist das alles Geschmackssache und jeder soll "seinen" Stil 
finden.

Der Besucher

PS.: binärer Maschinencode ist selbsterklärend :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> verwende in asynchronen Prozessen auch eine Defaultzuweisung zu Beginn
Ich auch. Immer.
Bei unserer Diskussion ging es um vollständig synchrone Prozesse.

> PS.: binärer Maschinencode ist selbsterklärend :)
10001110010111000110001101101011100011011100011001011000110010!   ;-)

Autor: Der Besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
62 Bit...das ist nun doch 'ne harte Nuss. Ist eine Checksumme angehängt?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 62 Bit...
Ja, mit 64 Bits könnte das ja jeder...

> Ist eine Checksumme angehängt?
Nein, du darfst diese Zahl (oder beliebige Ausschnitte davon) aber gerne 
als Zufallszahl verwenden    ;-)

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.