Moin,
ich sitze nun seit einigen Stunden daran, eine LookUpTable
für den Log10 dynamisch beim Kompelieren zu erzeugen.
Je nach definition von ein paar constant's.
Vorher habe ich die Table mit einer Switch-Case Anweisung in einer
Funktion erzeugt (Datei mittels Matlab-Funktion erstellt).
Nach der Synthese oder wie es auch heißen mag, kam ein ROM heraus.
Das passiert nun auch, allerdings scheinen da falsche Werte
drinzustehen.
Mein folgende Interpolation funktioniert nicht mehr. (getestet mittels
Simulation).
Ich glaube das liegt an der wilden hin und her casterei von real zu
integer. Könnte mal jemand über den Code schauen und mir evtl. sagne
wie man es Richtig macht. Danke....
Die Multiplikation mit 65535 dient zur darstellung der Zahl als
Festkommawert (16.16)
1 | package ..... is
|
2 |
|
3 | -- Declare constants
|
4 |
|
5 |
|
6 | constant INPUTSIZE : integer := 14; -- Bits des verwendeten ADCs
|
7 |
|
8 | constant MAX_BITS : integer := INPUTSIZE; -- Maximaler Eingangswert der LUT in Bits
|
9 | constant ZERO_BITS : integer := INPUTSIZE-1; -- Bestimmen des Nullpunkts im dB Maßstab
|
10 | constant DELTA_BITS : integer := 5;
|
11 |
|
12 | ---- interne Konstanten ----
|
13 | constant LUT_ADDR_SIZE : integer := ((MAX_BITS-1)-DELTA_BITS)-1;
|
14 |
|
15 | function LookUp (index : in unsigned(LUT_ADDR_SIZE downto 0)) return signed;
|
16 |
|
17 | end package ......;
|
18 |
|
19 |
|
20 | package body ....... is
|
21 |
|
22 | ---- LookupTable Function 20*log10(x+0.001/ZERO) --------------------
|
23 | function LookUp (index : in unsigned(LUT_ADDR_SIZE downto 0)) return signed is
|
24 | variable y : integer;
|
25 | begin
|
26 | for i in 0 to (2**LUT_ADDR_SIZE)-1 loop
|
27 | if index = to_unsigned(i,LUT_ADDR_SIZE) then
|
28 | y := integer(real(65536)*real(20)*(LOG10((real((2**DELTA_BITS) * i )))- LOG10(real(2**(ZERO_BITS)))));
|
29 | end if;
|
30 | end loop;
|
31 | return to_signed(y,32);
|
32 | end function LookUp;
|
33 | -------------------------------------------------------------
|
34 |
|
35 | end .....;
|