www.mikrocontroller.net

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


Autor: Hans (Gast)
Datum:

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

-- Declare constants


  constant INPUTSIZE  : integer := 14;  -- Bits des verwendeten ADCs
 
  constant MAX_BITS    : integer := INPUTSIZE;    -- Maximaler Eingangswert der LUT in Bits
  constant ZERO_BITS  : integer := INPUTSIZE-1;  -- Bestimmen des Nullpunkts im dB Maßstab
  constant DELTA_BITS  : integer := 5;
  
  ---- interne Konstanten ----
  constant LUT_ADDR_SIZE : integer := ((MAX_BITS-1)-DELTA_BITS)-1;

  function LookUp (index : in unsigned(LUT_ADDR_SIZE downto 0)) return signed;
  
end package ......;


package body ....... is

  ---- LookupTable Function 20*log10(x+0.001/ZERO) --------------------
  function LookUp (index : in unsigned(LUT_ADDR_SIZE downto 0)) return signed is
    variable y : integer;
  begin
    for i in 0 to (2**LUT_ADDR_SIZE)-1 loop
      if index = to_unsigned(i,LUT_ADDR_SIZE) then
        y := integer(real(65536)*real(20)*(LOG10((real((2**DELTA_BITS) * i )))-  LOG10(real(2**(ZERO_BITS)))));
      end if;
      end loop;
    return to_signed(y,32);
  end function LookUp;
-------------------------------------------------------------
 
end .....;

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

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

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

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.