Ich benutze das auch, gerade in Situationen wo alles außer
Integer-Rechnung nervig wird.
Beispiel:
1 | signal x_div : integer range 1 to 2;
|
2 | variable pixeladdr : integer range 0 to 524287;
|
3 |
|
4 | pixeladdr := pixeladdr_base + (x_flip_offset - ((x_scrolled mod 8) / x_div));
|
5 | if (hicolor = '0') then
|
6 | pixeladdr := pixeladdr + ((7 - (y_scrolled mod 8)) * 4);
|
7 | else
|
8 | pixeladdr := pixeladdr + ((7 - (y_scrolled mod 8)) * 8);
|
9 | end if;
|
Wie man sieht klappt es nicht nur mit "mod" die unteren Bits raus zu
ziehen, sondern sogar die Division über ein Signal(x_div) zu einem
conditional Shift zu machen, wenn der Wertebereich so eingegrenzt ist.
(Quartus 18.1)
Mit dem Cyclone 4 konnte man sogar noch das *4 und *8 in einem signal
zuweisen und damit das If contruct sparen:
1 | signal hicolormul: integer range 4 to 8;
|
2 |
|
3 | if (hicolor = '0') then
|
4 | hicolormul <= 4;
|
5 | else
|
6 | hicolormul <= 8;
|
7 | end if;
|
8 |
|
9 | pixeladdr := pixeladdr + ((7 - (y_scrolled mod 8)) * hicolormul);
|
Mit dem Cyclone 4 führt das zu einem conditional Shift, mit dem Cyclone
5 leider zu einem echten MUL (DSP Element), warum auch immer die
Synthese sowas macht.