Forum: FPGA, VHDL & Co. HELP Exponentialfunktion


von Corina T. (corivhdl)


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

von na (Gast)


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?

von Suggel (Gast)


Lesenswert?

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

von Corina T. (corivhdl)


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

von na (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

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.