Hallo,
ich fange derzeit mit VHDL an und versuche mich gerade etwas in
components und configurations einzuarbeiten.
In einer vhd-Datei habe ich mir folgende entity erstellt:
1
entityMyLogicis
2
Port(A_i:inSTD_LOGIC;
3
B_i:inSTD_LOGIC;
4
Q_o:outSTD_LOGIC);
5
endMyLogic;
Hierzu habe ich nun mehrere architectures, die wiederum ein AND-, NAND-
und OR-Gate abbilden.
In meiner toplevel-Datei wollte ich nun mehrere Komponenten erzeugen und
diese miteinander verknüpfen um folgende Funktion abzubilden ((A and !B)
or (!A and B)). Ja, das könnte man auch einfach direkt in eine
architecture schreiben aber ich wollte das Prinzip dahinter mit einem
einfachen Beispiel verstehen. In der toplevel-Datei steht dann
folgendes:
1
entitytopLogicis
2
Port(A:inSTD_LOGIC;
3
B:inSTD_LOGIC;
4
Q:outSTD_LOGIC);
5
endtopLogic;
6
7
architectureBehavioraloftopLogicis
8
signalINT_A:STD_LOGIC;
9
signalINT_B:STD_LOGIC;
10
signalSA1,SA2:STD_LOGIC;
11
12
componentAND1is
13
Port(A_i:inSTD_LOGIC;
14
B_i:inSTD_LOGIC;
15
Q_o:outSTD_LOGIC);
16
endcomponent;
17
18
componentAND2is
19
Port(A_i:inSTD_LOGIC;
20
B_i:inSTD_LOGIC;
21
Q_o:outSTD_LOGIC);
22
endcomponent;
23
24
componentOR1is
25
Port(A_i:inSTD_LOGIC;
26
B_i:inSTD_LOGIC;
27
Q_o:outSTD_LOGIC);
28
endcomponent;
29
30
begin
31
32
SA1<=A;
33
SA2<=B;
34
35
L_AND1:AND1
36
portmap(A_i=>INT_A,
37
B_i=>INT_B,
38
Q_o=>SA1);
39
40
L_AND2:AND2
41
portmap(A_i=>INT_A,
42
B_i=>INT_B,
43
Q_o=>SA2);
44
45
L_OR1:OR1
46
portmap(A_i=>SA1,
47
B_i=>SA2,
48
Q_o=>Q);
49
endBehavioral;
50
51
configurationCFG1oftopLogicis
52
forBehavioral
53
forL_AND1:AND1useentityWORK.MyLogic(LOGIC_AND);
54
endfor;
55
56
forL_AND2:AND2useentityWORK.MyLogic(LOGIC_AND);
57
endfor;
58
59
forL_OR1:OR1useentityWORK.MyLogic(LOGIC_OR);
60
endfor;
61
62
endfor;
63
endCFG1;
Als Fehlermeldung bekomme ich nun allerdings "no Port A_i on instance"
bei den port maps (die selbe Fehlermeldung auch für die restlichen
Ports). Vermutlich weil er nicht weiß, auf welche entity ich mich
beziehen möchte. Sonst hatte ich immer nur eine component und habe diese
wie die entity bezeichnet.
Könnt ihr mir bitte einen Hinweis geben, was ich falsch mache?
Viele Grüße
Guenther schrieb:> entity MyLogic is> Port ( A_i : in STD_LOGIC;> B_i : in STD_LOGIC;> Q_o : out STD_LOGIC);> end MyLogic;
Ich vermute mal Deine entity muß mehrfach vorhanden sein und
entsprechend AND1, AND2 und OR1 heißen.
> SA1 <= A;> SA2 <= B;
Da sollte vermutlich sowas stehen:
1
INT_A<=A;
2
INT_B<=B;
Die Zuweisung kann man auch weglassen und direkt die Eingänge verwenden.
Sinnvoll ist das bei Ausgängen, die auch gelesen werden sollen.
Noch ein Tipp: Wenn Du das mit der Instanzierung verstanden hast,
verwendest Du bitte die eingebauten Funktionen für sowas:
Duke Scarring schrieb:>> SA1 <= A;>> SA2 <= B;> Da sollte vermutlich sowas stehen:INT_A <= A;> INT_B <= B;
Stimmt, dass war ein Fehler. Wie du es korrigiert hast stimmt es nun.
Wenn ich kein Signal verwende, bekomme ich allerdings Warnings, dass ein
Eingangsport mehreren Eingängen zugewiesen wurde.
Duke Scarring schrieb:>Noch ein Tipp: Wenn Du das mit der Instanzierung verstanden hast,>verwendest Du bitte die eingebauten Funktionen für sowas:
Das meinte ich ja, dass man diese Funktion auch direkt implementieren
kann. :) Wie gesagt ist lediglich für das Verständnis derzeit.
Duke Scarring schrieb:>Ich vermute mal Deine entity muß mehrfach vorhanden sein und>entsprechend AND1, AND2 und OR1 heißen.
Dann verstehe ich aber nicht ganz, wozu eine entity mehrere
architectures haben kann? Ich dachte, das wäre für genau so einen Fall?
Das ganze funktioniert, wenn ich eine entity-Instanziierung nutze; hier
kann ich auch bei jeder Markierung die zu nutzende archtitecture
angeben. Nur habe ich auf diesem Weg keinen Zugriff auf etwaige
generics.
Funktioniert das dann so einfach nicht?
Viele Grüße
Guenther schrieb:> Dann verstehe ich aber nicht ganz, wozu eine entity mehrere> architectures haben kann? Ich dachte, das wäre für genau so einen Fall?
Nein. Das ist ein akademisches VHDL-Feature.
In der FPGA-Praxis haben eigentlich alle Entites nur eine Architecture.
Das liegt m.E. auch daran, das die Configuration von der
Tool-Herstellern nur eingeschrängt unterstützt werden (zumindest bei
Xilinx-ISE, wie es bei anderen aussieht, weiß ich nicht).
Aber ich glaube ich habe Dich auch etwas missverstanden.
Du wolltest vermutlich sowas machen:
Duke Scarring schrieb:> In der FPGA-Praxis haben eigentlich alle Entites nur eine Architecture.
Ah ok, das merke ich mir. Dann lieber ein neues file mit eigenen
entities für die jeweiligen archtitectures.
hier habe ich übrigens für mich eine sehr brauchbare Erklärung gefunden,
für diejenigen, die hier mal drüber stolpern:
https://www.ida.liu.se/~TDTS01/lectures/13/lect5.frm.pdf
Das ganze müsste dann folgendermaßen aussehen:
Synthetisierbar scheint es allerdings nicht zu sein oder Vivado
unterstützt Configurations auch nicht vollständig. Aber in der
Simulation funktioniert es und das Verständnis ist da.