Addition ohne Überläufe?

Gast #3106392
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 ?
Gast #3106431
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!
Moderator (Firma: Titel) Persönliche Seite #3106478
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));

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren