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.
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
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 ;)