Integer-Division durch Zweierpotenz - immer synthetisierbar?

OP #1891666
Lesenswert?

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

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