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
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?
Das sind doch 2er-Potenzen, da kann man das doch logarithmisch rechnen, oder?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.