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


von Till F. (tillf)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Till F. (tillf)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Till F. (Gast)


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.

von Till F. (Gast)


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 ;).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.