Komponenten-Instanzierung vs. Entity-Instanzierung

Gast #3653494
Lesenswert?

Es gibt ja in VHDL zwei verschiedene Arten, um Instanzen zu erzeugen.

Erst einmal die klassische Komponenten-Instanzierung:
1
component foo is
2
 ...
3
end component;
4

5
...
6

7
foo_inst: foo
8
 ...

Und dann die Entity-Instanzierung:
1
foo_inst: entity work.foo
2
 ...

Die Komponenten-Instanzierung erschien mir von Anfang an aufgeblasen und 
verletzt das Prinzip des DRY (don't repeat yourself); warum ist sie 
weitläufig der Standard, auch wenn in den meisten Fällen absolut 
unnötig? Gibt es bei der Entity-Instanzierung irgendwelche Nachteile, 
die ich übersehe? Tool-Support sollte doch mittlerweile kein Problem 
sein, oder?
Gast #3653515
Lesenswert?

Eine interessante Frage, die ich leider nicht unmittelbar beantworten 
kann. Leider kann ich auch nicht sofort ausprobieren ob ISE oder Quartus 
das akzeptiert. Die Syntax jedenfalls lässt das zu. Und beides scheint 
äquivalent zu sein.
Gast #3653519
Lesenswert?

>s/Instanzierung/Instanziierung/ erst einmal, das ist ja peinlich. :)
Meine Güte. :-) Schlimmer wäre es wenn Du garkeine 'i's schreiben 
würdest.

Ein wenig enttäuscht war ich schon, das ich das im Reichardt/Schwarz 
nicht gefunden habe.
#3653566
Lesenswert?

Xilinx hat manchmal Probleme, wenn man die Entity-Instanziierung bei IP 
Cores anwendet. Das Schema dahinter hab ich aber noch nicht entdecken 
können. Bei Vivado ist es ganz schlimm. Nimmt man die Entity-Variante 
bei IP Cores darf man dann keine Konstanten "anschließen". Schon 
skurril. Neulich spuckte mir Vivado 14.1 aus, dass die Library work not 
longer supported ist. Man müsse das dann manuell einstellen, wenn man es 
unbedingt braucht.
Gast #3653602
Lesenswert?

greg schrieb:
> Gibt es bei der Entity-Instanzierung irgendwelche Nachteile,
> die ich übersehe?
Ich deklariere mir meine Module einzeln:
1
library stuff;
2
use stuff.components.modul1;
3
use stuff.components.modul2;
4
use stuff.components.modul3;
Damit sieht man an einer Stelle, welche Module/Komponenten eingesetzt 
werden. Das sieht man bei der Entity-Instanziierung nicht.

Ich verwende sie gerne, wenn ich das Modul nur einmal benötige und es in 
der selben Bibliothek (=work) liegt.

Duke
#3653703
Lesenswert?

greg schrieb:
> Die Komponenten-Instanzierung erschien mir von Anfang an aufgeblasen und
> verletzt das Prinzip des DRY (don't repeat yourself); warum ist sie
> weitläufig der Standard, auch wenn in den meisten Fällen absolut
> unnötig? Gibt es bei der Entity-Instanzierung irgendwelche Nachteile,
> die ich übersehe? Tool-Support sollte doch mittlerweile kein Problem
> sein, oder?

Das Ganze kommt aus der Simulation.
Die separate Deklaration der Komponente erfüllt die Trennung 
Schnittstelle/Implementierung.

Wenn man sich einen Komponente als IC vorstellt, dann definiert die 
Komponenten Deklaration sozusagen den Sockel.
Die Instanzierung definiert die Verdrahtung, also welche Signale zum 
Sockel hinführen.
Das Einstecken des ICs in den Sockel erfolgt erst beim Starten der 
Simulation, diese Phase nennt man elaboration.

Um ein VHDL File mit einer Komponente zu compilieren, braucht die 
Komponente selbst noch nicht geschrieben/compiliert sein.
In diesem Fall benötigt man die Komponenten Deklaration, damit der 
Compiler die Schnittstelle kennt. Das ist ähnlich wie eine Deklaration 
in C/C++, dort kann man eine Funktion auch aufrufen wenn sie deklariert 
ist.
Erst beim Linken kommt man drauf, ob sie wirklich existiert.

Bei der direkten Instanziierung work.foo muss die Komponente foo vorher 
schon existieren und kompiliert sein.
Der Compiler schaut in die library work und sucht sich dort die 
Schnittstellenbeschreibung.

In ISE oder ISIM sieht man die Unterschiede nicht, da wird alles in 
einem Rutsch compiliert, höchstens wenn man die Reihenfolge der VHDL 
Files nicht richtig angibt, aber ISE ordnet diese meine Wissens 
automatisch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren