Hallo, ich versuche gerade den Ausgangs-Bitvektor eines Digitalfilters (2er-Komplement) testweise auf 16 LEDs anzuzeigen. Dazu möchte ich vorher den Betrag bilden. abs_sig <= conv_std_logic_vector(conv_unsigned(abs(signed(fir_out_sig(37 downto 22))),16),16); scheint mir etwas zu kompliziert zu sein. Und das Ergebnis scheint invertiert zu sein.. Wenn ich abs(signed(fir_out_sig(37 downto 22))); nehme, gibt er mir doch eine SIGNED-Zahl zurück, was beim Betrag ja nicht nötig ist und somit das MSB "verschwendet" wird. Wenn jemand eine einfache Lösung weiß, würde ich mich freuen. M.K.
warum willst du beim debuggen nicht das Vorzeichen "sehen", das ist doch wichtig beim debuggen?
Dann lass das MSB für die weitere Verwendung halt weg, wenns immer 0 ist.
Ist es aber nicht. Der Betrag von 10000...0 (binär) ist wieder 10000...0 (binär), also das MSB = 1.
Für MSB = 0 kannst du es ja einfach abschneiden, die Zahl ist positiv. Für MSB = 1, also für eine negative Zahl, musst du die Rückwandlung machen, also Komplement bilden und 1 addieren.
Wieso 1 addieren? Bei der Zahl 1xxxx10 hätte er z.B. - 1, das Komplement liefert doch bereits eine 1?
Das stimmt nicht. Schau dir nochmal genau das 2er Komplement an. Unter dem Strich ist es egal, wie man das löst. Die abs() Funktion macht wahrscheinlich auch nichts anderes. Da der Zahlenraum unsymmetrisch ist, muss man sich für 100..000 halt was einfallen lassen.
> Bei der Zahl 1xxxx10 hätte er z.B. - 1, das Komplement liefert doch bereits eine
1?
1....10 ist aber -2.
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.