Forum: FPGA, VHDL & Co. log2 in VHDL auf integer?


von Hans (Gast)


Lesenswert?

Hallo

Ich möchte in VHDL aus einer Integerzahl deren Logarithmus Dualis 
berechnen. Ich habe ein Generic und möchte daraus die Bitbreite für die 
Deklaration eines std_logic_vector ableiten. Weiß jemand wie das geht?

Über Antwort würde ich mich freuen. Bedanke mich schonmal.

Gruß Hans

von Falk (Gast)


Lesenswert?

@Hans

>Ich möchte in VHDL aus einer Integerzahl deren Logarithmus Dualis
>berechnen. Ich habe ein Generic und möchte daraus die Bitbreite für die

Wenn es synthetisierbar sein soll, geht das nur über eie Tabelle/ROM.

MFG
Falk

von Hans (Gast)


Lesenswert?

Nein, soll nicht synthetisierbar sein.

von Da M. (damicha)


Lesenswert?

Hallo Hans.

Nimm wie schon erwähnt ne Tabelle:
1
type log2arr is array(1 to 40) of integer;
2
constant log2  : log2arr := (0,1,2,2,3,3,3,3,4,4,       --  1..10
3
                             4,4,4,4,4,4,5,5,5,5,       -- 11..20
4
                             5,5,5,5,5,5,5,5,5,5,       -- 21..30
5
                             5,5,6,6,6,6,6,6,6,6);      -- 31..40
6
7
constant VECTOR_SIZE        : integer := log2(INTEGER_VALUE);

Wäre sogar synthetisierbar ;-).

Gruß DaMicha.

von FPGAküchle (Gast)


Lesenswert?

in schleife Durch 2 dividieren (shiften) bitzähler um eins erhöhen, 
abbruch schleife wenn ergebnis kleiner,gleich 1

von Hans (Gast)


Lesenswert?

Danke für die Antworten.

Habe es mit einer selber geschreibenen Funktion gelöst.

function ld(m:positive) return natural is
begin
   for n in 0 to integer'high loop
      if (2**n >= m) then
         return n;
      end if;
   end loop;
end function ld;

Gruß Hans

von Christian (Gast)


Lesenswert?

eine schönere Variante der log2-Berechnung wäre:
1
  function log2ceil (n : natural) return natural is
2
    variable n_bit : unsigned(31 downto 0);
3
  begin  -- log2ceil
4
    if n = 0 then
5
      return 0;
6
    end if;
7
    n_bit := to_unsigned(n-1,32);
8
    for i in 31 downto 0 loop
9
      if n_bit(i) = '1' then
10
        return i+1;
11
      end if;
12
    end loop;  -- i
13
    return 1;
14
  end log2ceil;

Diese hat den Vorteil dass es weniger Hardware benötigt

von R.K. (Gast)


Lesenswert?

Kann es sein, dass dies eine statische Lösung ist? Ich erkenne nicht, 
wie das zur Laufzeit funktionieren soll.

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


Lesenswert?

R.K. schrieb:
> Kann es sein, dass dies eine statische Lösung ist? Ich erkenne nicht,
> wie das zur Laufzeit funktionieren soll.
Ein großer Multiplexer....

Ein log2 auf eine Binärzahl ist nichts anderes, als das MSB zu finden:
http://www.lothar-miller.de/s9y/archives/55-Finde-das-MSB.html

von R.K. (Gast)


Lesenswert?

Ja schon, aber man bekommt nur die Position des MSB und damit eine Art 
Vorkommawert und nicht die Bruchstellen!

Bitsuchen ist trivial - aber wie löst man das Problem der 
Nachkommastellen?

Angenommen, man nimmt den ld(X) = ln2(X) einer Binärzahl von 32 Bit. Mit 
12 factional Bits läuft das auf sowas raus:

INT  LD  4096*LD
65535  15,99998  65536
65500  15,99921  65533
30000  14,87267  60918
10000  13,28771  54426
1000  9,96578  40820
100  6,64386  27213
10  3,32193  13607
9  3,16993  12984
8  3,00000  12288
7  2,80735  11499
6  2,58496  10588
5  2,32193  9511
4  2,00000  8192
3  1,58496  6492
2  1,00000  4096
1  0,00000  0

lässt sich das irgendwie fortgesetzt iterativ lösen?

(ld würde ja reichen, andere lassen sich ja skalieren)

von Duke Scarring (Gast)


Lesenswert?

R.K. schrieb:
> Bitsuchen ist trivial - aber wie löst man das Problem der
> Nachkommastellen?
Dafür würde ich mir den CORDIC-Algorithmus anschauen.

Duke

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.