Forum: FPGA, VHDL & Co. VHDL: Funktion vs. Komponente


von rudi (Gast)


Lesenswert?

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ß

von Achim S. (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von udir (Gast)


Lesenswert?

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)?!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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!

von rudi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.