If-Abfrage und std_logic

#1359309
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 ?
Gast #1359325
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
Moderator (Firma: Titel) Persönliche Seite #1359343
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... ;-)
Gast #1359504
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
Gast #1359745
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
Moderator (Firma: Titel) Persönliche Seite #1359805
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   ;-)
Gast #1359846
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
Gast #1359942
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren