log2 in VHDL auf integer?

Gast #479542
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
Gast #479568
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
#479670
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.
Gast #479741
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
Gast #1042958
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
Gast #2688780
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)

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