www.mikrocontroller.net

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


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, soll nicht synthetisierbar sein.

Autor: Da Micha (damicha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hans.

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

constant VECTOR_SIZE        : integer := log2(INTEGER_VALUE);

Wäre sogar synthetisierbar ;-).

Gruß DaMicha.

Autor: FPGAküchle (Gast)
Datum:

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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine schönere Variante der log2-Berechnung wäre:
  function log2ceil (n : natural) return natural is
    variable n_bit : unsigned(31 downto 0);
  begin  -- log2ceil
    if n = 0 then
      return 0;
    end if;
    n_bit := to_unsigned(n-1,32);
    for i in 31 downto 0 loop
      if n_bit(i) = '1' then
        return i+1;
      end if;
    end loop;  -- i
    return 1;
  end log2ceil;

Diese hat den Vorteil dass es weniger Hardware benötigt

Autor: R.K. (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-...

Autor: R.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.