mikrocontroller.net

Forum: FPGA, VHDL & Co. HELP Exponentialfunktion


Autor: Corina Thiel (corivhdl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen allerseits,

ich brauche bitte dringend Hilfe: Ich muss eine Exponentialfkt. in VHDL 
darstellen und simulieren. Folgendes habe ich schon:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity efkt is
    Port ( x : in  STD_LOGIC_VECTOR (3 downto 0);
        clock, start: in STD_LOGIC;
           y : out  STD_LOGIC_VECTOR (32 downto 0));
end efkt;

architecture Behavioral of efkt is
  type state_type is
  (IDLE, INIT, RUN, FINISH);

  signal state: state_type;
  --signal i: STD_LOGIC_VECTOR(4 downto 0);  -- i von 0...31

  signal i, fak, pot, quot, res: integer;

begin

states: process (clock)
begin
  if(clock'EVENT and clock='1') then
    case state is
    when IDLE =>
      if(start='1') then
        state<=INIT;
      else
        state<=IDLE;
      end if;

    when INIT =>
      --...
      --i<=1;
      fak<=1;
      pot<=1;
      res<=1;
      state<=RUN;

    when RUN =>
      if(i>26) then
        state<=FINISH;
      end if;

    when FINISH =>
      -- Ausgabe von e^x
      state<=IDLE;

    when others =>
      state<=IDLE;

    end case;
  end if;
end process;

computing: process
begin
  if(state=RUN) then
    i<=i+1;
    -- fak<=fak*i
    -- pot<=pot*x --x hat anderen Datentyp als pot -> umwandeln
    -- quot<=pot/fak
    -- res<=res+quot
  elsif(state=INIT) then
    i<=1;
  end if;
end process;

end Behavioral;

Wie ihr seht, habe ich die Funktionen für die Darstellung der Fakultät, 
Potenz und des Dividierens noch nicht einbinden können. Gibt es dafür 
Bibliotheken? Wenn nicht, kann ich eine Funktion dafür einbinden? Wie?

Für eure schnelle Hilfe danke ich euch ganz herzlich.

LG,
Cori

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Soll das ganze synthetisierbar sein?

Wenn ja: Es gibt keine Standardbibliotheken für Dividerer, Potenz und 
Fakultät. Schon allein wegen Zahlenformat (Bitbreite), Genauigkeit, 
Taktbedingungen usw.
Entweder du suchst vorhandene Quellen im Netz, die auf dein spezielles 
Problem passen oder du musst diese Funktionen selbst implementieren 
(also z.B. Divisionsalgorithmus suchen und umsetzen). Je nachdem wie 
schnell das ganze getaktet ist und welche Technologie du hast, dauern 
solche komplizierten Berechnungen aber auch meist mehrere Takte eh das 
Ergebnis da ist.

Wenn nein: Für Division kannst du z.B. das "/" nehmen, für Potenz und 
Fakultät gibt es möglicherweise auch Verhaltensbeschreibungen. Damit 
kann aber der Synthetisierer meist nicht umgehen sondern nur die 
Simulation.

Außerdem sieht deine Prozessaufteilung irgendwie komisch aus.
i <= i + 1 usw. in einem kombinatorischen Prozess? Du führst damit eine 
Leitung auf sich selbst mit einem Addierer dazwischen. Oder anders 
gesagt, der Ausgang des Addierers hängt direkt an dessen Eingang.

Möglicherweise gibt es aber für die Exponentialfunktion an sich schon 
synthetisierbare Quellen. Schon bei opencores.org geschaut?

Autor: Suggel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sind doch 2er-Potenzen, da kann man das doch logarithmisch rechnen, 
oder?

Autor: Corina Thiel (corivhdl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

eine synthetisierbare Funktion habe ich halt leider noch nicht finden 
können. Das ist ja mein Problem. Der Quellcode ist nach einem 
Steuerflussgraph aufgebaut. Gibt es denn Möglichkeiten, Fakultäten und 
Potenzen mit einzubinden?

Und nein, 2er Potenzen sind es nicht, sonder höhere Potenzen, dürfte 
also nicht mit Logarithmus funktionieren.

Wäre supi, wenn mir jm. noch detaillierter weiterhelfen könnte.

Und ja, eigentlich muss die Funktion synthetisierbar sein.

LG,
Cori

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also wie schon gesagt, so pauschal ist da keine Aussage zu machen. Um 
dir konkret helfen zu können braucht es ein paar mehr Aussagen zu deinem 
Fall.

Nur mal als Beispiel: eine binäre Multiplikation kann funktionieren, 
indem (ähnlich wie beim schriftlichen Multiplizieren) mehrere 
Einzelmultiplikationen geshiftet addiert werden. Das ist, wenn man 
entsprechend schnell sein will und genug Ressourcen hat, in einem Takt 
machbar oder wenn man es anders braucht in  vielen. Auf jeden Fall hängt 
die Anzahl der Takte bzw. Ressourcenaufwand zum Beispiel von der 
Bitbreite der Faktoren ab. Schon allein aus dem Grund gibt es keinen 
pauschalen Multiplizier. FPGAs haben manchmal ein paar 
Multipliziereinheiten mit fester Bitbreite eingebaut, die man angepasst 
verwenden kann.

Für die Division wird der Algorithmus noch komplizierter, Potenz und 
Fakultät sind ja im Grunde nur Multiplikation, wobei man da einiges 
optimieren kann.

Als erstes solltest du dir also einmal klar werden, wie viel Zeit du pro 
Berechnung hast (wieviele Takte).
Dann kannst du entsprechende Algorithmen suchen und dafür Einheiten 
bauen (eine für Division, eine für Multiplikation usw.). Die kannst du 
dann erstmal einzeln testen.
Das ganze dann schön verbunden, ähnlich deiner obigen Struktur und es 
sollte gehen.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Reihenentwicklung 1:1 in VHDL runterzuschreiben ist sicher nicht die 
beste Lösung. Mit CORDIC im hyperbolischen Modus geht's komplett ohne 
Multiplikationen und Divisionen.

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.