mikrocontroller.net

Forum: FPGA, VHDL & Co. Function VHDL


Autor: Didididum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Donni D. (donnidonis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cfgardiner (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.
Architecture Rtl of hw_unit  is
   function f_init_obj return t_obj is
      variable f_obj  : t_obj;
   begin       
         . . . 
      return  f_obj;
   end function;

   signal s_obj     : t_obj;

Begin
   . . .

3)  Wenn du die Function im "Declaration Part" eines Process definierst, 
kann die Funktion nur von diesem Process verwendet werden.
   R_SYS:   
   process (i_clk_sys, i_rst_n)
      function f_init_obj return t_obj is
         variable f_obj  : t_obj;
      begin       
            . . . 
         return  f_obj;
      end function;
      
   begin
      if (i_rst_n = '0') then
         s_obj   <= f_init_obj;
      elsif (rising_edge(i_clk_sys)) then
         if (i_clr = '1') then
            s_obj   <= f_init_obj;
         else
          ...
         end if;
      end if;
    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
Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cfgardiner schrieb:
> 3)  Wenn du die Function

... in einem Block ...

den hast Du noch vergessen ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.