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


von Hans-werner M. (hanswerner)


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 ?

von Der Besucher (Gast)


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

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


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
1
   if blabla = 'Z' then ...
in realer Hardware nicht implementierbar sein.

Wenn du aber schreibst
1
If    blabla = '1' then
2
  :
3
elsif blabla = '0' then
4
  :
5
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... ;-)

von SuperWilly (Gast)


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

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


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

von SuperWilly (Gast)


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.:
1
process
2
begin
3
    wait until rising_edge(Clk);
4
    ls_a <= ls_a;                 --(*)
5
    ls_b <= '0';
6
7
    if ls_set_a='1' then
8
       ls_a <= '1';
9
    end if;
10
11
    if ls_set_b='1' then
12
       ls_b <= '1';
13
    end if;
14
15
    ...
16
    if ls_clr_a='1' then
17
       ls_a <= '0';
18
    end if;
19
20
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

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


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
1
    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   ;-)

von SuperWilly (Gast)


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

von Der Besucher (Gast)


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 :)

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


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!   ;-)

von Der Besucher (Gast)


Lesenswert?

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

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


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    ;-)

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.