Forum: FPGA, VHDL & Co. signed addition führt zu komischem SIM Ergebnis


von Der Müsli-Man (Gast)


Lesenswert?

Ich muss zwei Signale bilden:

SIGP = 0,75 x Input + diff
SIGP = 0,75 x Input - diff

Die Befehle lauten:

sig_p <= std_logic_vector(signed(Input) - signed(Input(15 downto 2)) + 
signed(diff));

sig_n <= std_logic_vector(signed(Input) - signed(Input(15 downto 2)) - 
signed(diff));


Nun gibt es zwei Probleme:

1) Die Idee, vom Vollwert ein Viertel abzuziehen, scheint nicht zu 
funktionieren, es kommt bei einigen Werten mehr raus, als erwartet

2) Die Negation geht gar nicht. Bei dem N-Vektor ist das untertes Bit 
ständig null!

Hätte jemand eine Erklären?

Leider muss ich mit ISIM arbeiten, es steht kein ModelSIM zur Verfügung.

von greg (Gast)


Lesenswert?

Das Problem ist vielleicht, dass du hier Arithmetik zwischen 
unterschiedlich langen Bitvektoren machst. Das sollte im typsicheren 
VDHL eigentlich gar nicht klappen! Keine Ahnung was ISIM da fabriziert. 
Am besten du füllst auf die volle Länge auf, also statt 'signed(Input(15 
downto 2))' z.B. '"00" & signed(Input(15 downto 2))'.

Außerdem solltest du beachten, dass das höchstwetige Bit ein sign-Bit 
ist! Ggf. musst du das auch noch (auf 0 gesetzt) hinzufügen, wenn deine 
Bitvektoren ansonsten unsigned-Werte sind, die den gesamten Wertebereich 
nutzen.

von Expert (Gast)


Lesenswert?

greg schrieb:
also statt 'signed(Input(15
> downto 2))' z.B. '"00" & signed(Input(15 downto 2))'.

Das geht dann aber nicht, wegen der Nullen bei signed. Da müste schon 
das Vorzeichen mit rein.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Der Müsli-Man schrieb:
> Nun gibt es zwei Probleme:
> 1) Die Idee, vom Vollwert ein Viertel abzuziehen, scheint nicht zu
> funktionieren, es kommt bei einigen Werten mehr raus, als erwartet
Wieviel mehr?
Einen
Bei signed ist ein shift etwas anderes als ein div.
Der Grund: das Zweierkomplement.
Erst mal Aritmethisch:
-15 / 4 = -3.75 = -3 (integer)
Und jetzt mit einem Shift:
-15 shift 2 = 11110001 shift 2 = 11111100 = -4

> 2) Die Negation geht gar nicht. Bei dem N-Vektor ist das untertes Bit
> ständig null!
Welche Negation?

greg schrieb:
> z.B. '"00" & signed(Input(15 downto 2))'.
Genau das wäre bei einer negativen Zahl sehr ungünstig...
Wenn dann so:
Input(15) & Input(15) & signed(Input(15 downto 2))

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

Wurde resize schon erwähnt?

von greg (Gast)


Lesenswert?

Expert schrieb:
> Das geht dann aber nicht, wegen der Nullen bei signed. Da müste schon
> das Vorzeichen mit rein.

Ja, ich habe den Post leider ohne viel Nachdenken verfasst, das kommt 
davon. Vorzeichenbehaftete Arithmetik ist und bleibt leider ein kleines 
Minenfeld. :(

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.