Forum: FPGA, VHDL & Co. Eine entity mehrere components?


von Guenther (Gast)


Lesenswert?

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
entity MyLogic is
2
    Port ( A_i : in STD_LOGIC;
3
           B_i : in STD_LOGIC;
4
           Q_o : out STD_LOGIC);
5
end MyLogic;

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
entity topLogic is
2
    Port ( A : in STD_LOGIC;
3
           B : in STD_LOGIC;
4
           Q : out STD_LOGIC);
5
end topLogic;
6
7
architecture Behavioral of topLogic is
8
signal INT_A : STD_LOGIC;
9
signal INT_B : STD_LOGIC;
10
signal SA1, SA2 : STD_LOGIC;
11
12
component AND1 is
13
    Port ( A_i : in STD_LOGIC;
14
           B_i : in STD_LOGIC;
15
           Q_o : out STD_LOGIC);
16
end component;
17
18
component AND2 is
19
    Port ( A_i : in STD_LOGIC;
20
           B_i : in STD_LOGIC;
21
           Q_o : out STD_LOGIC);
22
end component;
23
24
component OR1 is
25
    Port ( A_i : in STD_LOGIC;
26
           B_i : in STD_LOGIC;
27
           Q_o : out STD_LOGIC);
28
end component;
29
30
begin
31
32
SA1 <= A;
33
SA2 <= B;
34
35
L_AND1: AND1 
36
        port map ( A_i => INT_A,
37
                   B_i => INT_B,
38
                   Q_o => SA1);
39
40
L_AND2: AND2 
41
        port map ( A_i => INT_A,
42
                   B_i => INT_B,
43
                   Q_o => SA2);                   
44
45
L_OR1: OR1 
46
        port map ( A_i => SA1,
47
                   B_i => SA2,
48
                   Q_o => Q);                   
49
end Behavioral;
50
51
configuration CFG1 of topLogic is
52
    for Behavioral
53
        for L_AND1: AND1 use entity WORK.MyLogic(LOGIC_AND);
54
        end for;
55
        
56
        for L_AND2: AND2 use entity WORK.MyLogic(LOGIC_AND);
57
        end for;
58
        
59
        for L_OR1: OR1 use entity WORK.MyLogic(LOGIC_OR);
60
        end for;
61
        
62
    end for;
63
end CFG1;

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

von Duke Scarring (Gast)


Lesenswert?

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:
1
entity topLogic is
2
    Port ( A : in STD_LOGIC;
3
           B : in STD_LOGIC;
4
           Q : out STD_LOGIC);
5
end topLogic;
6
7
architecture Behavioral of topLogic is
8
  signal SA1, SA2 : STD_LOGIC;
9
begin
10
  SA1 <= A and B;
11
  SA2 <= A and B;
12
  Q   <= SA1 OR SA2;
13
end architecture Behavioral;

Duke

von Guenther (Gast)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

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:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity MyLogic is
5
    Port ( A_i : in STD_LOGIC;
6
           B_i : in STD_LOGIC;
7
           Q_o : out STD_LOGIC);
8
end MyLogic;
9
10
architecture LOGIC_AND of MyLogic is
11
begin
12
    Q_o <= A_i and B_i;
13
end architecture LOGIC_AND;
14
15
16
architecture LOGIC_OR of MyLogic is
17
begin
18
    Q_o <= A_i or B_i;
19
end architecture LOGIC_OR;
20
21
22
----------------------------------------
23
-- hier besser eine neue Datei...
24
25
library ieee;
26
use ieee.std_logic_1164.all;
27
28
entity topLogic is
29
    Port ( A : in STD_LOGIC;
30
           B : in STD_LOGIC;
31
           Q : out STD_LOGIC);
32
end topLogic;
33
34
architecture Behavioral of topLogic is
35
signal INT_A : STD_LOGIC;
36
signal INT_B : STD_LOGIC;
37
signal SA1, SA2 : STD_LOGIC;
38
39
component AND1 is
40
    Port ( A_i : in STD_LOGIC;
41
           B_i : in STD_LOGIC;
42
           Q_o : out STD_LOGIC);
43
end component;
44
45
component AND2 is
46
    Port ( A_i : in STD_LOGIC;
47
           B_i : in STD_LOGIC;
48
           Q_o : out STD_LOGIC);
49
end component;
50
51
component OR1 is
52
    Port ( A_i : in STD_LOGIC;
53
           B_i : in STD_LOGIC;
54
           Q_o : out STD_LOGIC);
55
end component;
56
57
begin
58
59
INT_A <= A;
60
INT_B <= B;
61
62
L_AND1: AND1 
63
        port map ( A_i => INT_A,
64
                   B_i => INT_B,
65
                   Q_o => SA1);
66
67
L_AND2: AND2 
68
        port map ( A_i => INT_A,
69
                   B_i => INT_B,
70
                   Q_o => SA2);                   
71
72
L_OR1: OR1 
73
        port map ( A_i => SA1,
74
                   B_i => SA2,
75
                   Q_o => Q);                   
76
end Behavioral;
77
78
configuration CFG1 of topLogic is
79
    for Behavioral
80
        for L_AND1: AND1 use entity WORK.MyLogic(LOGIC_AND);
81
        end for;
82
        
83
        for L_AND2: AND2 use entity WORK.MyLogic(LOGIC_AND);
84
        end for;
85
        
86
        for L_OR1: OR1 use entity WORK.MyLogic(LOGIC_OR);
87
        end for;
88
        
89
    end for;
90
end CFG1;

Das frisst zumindest erstmal der Compiler:
1
$ vcom configuration.vhd
2
Start time: 10:03:05 on May 13,2016
3
vcom configuration.vhd
4
Model Technology ModelSim SE-64 vcom 10.3d Compiler 2014.10 Oct  7 2014
5
-- Loading package STANDARD
6
-- Loading package TEXTIO
7
-- Loading package std_logic_1164
8
-- Compiling entity MyLogic
9
-- Compiling architecture LOGIC_AND of MyLogic
10
-- Compiling architecture LOGIC_OR of MyLogic
11
-- Loading entity MyLogic
12
-- Compiling entity topLogic
13
-- Compiling architecture Behavioral of topLogic
14
-- Compiling configuration CFG1
15
-- Loading entity topLogic
16
-- Loading architecture Behavioral of topLogic
17
-- Loading entity MyLogic
18
End time: 10:03:05 on May 13,2016, Elapsed time: 0:00:00
19
Errors: 0, Warnings: 0

Duke

von Guenther (Gast)


Lesenswert?

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:
1
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date: 13.05.2016 08:37:10
6
-- Design Name: 
7
-- Module Name: topLogic - Behavioral
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool Versions: 
11
-- Description: 
12
-- 
13
-- Dependencies: 
14
-- 
15
-- Revision:
16
-- Revision 0.01 - File Created
17
-- Additional Comments:
18
-- 
19
----------------------------------------------------------------------------------
20
21
22
library IEEE;
23
use IEEE.STD_LOGIC_1164.ALL;
24
use work.ALL;
25
26
-- Uncomment the following library declaration if using
27
-- arithmetic functions with Signed or Unsigned values
28
--use IEEE.NUMERIC_STD.ALL;
29
30
-- Uncomment the following library declaration if instantiating
31
-- any Xilinx leaf cells in this code.
32
--library UNISIM;
33
--use UNISIM.VComponents.all;
34
35
entity topLogic is
36
    Port ( A : in STD_LOGIC;
37
           B : in STD_LOGIC;
38
           Q : out STD_LOGIC);
39
end topLogic;
40
41
architecture Behavioral of topLogic is
42
signal INT_A : STD_LOGIC;
43
signal INT_B : STD_LOGIC;
44
signal SA1, SA2 : STD_LOGIC;
45
46
component MyLogic is
47
    Port ( A_i : in STD_LOGIC;
48
           B_i : in STD_LOGIC;
49
           Q_o : out STD_LOGIC);
50
end component;
51
52
begin
53
54
INT_A <= A;
55
INT_B <= B;
56
57
AND1: MyLogic 
58
        port map ( A_i => INT_A,
59
                   B_i => INT_B,
60
                   Q_o => SA1);
61
62
AND2: MyLogic 
63
        port map ( A_i => INT_A,
64
                   B_i => INT_B,
65
                   Q_o => SA2);                   
66
67
OR1: MyLogic 
68
        port map ( A_i => SA1,
69
                   B_i => SA2,
70
                   Q_o => Q);                   
71
end Behavioral;
72
73
configuration CFG1 of topLogic is
74
    for Behavioral
75
        for AND1, AND2: MyLogic use entity WORK.MyLogic(LOGIC_AND);
76
        end for;
77
        
78
        for OR1: MyLogic use entity WORK.MyLogic(LOGIC_OR);
79
        end for;
80
        
81
    end for;
82
end CFG1;

Für die reale Umsetzung macht man es natürlich so, wie Duke oben es 
beschrieben hat. :)

von Guenther (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.