Forum: FPGA, VHDL & Co. Dynamische LookUpTable in Vhdl


von Hans (Gast)


Lesenswert?

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 .....;

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


Lesenswert?

Warum machst du nicht wirklich eine LUT, und initialisierst die 
einfach ein einziges Mal? Dann könntest du die Funktion wesentlich 
leichter überprüfen, indem du einfach den Speicherinhalt anzeigst...

Wie dort in der unteren Hälfte mit dem Sinus:
http://www.lothar-miller.de/s9y/archives/37-DDFS-mit-BROM.html

EDIT:
>>> Dynamische LookUpTable in Vhdl
Was ist an dieser LUT dynamisch?

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.