Forum: FPGA, VHDL & Co. Summe "signed"-Zahlen


von heinz (Gast)


Lesenswert?

Ich habe hier 2 std_logic_vectoren mit "signed" Zahlen a 12 bit. Diese 
Vectoren will ich Vorzeichenrichtig addieren und einen 13 bit 
Ausgangsvektor bekommen. Geht das mit der ieee Library?

Mfg Heinz

von ING Presssack (Gast)


Lesenswert?

Ja, musst nur vorher das Ergebnis erweitern.

"erg" als 12 downto 0 und dann erg <= a + b, bei "a" = 11 downto 0

wenn nicht, nimm unsigned-lib

von Matthias (Gast)


Lesenswert?

Nein, er sollte schon die die Zahlen selbst vorzeichenrichtig erweitern, 
auf 13 bit, und dann addieren. Dann stimmt das Ergebnis auf jeden Fall.

zB, wenn du signale a und b mit je 12bit als std_logic_vector hast, 
folgendes in den Prozess:

zu variablen:
a_temp: signed(12 downto 0);
b_temp: signed(12 downto 0);
erg: signed(12 downto 0);

im prozess:
if a(11) = 1 then -- Vorzeichenrichtiges erweitern
  a_temp := signed("1" & a);
else
  a_temp := signed("0" & a);
end

if b(11) = 1 then -- Vorzeichenrichtiges erweitern
  b_temp := signed("1" & b);
else
  b_temp := signed("0" & b);
end

erg := a + b; -- und addieren

von Matthias (Gast)


Lesenswert?

Korrektur: Zumindest vermute ich, dasss man ne Fehlermeldung bekommt, 
wenn man die 12+12=13 Addition von ING Presssack einfach so versucht. 
Wenn es doch geht , dann nehme ich meinen Kommentar zurück, würde die 
Sache natürlich einfacher machen ;)

von tobias (Gast)


Lesenswert?

man man man, warum einfach wenn es nicht auch kompliziert geht:

v1 und v2 seien std_logic_vector breite 12
erg das Signal in dass das Ergebniss soll breite 13

erg <=  conv_std_logic_vector(
               conv_integer(signed(v1)) +
               conv_integer(signed(v2))
                             , erg'left + 1);

Bibliotheken: arith & signed

von heinz (Gast)


Lesenswert?

Danke

von VHDL_Mensch (Gast)


Lesenswert?

Macht das in der Synthese einen Unterschied, ob man zwei 
12Bit-Signed-Werte addiert oder den Umweg über Integer geht?

von tobias (Gast)


Lesenswert?

kommt dasselbe raus

von VHDL_Mensch (Gast)


Lesenswert?

Tatsächlich? Integer ist doch 32Bit breit!?

von J. S. (engineer) Benutzerseite


Lesenswert?

Ja, ist 32 Bit, aber real physikalisch wird nur das erzeugt, was an 
"Leitungen" = Signalen auch benötigt wird. Der Rest fällt dank 
intelligenter Synthese unter den Tisch.

Zur Aufgabe: Er addiert signed - dher muss man erst vorzeichenrichtig 
weitern. Allerding ergeben zewi auf 13 erweiterte signed-Zahlen u.U. 
einen 14Bit-Vector.

von Rick Dangerus (Gast)


Lesenswert?

@Tobias:
Die Bibliotheken: arith & signed
sollte man vermeiden, weil Synthesetoolabhängig. Besser ist 
numeric_std.all.


@Matthias:
Zum vorzeichenrichtig Addieren muß man nur das erste Bit 
vervielfältigen, siehe auch Tietze/Schenk, Abschnitt 2er-Komplement.

@heinz:
Also lieber so:
1
result <= signed( a(a'high) & a ) + signed( b(b'high) & b );

Rick

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.