Hallo, ich hab eine Funktionaltität die ich in VHDL beschreiben will. Die Funktion(eine Berechnung) lässt sich rein sequentiell beschreiben(Ist nur ein paar Zeilen lang). Ich würde gerne eine Funktion benutzen weil ich dann keine Synchronisationsprobleme bekommen kann(zumindest brauch ich nicht zu synchronisieren). Die Funktion wird nur einmal in einer Statemachine aufgerufen, allerdings kann dieser Status öfter aktiv sein. Spricht etwas gegen die Verwendung einer Funktion und dem vorziehen einer Komponente(also einer entity)? Danke und gruß
die Frage klingt für so, als würdest du glauben, dass eine Komponente immer getaktet laufen müsste. Dem ist nicht so: du kannst durchaus auch rein kombinatorische Komponenten oder rein kombinatorische Prozesse verwenden. Du kannst z.B. ein UND-Gatter (rein kombinatorisch) auf alle drei Arten beschreiben. Wenn dir die Beschreibung per Funktion sympathischer ist, kannst du sie durchaus verwenden. Aber Sätze wie dieser wecken den Eindruck, dass du vielleicht eine falsche Vorstellung von Funktionen hast: rudi schrieb: > Die Funktion wird nur einmal in einer Statemachine > aufgerufen, Dir ist klar, dass dieser "Aufruf" der Funktion nur in der VHDL-Beschreibung stattfindet, aber nicht in der synthetisierten Hardware? Anders ausgedrückt: egal ob du es per Funktion oder per Komponente beschreibst: solange die beschriebene Hardware genau das selbe tun soll, wird auch genau die selbe Hardware erzeugt. rudi schrieb: > Die > Funktion(eine Berechnung) lässt sich rein sequentiell beschreiben(Ist > nur ein paar Zeilen lang). Und du stellst (per constraints) sicher, dass diese "paar Zeilen" innerhalb eines Takts der übergeordneten Statemachine ausgewertet werden können, oder? Wenn du deiner Sache nicht sicher bist (oder wenn du z.B. bei der Synthese Warnungen wegen "combinatorial loops" oder "latches" erhältst) wäre es eine gute Idee, mal deinen konkreten Code hier vorzustellen.
rudi schrieb: > Ich würde gerne eine Funktion benutzen weil ich dann keine > Synchronisationsprobleme bekommen kann (zumindest brauch ich nicht zu > synchronisieren). Diese Kausalkette ist elementar falsch. > Die Funktion wird nur einmal in einer Statemachine aufgerufen In VHDL wird nichts irgendwie "aufgerufen", sondern immer in Hardware umgesetzt. Und wenn etwas nur 1 einziges Mal benötigt wird, ist eine Funktion vollkommen unnötig. Eine Funktion verwendet man für Dinge, die laufend wieder gebraucht werden, so wie z.B. rising_edge(), to_integer(), usw... > Spricht etwas gegen die Verwendung einer Funktion und dem vorziehen > einer Komponente(also einer entity)? Nein. Du musst aber an deiner Denkweise noch grundsätzlich was korrigieren.
:
Bearbeitet durch Moderator
Achim S. schrieb: > Dir ist klar, dass dieser "Aufruf" der Funktion nur in der > VHDL-Beschreibung stattfindet, aber nicht in der synthetisierten > Hardware? Anders ausgedrückt: egal ob du es per Funktion oder per > Komponente beschreibst: solange die beschriebene Hardware genau das > selbe tun soll, wird auch genau die selbe Hardware erzeugt. > > rudi schrieb: >> Die >> Funktion(eine Berechnung) lässt sich rein sequentiell beschreiben(Ist >> nur ein paar Zeilen lang). > > Und du stellst (per constraints) sicher, dass diese "paar Zeilen" > innerhalb eines Takts der übergeordneten Statemachine ausgewertet werden > können, oder? > > Wenn du deiner Sache nicht sicher bist (oder wenn du z.B. bei der > Synthese Warnungen wegen "combinatorial loops" oder "latches" erhältst) > wäre es eine gute Idee, mal deinen konkreten Code hier vorzustellen. Die Funktionsauswertung entspricht einem Indexzugriff in einer Lookup-Table(constants), damit sollte(wenn ich richtig liege) das innerhalb eines Takts ausgewertet werden können. Lothar M. schrieb: > rudi schrieb: >> Die Funktion wird nur einmal in einer Statemachine aufgerufen > In VHDL wird nichts irgendwie "aufgerufen", sondern immer in Hardware > umgesetzt. > Und wenn etwas nur 1 einziges Mal benötigt wird, ist eine Funktion > vollkommen unnötig. Eine Funktion verwendet man für Dinge, die laufend > wieder gebraucht werden, so wie z.B. rising_edge(), to_integer(), usw... Auch wenn du bei der Synthetisierung recht hast, kann man nicht davon sprechen das jeder VHDL-Code in HW umzusetzen ist. Viele Konstrukte sind nicht umsetzbar, also nur Simulierbar. Und im Simulator ist es wohl tatsächlich ein "Funktionssprung"... Lothar M. schrieb: > >> Spricht etwas gegen die Verwendung einer Funktion und dem vorziehen >> einer Komponente(also einer entity)? > Nein. > Du musst aber an deiner Denkweise noch grundsätzlich was korrigieren. Ich muss mich korrigieren: Vermutlich brauch ich es mindestens 2mal. Mir ist durchaus bewusst das VHDL keine "Funktionssprünge" oder so kennt, trotzdem, denk ich, kann man davon reden. Obwohl es bei der Synthetisierung eher als textuelle Ersetzung zu betrachten ist(Makro)?!
udir schrieb: > Die Funktionsauswertung entspricht einem Indexzugriff in einer > Lookup-Table(constants), damit sollte(wenn ich richtig liege) das > innerhalb eines Takts ausgewertet werden können. Es gibt überhaupt nur 2 Komponenten, die du selber frei im FPGA verwenden kannst: LUTs und Flipflops. Daher wird jede Funktion, die nicht nur irgendwelche Daten übernimmt und speichert, mit einer oder mehreren LUTs aufgebaut werden. Insofern ist hier keinerlei Unterschied zwischen einer "nebenläufigen Logik" oder einer im Porzess beschriebenen Logik oder einer als Funktion oder als Komponente oder als Package oder sonstwie beschreibenen Logik. Jegliche Logik wird in einer LUT abgebildet... Anmerkung: natürlich kann man dafür auch einen RAM-Block nehmen, aber das ist dann auch nur eine "große" LUT. udir schrieb: > Auch wenn du bei der Synthetisierung recht hast, kann man nicht davon > sprechen das jeder VHDL-Code in HW umzusetzen ist. Ich behaupte sogar, dass bestenfalls 5% von VHDL synthetisierbar ist. Und das auch nur, wenn eine bestimmte Befehlsreihenfolge eingehalten wird... > damit sollte(wenn ich richtig liege) das innerhalb eines Takts > ausgewertet werden können. Wenn du keinen Takt in deine funktion hineingeschrieben hast. Die Funktion rising_edge() kann z.B. nicht "in einem Takt" ausgewertet werden, weil sie auf den nächsten Takt wartet... > damit sollte(wenn ich richtig liege) das innerhalb eines Takts > ausgewertet werden können. Klar, das geht immer. Wenn du eine komplexe Logik beschreibst, dann musst du allerdings u.U. die Taktfrequenz reduzieren... :-o Aber das ist ein allgemeines Problem: viel Logik zwischen 2 Flipflops ergibt viel Laufzeit und dadurch eine niedrige maximale Taktfrequenz. > Viele Konstrukte sind nicht umsetzbar, also nur Simulierbar. Und im > Simulator ist es wohl tatsächlich ein "Funktionssprung"... Richtig, man könnte im "Einzelschritt" hineinsimulieren. > Ich muss mich korrigieren: Vermutlich brauch ich es mindestens 2mal. Jetzt wäre mehr Hintergrundinformation hilfreich... BTW: rudi schrieb ... udir schrieb ... Siehe https://www.mikrocontroller.net/user/conditions Zitat daraus:
1 | Ebenso nicht erlaubt ist: |
2 | Beteiligung an einer Diskussion unter verschiedenen Namen |
Bitte in Zukunft beachten!
Lothar M. schrieb: >> damit sollte(wenn ich richtig liege) das innerhalb eines Takts >> ausgewertet werden können. > Wenn du keinen Takt in deine funktion hineingeschrieben hast. Die > Funktion rising_edge() kann z.B. nicht "in einem Takt" ausgewertet > werden, weil sie auf den nächsten Takt wartet... Absolut richtig, vielleicht kann|will|muss ich mich nicht besser ausdrücken, sorry dafür. Der "Funktionsaufruf" erfolgt innerhalb der Statemachine und wird zu 4 parallelen Multiplexern synthetisiert (RTL-Ebene). Lothar M. schrieb: >> Ich muss mich korrigieren: Vermutlich brauch ich es mindestens 2mal. > Jetzt wäre mehr Hintergrundinformation hilfreich... Ich "ruf" die Funktion an 2 verschiedenen Stellen auf -> 2 mal synthetisierung zu Mux Lothar M. schrieb: > BTW: > rudi schrieb ... > udir schrieb ... > Siehe https://www.mikrocontroller.net/user/conditions > Zitat daraus:Ebenso nicht erlaubt ist: > Beteiligung an einer Diskussion unter verschiedenen Namen > Bitte in Zukunft beachten! sorry, aber wie man sieht waren meine finger schneller als mein Auge ;)
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.