vorzeichenbehafteter rechtshift in VHDL

OP #5789830
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
Gast #5789908
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.
(Firma: www.elpra.de) Persönliche Seite #5790058
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.
Gast #5867693
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"!

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