Integer-Division durch Zweierpotenz - immer synthetisierbar?

OP #1891666
Hallo Leute,

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

5
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?
Moderator (Firma: Titel) Persönliche Seite #1891718
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.
OP #1891732
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.
Moderator (Firma: Titel) Persönliche Seite #1892642
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.
Gast #1892722
> 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:
1
int a = -7;
2
int x = a/2;
ergibt x == -3.
Gast #1892728
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 ;).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.