Forum: FPGA, VHDL & Co. Subtrahieren in VHDL


von domi (Gast)


Lesenswert?

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

von Purkl (Gast)


Lesenswert?

>c <= not(a - b);
das geht doch eh nicht immer korrekt(???)

von domi (Gast)


Lesenswert?

Welche Alternative gibt es dann?

von D. I. (Gast)


Lesenswert?

Was meinst du denn überhaupt mit Overflow, die Überprüfung ergibt nicht 
wirklich Sinn?

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


Lesenswert?

> 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...

von domi (Gast)


Lesenswert?

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?

von D. I. (Gast)


Lesenswert?

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.

von domi (Gast)


Lesenswert?

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?

von D. I. (Gast)


Lesenswert?

in der numeric_std existiert sowas, so dass du zweiteres problemlos 
ausführen kannst, ersteres geht wegen den typen nicht

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


Lesenswert?

> 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
Noch kein Account? Hier anmelden.