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
@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
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.
in schleife Durch 2 dividieren (shiften) bitzähler um eins erhöhen, abbruch schleife wenn ergebnis kleiner,gleich 1
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
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
Kann es sein, dass dies eine statische Lösung ist? Ich erkenne nicht, wie das zur Laufzeit funktionieren soll.
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.