mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht 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:
b = b + a/1024

koennte ich ja so hinschreiben:
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

Autor: unknown (Gast)
Datum:

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

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus F. (mfro)
Datum:

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

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

b <= std_logic_vector(shift_right(signed(b), 10));


Autor: Dussel (Gast)
Datum:

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

Autor: Tobias B. (Firma: www.elpra.de) (ttobsen)
Datum:

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

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

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

Muesste man mal das Synthese Resultat anschauen.

: Bearbeitet durch User
Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

Gruss
WK

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht 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...

Autor: Markus F. (mfro)
Datum:

Bewertung
1 lesenswert
nicht 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?

Autor: Weltbester FPGA-Pongo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.