Forum: FPGA, VHDL & Co. vorzeichenbehafteter rechtshift in VHDL


von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ich hab' zwei std_logic_vector signale mit je 40 bit laenge: a und b. Da 
sind vorzeichenbehaftete Zahlen (2er komplement) drinnen.

Jetzt will ich sowas berechnen lassen:
1
b = b + a/1024

koennte ich ja so hinschreiben:
1
b <= b + (a(39) & a(39) & a(39) & a(39) & a(39) & a(39) & a(39) & a(39) & a(39) & a(39 downto 10))

Sieht - hm - unschoen aus. (Wie) gehts schoener?

Gruss
WK

von unknown (Gast)


Lesenswert?

probier mal so:
1
b <= std_logic_vector(signed(b) + resize(signed(a(39 downto 10)),b'length));

von Dussel (Gast)


Lesenswert?

Ich weiß es gerade nicht genau. Aber für unsigned gibt es Funktionen 
oder Befehle dafür. Guck mal nach shr, shl. Da müsstest du mehr finden.
Also in unsigned casten, schieben und wieder zurückcasten.

von Markus F. (mfro)


Lesenswert?

unknown schrieb:
> probier mal so:b <= std_logic_vector(signed(b) +
> resize(signed(a(39 downto 10)),b'length));
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
b <= std_logic_vector(shift_right(signed(b), 10));

von Dussel (Gast)


Lesenswert?

Stimmt. Shr und shl ist Quatsch. Wenn wäre es sla oder sll. Die wären 
hier aber auch nicht sinnvoll.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

unknown schrieb:
> probier mal so:b <= std_logic_vector(signed(b) + resize(signed(a(39
> downto 10)),b'length));

Alternativ dazu:
1
b <= std_logic_vector(signed(b) + shift_right(signed(a), 10));

Durfte auf das gleiche rauskommen. Evtl. sogar:
1
b <= std_logic_vector(signed(b) + signed(a)/1024);

Muesste man mal das Synthese Resultat anschauen.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Merci fuer die Vorschlaege. OK, ich seh' schon wo die Reise hingeht: An 
der Casterei werd' ich wohl nicht vorbeikommen.

Gruss
WK

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


Lesenswert?

Und immer im Auge behalten: eine Division einer negativen Zahl durch 
1024 ist prinzipiell anders als ein vorzeichenbehafteter Rechtsshift 
dieser Zahl um 10. Dabei wird nämlich unterschiedlich gerundet...

von Markus F. (mfro)


Lesenswert?

Dergute W. schrieb:
> Casterei werd' ich wohl nicht vorbeikommen.

Dergute W. schrieb:
> An
> der Casterei werd' ich wohl nicht vorbeikommen.

Warum definierst Du die Signale überhaupt erst als std_logic_vector, 
wenn Du damit rechnen willst?

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Markus F. schrieb:
> Warum definierst Du die Signale überhaupt erst als std_logic_vector,
> wenn Du damit rechnen willst?
Tja, das kommt davon, wenn Hardwerker zu sehr an ihren Bits kleben.


Lothar M. schrieb:
> Und immer im Auge behalten: eine Division einer negativen Zahl durch
> 1024 ist prinzipiell anders als ein vorzeichenbehafteter Rechtsshift
> dieser Zahl um 10. Dabei wird nämlich unterschiedlich gerundet...
Aber nur, wenn man beim Rechtsschiften vorher nicht korrekt gerundet 
hat, was man aber müsste, wenn man eine Division beschreibt.

Siehe "Runden in VHDL"!

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.