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.