Forum: FPGA, VHDL & Co. Mehrfache Instanziierungen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Said (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
5
entity top_level is
6
    Port ( SW     : in   STD_LOGIC_VECTOR(2 downto 0);
7
           LED1_B : out  STD_LOGIC
8
    );
9
end top_level;
10
11
architecture Behavioral of top_level is
12
13
------------Signale für and_gate_1-------------
14
15
signal  store_output_1    :   std_logic;
16
signal  store_output_2    :   std_logic;
17
18
begin    
19
20
--------------------Instanz für and_gate_1-----
21
22
   Inst_and_gate_1: entity work.and_gate_1 PORT MAP(
23
   
24
        input_1     =>  SW(0),
25
        input_2     =>  SW(1),
26
        output_1    =>  store_output_1   
27
   );
28
--------------------Ende Instanz and_gate_1----
29
30
31
32
--------------------Instanz and_gate_2---------
33
34
    Inst_and_gate_2: entity work.and_gate_1 PORT MAP(
35
    
36
        ip2     =>  store_output_1 ,
37
        ipc     =>  SW(2),
38
        out_2   =>  store_output_2
39
    );
40
-------------------Ende Instanz and_gate_2-----
41
42
LED1_B   <=  store_output_1 and not SW(2);
43
44
end Behavioral;
Und das ist das and_gate_1:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
5
entity and_gate_1 is
6
    Port ( input_1  : in     STD_LOGIC;
7
           input_2  : in     STD_LOGIC;
8
           ip2      : in     STD_LOGIC;
9
           ipc      : in     STD_LOGIC;
10
           out_2    : out    STD_LOGIC;
11
           output_1 : out STD_LOGIC);
12
end and_gate_1;
13
14
architecture Behavioral of and_gate_1 is
15
16
begin
17
   
18
    output_1    <=  input_1 and input_2;
19
    
20
    out_2       <=  ip2 or ipc;
21
22
end Behavioral;

: Bearbeitet durch Moderator
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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: entity work.or_gate_1 PORT MAP(
4
    
5
        ip2     =>  store_output_1 ,
6
        ipc     =>  SW(2),
7
        out_2   =>  store_output_2
8
    );
9
10
:
11
:
12
13
14
15
library IEEE;
16
use IEEE.STD_LOGIC_1164.ALL;
17
18
19
entity and_gate_1 is
20
    Port ( input_1  : in     STD_LOGIC;
21
           input_2  : in     STD_LOGIC;
22
           output_1 : out STD_LOGIC);
23
end and_gate_1;
24
25
architecture Behavioral of and_gate_1 is
26
27
begin
28
   
29
    output_1    <=  input_1 and input_2;
30
    
31
end Behavioral;
32
33
34
35
36
library IEEE;
37
use IEEE.STD_LOGIC_1164.ALL;
38
39
40
entity or_gate_1 is
41
    Port ( ip2      : in     STD_LOGIC;
42
           ipc      : in     STD_LOGIC;
43
           out_2    : out    STD_LOGIC);
44
end or_gate_1;
45
46
architecture Behavioral of or_gate_1 is
47
48
begin
49
   
50
    out_2       <=  ip2 or ipc;
51
52
end Behavioral;



> 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
5
6
Formatierung (mehr Informationen...)
7
    ....
8
    [vhdl]VHDL-Code[/vhdl]
Die steht über jeder Eingabebox hier.

: Bearbeitet durch Moderator
von Said (Gast)


Bewertung
0 lesenswert
nicht lesenswert
In  Inst_and_gate_1 sagt er ip2 has no actual or default value.

In  Inst_and_gate_2 sagt er input_1 has no actual or default value.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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: entity work.and_gate_1 PORT MAP(
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: entity work.and_gate_1 PORT MAP(
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
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
5
entity and_gate_1 is
6
    Port ( input_1  : in     STD_LOGIC := '0';
7
           input_2  : in     STD_LOGIC := '0';
8
           ip2      : in     STD_LOGIC := '0';
9
           ipc      : in     STD_LOGIC := '0';
10
           out_2    : out    STD_LOGIC;
11
           output_1 : out STD_LOGIC);
12
end and_gate_1;
13
14
architecture Behavioral of and_gate_1 is
15
16
begin
17
   
18
    output_1    <=  input_1 and input_2;
19
    
20
    out_2       <=  ip2 or ipc;
21
22
end Behavioral;
23
24
25
26
library IEEE;
27
use IEEE.STD_LOGIC_1164.ALL;
28
29
30
entity top_level is
31
    Port ( SW     : in   STD_LOGIC_VECTOR(2 downto 0);
32
           LED1_B : out  STD_LOGIC
33
    );
34
end top_level;
35
36
architecture Behavioral of top_level is
37
38
------------Signale für and_gate_1-------------
39
40
signal  store_output_1    :   std_logic;
41
signal  store_output_2    :   std_logic;
42
43
begin    
44
45
--------------------Instanz für and_gate_1-----
46
47
   Inst_and_gate_1: entity work.and_gate_1 PORT MAP(
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: entity work.and_gate_1 PORT MAP(
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_1 and not SW(2);
73
74
end Behavioral;

Aber eigentlich ist so ein "Obfuscated"-Code ein Kündigungsgrund!

: Bearbeitet durch Moderator
von Said (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Danke! Hat funktioniert!

von freduardo (Gast)


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

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
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...  ;-)

: Bearbeitet durch Moderator
von freduardo (Gast)


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

von freduardo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sorry, für den Doppelpost.

Meine Frage hat sich durch Lothars Edit auch schon beantwortet.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Vancouver (Gast)


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

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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