Forum: FPGA, VHDL & Co. Addition ohne Überläufe?


von VDHL-All (Gast)


Lesenswert?

Hi möchte bespielsweise 2 16Bit Werte (in std_logic_vector)

also

signal sig1, sig2 : std_logic_vector (15 downto 0);

miteinander addieren und ebenfalls als 16Bit-Wert ausgeben.

was ich machen muss ist klar:

Ich benötige eine Ergebnis-Variable (hier ein signal natürlich) mit 16 
Bit Breite!
also
signal sig_result : std_logic_vector (16 downto 0);

mein Versuch die Addition durchzuführen war bisher:

signal sig_res_int : integer;

dann

sig_res_int <= to_integer(signed(sig1)) + to_integer(signed(sig2));

dann

sig_res <= std_logic_vector(to_signed(sig_res_int));

leider bekomme ich auf diese Weise immmer Überläufe in meinem Ergebnis!

Kann ich nicht einfach 2 16 Bit Signale addieren, als 17Bit Signal 
speicheren und dann einfach nur die oberen Bits lesen und als 16 Bit 
Ergebnis speichern ?

von Frank Frimmler (Gast)


Lesenswert?

VDHL-All schrieb:
> Kann ich nicht einfach 2 16 Bit Signale addieren, als 17Bit Signal
> speicheren und dann einfach nur die oberen Bits lesen und als 16 Bit
> Ergebnis speichern ?

Ja, mensch kann.
Nachhak: sind die 16 bit signed oder unsigned?

von VDHL-All (Gast)


Lesenswert?

Frank Frimmler schrieb:
> Ja, mensch kann.
> Nachhak: sind die 16 bit signed oder unsigned?

Die sind "signed"
hab jetzt was funktionierendes "durch Probieren" als mit Simu gefunden:


signal sig_res_tmp : signed (16 downto 0);
signal sig1, sig2, sig_result : std_logic_vector(15 downto 0);

sig_res_tmp <= to_signed(to_integer(signed(sig1)),sig_res_tmp'length) + 
to_signed(to_integer(signed(sig2)),sig_res_tmp'length);

dann

sig_result <= std_logic_vector(sig_res_tmp(16 downto 1)); -- auf 16 Bit 
abschneiden!

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


Lesenswert?

VDHL-All schrieb:
> dann einfach nur die oberen Bits lesen
Du willst also einen Mittelwert ((a+b)/2) bilden?

> leider bekomme ich auf diese Weise immmer Überläufe in meinem Ergebnis!
Definiere "Überläufe"...

Das wäre auch einen Versuch wert:
1
use IEEE.NUMERIC_STD.ALL;
2
:
3
sig_result <= std_logic_vector(shift_right(resize(signed(sig1),17) + resize(signed(sig2),17),1));

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.