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 ?
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
> 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... ;-)
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
> 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
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
> 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 ;-)
>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
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 :)
> 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! ;-)
62 Bit...das ist nun doch 'ne harte Nuss. Ist eine Checksumme angehängt?
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.