Summe "signed"-Zahlen

Gast
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
Gast
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
Gast
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 ;)
Gast
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
Persönliche Seite
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.
Gast
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.