Hallo, wenn ich zwei Zahlen subtrahiere, bekomme ich manchmal einen Overflow. Ich kompensiere das folgendermaßen: if (a < b) then c <= a - b; else c <= not(a - b); end if; -- Das funktioniert einwandfrei! Was passiert aber, wenn ich mehrere subtraktionen in einer Anweisung durchführe? z.B.: d <= a - b - c; Muss ich für jede Operation eine Umwandlung durchführen? Gruß domi
Was meinst du denn überhaupt mit Overflow, die Überprüfung ergibt nicht wirklich Sinn?
> wenn ich zwei Zahlen subtrahiere, bekomme ich manchmal einen Overflow. > Ich kompensiere das folgendermaßen: ... Wenn du a-b rechnen willst und dann not(a-b) zurückgibst, ist das Ergebnis schlicht falsch... :-/ Also: was willst du dann mit dem Ergebins? Soll das ein Absolutwert sein? > d <= a - b - c; Es kann ausser der richtigen Lösung d=a-b-c kein wirklich sinnvolles anderes Ergebnis geben: > Muss ich für jede Operation eine Umwandlung durchführen? Wie willst du auf die einzig richtige Reihenfolge kommen? Sagen wir mal a=4, b=5 und c=6. Ist jetzt d=c-a+b oder d=c+a-b oder d=a-c+b oder d=a-b+c richtig? > Welche Alternative gibt es dann? Wenn es von Belang ist, dass es einen Überlauf geben kann: Vorzeichenbehaftet rechnen...
Also wenn ich zwei std_logic_vecotren miteinander subtrahieren will. Z.b.: A= 850.000 und B=900.000 C <= A - B Was passiert dann? Muss ich eine Umwandlung durchführen? Bzw. gibt es dann einen Overflow? Denn das Ergbenis ist ja dann c <= 850.000 - 900.000 = - 50.000?
wemm die bitbreiten passen gibt es keinen overflow und das ergebnis ist entweder -50.000 oder die unsigned repräsentation in abhängigkeit der bitbreite. Deswegen rechnet ma nicht mit std_logic_vector sondern mit den Datentypen unsigned oder signed aus der numeric_std Library, da weiß man was gemeint ist.
Die Bitbreiten für beide std_logic_vectoren sind 32 Bit. Wenn ich dann noch dazu sagen: c <= unsigned(A) - unsigned(B); oder eventuell sogar: c <= std_logic_vector( unsigned(A) - unsigned(B) ); Dürfte das auch noch korrekt sein? Ich gehe mal davon aus, dass in der std_logic-Bibliothek eine Funktion exisitert, welche nach dem unsigned ein return als std_logic_vector ausgibt?
in der numeric_std existiert sowas, so dass du zweiteres problemlos ausführen kannst, ersteres geht wegen den typen nicht
> Die Bitbreiten für beide std_logic_vectoren sind 32 Bit.
Warum rechnest du dann nicht gleich alles mit Integern?
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.