www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Integer-Division durch Zweierpotenz - immer synthetisierbar?


Autor: Till F. (tillf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe ein paar Beispiele gefunden nach denen eine Division wie im 
folgenden Beispiel synthetisierbar sein müsste:
constant divisor : integer := 8; -- always a power of 2
variable myvar   : integer := {blubb};
variable result  : integer := 0;

result := myvar / divisor;

1.: Stimmt das / kann ich mich darauf verlassen? (Xilinx ISE, 
Zielplattform ein Virtex 6 FPGA)

2.: Was wird daraus bei der Synthese gemacht? Oder anders gefragt: 
bringt es irgendeinen Vorteil, wenn ich diese Division durch Entfernen 
der {x} least significant bits "manuell" implementiere?

3. (Ließe sich wohl auch durch Recherche rausfinden, aber vielleicht 
erspart mir einer die Mühe ;) ): Funktioniert das analog auch mit dem 
Modulo-Operator?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Till F. schrieb:
> 1.: Stimmt das / kann ich mich darauf verlassen? (Xilinx ISE,
> Zielplattform ein Virtex 6 FPGA)
Aufpassen beim Teilen von negativen Zahlen!!!
Nehmen wir mal den Wert -7 geteilt durch 2 = -3,5
Ab 0,5 müsste (mathematisch richtig) aufgerundet werden.
Ergebnis also -3

Aber binär kommt heraus: 11111001 >> 1 = 11111100 = -4

> 2.: Was wird daraus bei der Synthese gemacht? Oder anders gefragt:
> bringt es irgendeinen Vorteil, wenn ich diese Division durch Entfernen
> der {x} least significant bits "manuell" implementiere?
Nein, denn genau das macht die Synthese für dich: es wird nur 
umverdrahtet.

>  Funktioniert das analog auch mit dem Modulo-Operator?
Genau gleich und ganz problemlos.

Autor: Till F. (tillf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderbar, danke für die Antwort.

Es handelt sich bei mir immer um positive Zahlen. Dass hier nicht 
korrekt gerundet wird, davon bin ich ausgegangen. Allerdings wäre ich 
wohl wirklich in die Falle getappt, dass das Ergebnis immer einer 
Integer-Division ala Software-Programmiersprachen entspricht. Sollte für 
meinen Fall aber passen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Till F. schrieb:
> Allerdings wäre ich wohl wirklich in die Falle getappt, dass das
> Ergebnis immer einer Integer-Division ala Software-Programmiersprachen
> entspricht.
Die Betrachtung "Shift <-> Division" gilt auch für 
Software-Programmiersprachen. Auch dort darf eine Division bei negativen 
Zahlen nicht einfach so durch einen Shift ersetzt werden.

> Es handelt sich bei mir immer um positive Zahlen.
Da geht das mit dem Shift problemlos.

Autor: Till F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Betrachtung "Shift <-> Division" gilt auch für
> Software-Programmiersprachen. Auch dort darf eine Division bei negativen
> Zahlen nicht einfach so durch einen Shift ersetzt werden.

Das ist nicht so ganz richtig. Habe es auch grade in C ausprobiert:
int a = -7;
int x = a/2;
ergibt x == -3.

Autor: Till F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, jetzt verstehe ich grade was du meinst... habe den Beitrag nur halb 
gelesen :/

Klar, durch ein Shift ersetzen kann man das auch in C nicht einfach so. 
Aber die Umsetzung des Divisions-Operators ergibt immer das korrekt auf 
Ganzzahl abgeschnittene Ergebnis (was dir vermutlich klar war, aber ich 
hatte deine Posts erst so falschverstanden, als wenn das nicht immer so 
wäre ;).

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Till F. schrieb:
> aber ich hatte deine Posts erst so falschverstanden
Ok, also die kompakte Version für Querleser:
int a = -7;
int x = a/2;
ergibt x == -3
int a = -7;
int x = a>>1;
ergibt x == -4

Oder noch kompakter:
 -7 / 2  = -3
 -7 >> 1 = -4

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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