Hallo zusammen, Ich bin noch dabei VHDL zu lernen. Momentan steht das Thema Function an. Mein Prof. hat auch ein Beispiel vorgegeben, jedoch benutzt er dazu ein Package. Meine Frage ist nun, ist es möglich eine Function auch innerhalb einer Architektur oder entity oder ausserhalb zu deklarieren und anshließend in einer oder mehreren architekturen zu verwenden?
Naja wenn du sie mehrfach verwenden willst solltest du schon ein Package nehmen. Das kannst du dann dort importieren wo du es brauchst. Wenn du die function nur in einer Entität brauchst kannst du sie Lokal in der Datei in einer architecture anlegen, aber halt nicht weiter verwenden.
Didididum schrieb: > Meine Frage ist nun, ist es möglich eine Function auch innerhalb einer > Architektur oder entity oder ausserhalb zu deklarieren und anshließend > in einer oder mehreren architekturen zu verwenden? Wenn du die Funktion in einer Entity/Architecture deklarierst, dann ist sie nur in dieser Entity/Architecture bekannt. Sieh dir einfach mal an, wie z.B. die Funktion rising_edge() in der ieee.std_logic_1164 deklariert ist. Diese Funktion kann dann ja auch in allen Entities verwendet werden, in die dieses Package eingebunden ist: https://www.csee.umbc.edu/portal/help/VHDL/packages/std_logic_1164.vhd
:
Bearbeitet durch Moderator
Dein Verständnisproblem rührt vermutlich daher, dass Du (noch) die "Softwarebrille" aufgesetzt hast. Bei Software befindet sich eine Funktion irgendwo an einer Stelle im Speicher und kann von beliebigen anderen Funktionen bzw. Ausführungspfaden aufgerufen werden; wenn es fünf Aufrufer gibt. Bei einer Hardwarebeschreibung muss die Funktion jedoch bei jeder Verwendung separat instanziiert werden. Somit entspricht das ganze in etwa einer Inline-Funktion.
Es ist wichtig das Conzept von "Scope" in VHDL zu verstehen. Wo du deine Function schreibst bestimmt wer es verwenden darf. 1) In einem Package, wie du wohl schon gemacht hast, kann es von jeder "Secondary Design Unit" d.h. primär Architecture oder Package Body verwendet werden, die das Package referenziert. 2) Wenn du die Function im "Declaration Part" einer Architecture beschreibst, kann die Function von jedem process in dieser Architecture verwendet werden.
1 | Architecture Rtl of hw_unit is |
2 | function f_init_obj return t_obj is |
3 | variable f_obj : t_obj; |
4 | begin
|
5 | . . . |
6 | return f_obj; |
7 | end function; |
8 | |
9 | signal s_obj : t_obj; |
10 | |
11 | Begin
|
12 | . . . |
3) Wenn du die Function im "Declaration Part" eines Process definierst, kann die Funktion nur von diesem Process verwendet werden.
1 | R_SYS: |
2 | process (i_clk_sys, i_rst_n) |
3 | function f_init_obj return t_obj is |
4 | variable f_obj : t_obj; |
5 | begin
|
6 | . . . |
7 | return f_obj; |
8 | end function; |
9 | |
10 | begin
|
11 | if (i_rst_n = '0') then |
12 | s_obj <= f_init_obj; |
13 | elsif (rising_edge(i_clk_sys)) then |
14 | if (i_clr = '1') then |
15 | s_obj <= f_init_obj; |
16 | else
|
17 | ...
|
18 | end if; |
19 | end if; |
20 | end process; |
Und auch noch, VHDL functions werden eigentlich nur bei der Simulation aufgerufen. Für die Synthese dagegen sind sie besser als Macros zu verstehen. Das Synthese Tool muss die Auswirkung des Aufrufs in tatsächlichen Logikgattern berechnen und entsprechend fest verdrahtet synthetisieren.
:
Bearbeitet durch Moderator
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.