signed addition führt zu komischem SIM Ergebnis

Gast #3660308
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.
Gast #3660328
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.
Moderator (Firma: Titel) Persönliche Seite #3660518
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))

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren