Liebe mikrocontroller Forenbesucher :)
Ich bin gerade dabei, aus einem Buch die Sprache VHDL zu erlernen.
Eigentlich lief es bis jetzt ziemlich gut nur bin ich gerade auf ein
Problem gestoßen, wo mein Wissen hinsichtlich der Digitaltechnik
(glaube ich zumindest) nicht mehr ausreicht.
Ich bin in dem Buch auf ein Quellcode einer skalierbaren
Addier/Subtrahier Einheit gestoßen, wo ich leider nicht alles ganz
verstanden habe. Wie im Betreff schon beschrieben, haut es mich beim
Carry Bit um. Ich weiß, dass das Carry Bit der Übertrag ist aber in
diesem Kontext ist es mir ein Rätsel, wie man in manchen
case-abschnitten diese auf '1' setzt.
Der Quellcode ist:
Das setzen des Overflow Bits verstehe ich nur beim Carry Bit, sowohl bei
der Addition als auch bei der Subtraktion ist mir ein Rätsel und ich
hoffe ihr könnt mir da weiter helfen.
Lg
Hans Peter schrieb:> Ich weiß, dass das Carry Bit der Übertrag ist aber in diesem Kontext> ist es mir ein Rätsel, wie man in manchen case-abschnitten diese auf '1'> setzt.
Ja nun, abhängig von den führenden Bits der Eingangswerte und der
Rechenoperation, die in der Zeile
TEMP := (ZW(WB-1), V2(WB-1), VI(WB-1));
zu einem 3-Bit-Wort zusammengefasst werden, ergibt sich eben ein
entsprechender Wert für das Carry-Bit.
> Das setzen des Overflow Bits verstehe ich nur beim Carry Bit, sowohl bei> der Addition als auch bei der Subtraktion ist mir ein Rätsel
Ich erkenne die worte, allein der Sinn bleibt mir verschlossen... ;-)
> ich hoffe ihr könnt mir da weiter helfen.
Und was war jetzt nochmal die Frage? Wo klemmt es denn genau? Hast du
Probleme bei bestimmten Syntaxelementen, oder verstehst du nicht, wann
und warum bei einer Addition ein Carry auftritt und wie man das erkennt?
Lothar M. schrieb:> Und was war jetzt nochmal die Frage? Wo klemmt es denn genau? Hast du> Probleme bei bestimmten Syntaxelementen, oder verstehst du nicht, wann> und warum bei einer Addition ein Carry auftritt und wie man das erkennt?
Ja genau, ich verstehe nicht warum das Carry Flag gesetzt wird.
Bei Overflow weiß ich, dass (zum Beispiel) wenn bei der Addition von
zwei positiven Zahlen ein negatives Ergebnis rauskommt, es zu einem
Overflow gekommen ist, wie hier :
1
when"100"=>C_B<='1';OV<='1';
Ehrlich gesagt, hätte ich mir gedacht, dass ich beim Verstehen des
Overflows Schwierigkeiten bekommen würde, aber jetzt ist es genau
umgekehrt :)
Ich gehe immer von der Überlegung aus, dass wenn ich z.B die Bits 1 + 1
zusammenaddiere, das Ergebnis 0 ist und dass das Carry Flag auf 1
gesetzt wird, aber in diesem Beispiel kann ich das irgendwie nicht
anwenden.
Hans Peter schrieb:> Ich gehe immer von der Überlegung aus, dass wenn ich z.B die Bits 1 + 1> zusammenaddiere, das Ergebnis 0 ist und dass das Carry Flag auf 1> gesetzt wird, aber in diesem Beispiel kann ich das irgendwie nicht> anwenden.
Das mit den zwei Bits klappt ja nur bei der kleinsten Stelle (quasi ganz
rechts, Halbadder). Bei allen anderen Stellen muß auch das vorhergehende
Carry-Bit berücksichtigt werden. Dort gibt es eine Drei-Bit-Addition
(Volladder).
Duke
Hans Peter schrieb:> Ja genau, ich verstehe nicht warum das Carry Flag gesetzt wird.
Letztlich ist das augenscheinlich ein Rechenwerk für signed Werte. Und
anhand des Kriteriums "sind die Eingangswerte und das Ergebnis positiv
oder negativ" werden die beiden Flags gesetzt:
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
Zur Beruhigung: so ein hirnrissig kompliziertes Gebilde macht im realen
Leben niemand. Und vor Allem: du hast da kein Problem mit VHDL, sondern
mit der Umsetzung der Logiktabelle. Mach weiter beim nächsten
Beispiel... ;-)
BTW: ein richtiger Schwachpunkt im Buch "VHDL-Synthese" ist übrigens die
Verwendung von bit_vector. Das macht im realen Leben niemand.