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
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
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
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 ;)
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
Macht das in der Synthese einen Unterschied, ob man zwei 12Bit-Signed-Werte addiert oder den Umweg über Integer geht?
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.