Hallo Leute, steige gerade frisch in VHDL ein und bräuchte da mal ein
wenig Hilfe. Wie kann ich mehrere Instanzen in mein topmodul aufrufen?
In diesem Beispiel habe habe ich versucht zwei Instanzen aufzubauen,
aber es wird ein Fehler angezeigt.
Said schrieb:> aber es wird ein Fehler angezeigt.
Welcher denn?
Der, dass du in jeder Instanz jeweils die Hälfte der Ports der
Komponente nicht verwendest?
Probiers mal so:
1
:
2
:
3
Inst_or_gate_2:entitywork.or_gate_1PORTMAP(
4
5
ip2=>store_output_1,
6
ipc=>SW(2),
7
out_2=>store_output_2
8
);
9
10
:
11
:
12
13
14
15
libraryIEEE;
16
useIEEE.STD_LOGIC_1164.ALL;
17
18
19
entityand_gate_1is
20
Port(input_1:inSTD_LOGIC;
21
input_2:inSTD_LOGIC;
22
output_1:outSTD_LOGIC);
23
endand_gate_1;
24
25
architectureBehavioralofand_gate_1is
26
27
begin
28
29
output_1<=input_1andinput_2;
30
31
endBehavioral;
32
33
34
35
36
libraryIEEE;
37
useIEEE.STD_LOGIC_1164.ALL;
38
39
40
entityor_gate_1is
41
Port(ip2:inSTD_LOGIC;
42
ipc:inSTD_LOGIC;
43
out_2:outSTD_LOGIC);
44
endor_gate_1;
45
46
architectureBehavioralofor_gate_1is
47
48
begin
49
50
out_2<=ip2oripc;
51
52
endBehavioral;
> steige gerade frisch in VHDL ein
Dann bitte weiterhin die Bedienungsanleitung beachten:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
....
4
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Wie gesagt: die Fehlermeldung passt zu deinem Code.
Jeder Port einer Instanz muss eine Zuweisung bekommen.
Du könntest sogar noch deinen Code "hinmurksen":
1
--------------------Instanz für and_gate_1-----
2
3
Inst_and_gate_1:entitywork.and_gate_1PORTMAP(
4
5
input_1=>SW(0),
6
input_2=>SW(1),
7
output_1=>store_output_1,
8
ip2=>'0',
9
ipc=>'0',
10
out_2=>OPEN
11
);
12
--------------------Ende Instanz and_gate_1----
13
14
15
16
--------------------Instanz and_gate_2---------
17
18
Inst_and_gate_2:entitywork.and_gate_1PORTMAP(
19
20
input_1=>'0',
21
input_2=>'0',
22
output_1=>OPEN,
23
ip2=>store_output_1,
24
ipc=>SW(2),
25
out_2=>store_output_2
26
);
27
-------------------Ende Instanz and_gate_2-----
Oder so:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
5
entityand_gate_1is
6
Port(input_1:inSTD_LOGIC:='0';
7
input_2:inSTD_LOGIC:='0';
8
ip2:inSTD_LOGIC:='0';
9
ipc:inSTD_LOGIC:='0';
10
out_2:outSTD_LOGIC;
11
output_1:outSTD_LOGIC);
12
endand_gate_1;
13
14
architectureBehavioralofand_gate_1is
15
16
begin
17
18
output_1<=input_1andinput_2;
19
20
out_2<=ip2oripc;
21
22
endBehavioral;
23
24
25
26
libraryIEEE;
27
useIEEE.STD_LOGIC_1164.ALL;
28
29
30
entitytop_levelis
31
Port(SW:inSTD_LOGIC_VECTOR(2downto0);
32
LED1_B:outSTD_LOGIC
33
);
34
endtop_level;
35
36
architectureBehavioraloftop_levelis
37
38
------------Signale für and_gate_1-------------
39
40
signalstore_output_1:std_logic;
41
signalstore_output_2:std_logic;
42
43
begin
44
45
--------------------Instanz für and_gate_1-----
46
47
Inst_and_gate_1:entitywork.and_gate_1PORTMAP(
48
49
input_1=>SW(0),
50
input_2=>SW(1),
51
output_1=>store_output_1,
52
ip2=>OPEN,
53
ipc=>OPEN,
54
out_2=>OPEN
55
);
56
--------------------Ende Instanz and_gate_1----
57
58
59
60
--------------------Instanz and_gate_2---------
61
62
Inst_and_gate_2:entitywork.and_gate_1PORTMAP(
63
64
input_1=>OPEN,
65
input_2=>OPEN,
66
output_1=>OPEN,
67
ip2=>store_output_1,
68
ipc=>SW(2),
69
out_2=>store_output_2
70
);
71
-------------------Ende Instanz and_gate_2-----
72
LED1_B<=store_output_1andnotSW(2);
73
74
endBehavioral;
Aber eigentlich ist so ein "Obfuscated"-Code ein Kündigungsgrund!
Lothar M. schrieb:>>> Inst_and_gate_2: entity work.and_gate_1 PORT MAP(>> input_1 => OPEN,> input_2 => OPEN,> output_1 => OPEN,> ip2 => store_output_1 ,> ipc => SW(2),> out_2 => store_output_2> );> -------------------Ende Instanz and_gate_2-----> LED1_B <= store_output_1 and not SW(2);>> end Behavioral;>
Bitte nicht als Klugscheisserei verstehen, das ist es nicht:
Ist die Zuweisung von inputs als open zulässig? Ich dachte bisher das
geht nur mit Outputs (die man zumindest in Vivado/ISE bei der
Instanziierung auch komplett weglassen kann).
freduardo schrieb:> Ist die Zuweisung von inputs als open zulässig?
Nur, wenn wie in meinem Beispiel gleichzeitig ein Defaultwert in der
Portdefinition angegeben ist.
Dann könnte man vermutlich sogar die Portzuweisung weglassen. Ich habe
mich bisher noch nie auf dieses Glatteis begeben... ;-)
Danke für die Info.
Da wir gerade bei der Frage sind, und ich keine IDE zur Hand habe, um es
zu testen: Darf man dann bei der Instanziierung die Inputs auch komplett
weglassen, wenn in der Entity Defaultwerte vergeben wurden?
freduardo schrieb:> Darf man dann bei der Instanziierung die Inputs auch komplett weglassen,> wenn in der Entity Defaultwerte vergeben wurden?
Geht tatsächlich, allerdings würden mich die vielen Warnungen stören:
1
WARNING:Xst:752 - Unconnected input port 'ip2' of component 'and_gate_1' is tied to default value.
2
WARNING:Xst:752 - Unconnected input port 'ipc' of component 'and_gate_1' is tied to default value.
3
WARNING:Xst:753 - Unconnected output port 'out_2' of component 'and_gate_1'.
4
WARNING:Xst:752 - Unconnected input port 'input_1' of component 'and_gate_1' is tied to default value.
5
WARNING:Xst:752 - Unconnected input port 'input_2' of component 'and_gate_1' is tied to default value.
6
WARNING:Xst:753 - Unconnected output port 'output_1' of component 'and_gate_1'.
7
WARNING:Xst:646 - Signal <store_output_2> is assigned but never used. This unconnected signal will be trimmed during the optimization process.
8
WARNING:Xst:524 - All outputs of the instance <Inst_and_gate_2> of the block <and_gate_1> are unconnected in block <top_level>.
9
This instance will be removed from the design along with all underlying logic
Man sieht hier auch, dass eh' die Hälfte des Designs wegoptimiert wird,
weil store_output_2 nicht verwendet wird...
Es kommt oft vor, dass von einem komplexen Core nur ein Teil der Ports
verwendet wird, der Rest ist auf einen Defaultwert geklemmt oder open.
Die sauberste Lösung ist dann, einen Wrapper drumherum zu schreiben, der
sich um die unbenutzten Ports kümmert und nur die tatsächlich benötigten
Signale durchschleift. Die Instanz den Wrappers ist dann sehr kompakt
und der Code bleibt verständlich. Gute Beispiele sind die Xilinx
Blockrams oder MCMMs. Ohne Wrapper sind die kaum zu handeln, außer man
steht auf wirklich undurchsichtigen HDL-Code.