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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.