Forum: FPGA, VHDL & Co. Function VHDL


von Didididum (Gast)


Lesenswert?

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?

von Donni D. (Gast)


Lesenswert?

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.

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


Lesenswert?

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
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von cfgardiner (Gast)


Lesenswert?

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
von Markus F. (mfro)


Lesenswert?

cfgardiner schrieb:
> 3)  Wenn du die Function

... in einem Block ...

den hast Du noch vergessen ;)

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.