Forum: FPGA, VHDL & Co. VHDL-Frage zu Components


von Christian S. (christian_s75)


Lesenswert?

Hallo zusammen,

Ich habe eine Frage zur Benutzung von Komponenten in Packages. Ich habe 
folgenden Code für einen Volladdierer geschrieben:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
4
ENTITY vadd IS
5
  PORT  (
6
        ina   : IN  STD_LOGIC;
7
        inb   : IN  STD_LOGIC;
8
        cin   : IN  STD_LOGIC;
9
        sum   : OUT STD_LOGIC;
10
        cout  : OUT STD_LOGIC
11
        );
12
BEGIN
13
END;
14
15
ARCHITECTURE vadd_arch OF vadd IS
16
  
17
BEGIN
18
  -- Addition = XOR-Verknuepfung der Eingangsbits und des Carry der letzten Operation
19
  sum   <= ina XOR inb XOR cin;
20
  -- Berechnung des neuen Carry
21
  cout  <= (ina AND inb) OR ((ina XOR inb) AND cin);
22
END;

Nun würde ich daraus gerne ein Komponente innerhalb eines Packages 
erstellen, allerdings ist mir die Vorgehensweise noch nicht ganz klar. 
Im Kopf des Packages habe ich die Komponente erstellt, also Ein- und 
ausgänge angegeben. Wie verknüpfe ich nun diese Komponente mit der oben 
gezigten Entity/Architecture? Egal wo ich dies im Package versuche sagt 
der Compiler, dass die Confuguration an dieser Stelle nicht zulässig 
sei. Wenn ich die Configuration aber nur in meiner Architecture angeben 
kann, in welcher ich die Komponente nutzen will, welchen Sinn hat dann 
das Anlegen der Komponente in einem Package? Habe in der Literatur (u.A. 
P. Ashenden) nichts gefunden, stehe irgendwie auf dem Schlauch.

vielen Dank schonmal

beste Grüße

Christian

von Christian S. (christian_s75)


Lesenswert?

Hallo nochmal,

eine Nachfrage noch: Ist es hier überhaupt sinnvoll eine Komponente zu 
erstellen? Ich möchte später ger Generate-Anweisung einen 8Bit-Addierer 
erzeugen. macht es da einen Unterschied, ob ich die Entitys direkt 
instanziiere oder über eine Komponente? Ehrlich gesagt habe ich das 
KOnzept der Components noch nicht ganz begriffen, wäre echt nett, wenn 
mir da jemand weiter helfen könnte.

beste Grüße

Christian

von Duke Scarring (Gast)


Lesenswert?

Christian S. schrieb:
> Ist es hier überhaupt sinnvoll eine Komponente zu
> erstellen?
Kommt drauf an. Wenn Du Deine entity an verschienen Stellen verwenden 
willst, ohne jedesmal die component-Deklaration hinzuschreiben lohnt 
sich das. Ich habe mir angewöhnt alle Komponenten einer Bibliothek in 
ein component_package zu stecken.
Wenn ich die Komponente verwenden will schreibe, wird die nur kurz 
deklariert:
1
library mylib;
2
use mylib.component_package.mycomponent;
3
...
4
...
5
  mycomponent_instance: mycomponent
6
      port map (
7
...
Da kann ich auch schnell sehen, aus welcher Bibliothek die Komponente 
stammt.

> Ich möchte später ger Generate-Anweisung einen 8Bit-Addierer
> erzeugen. macht es da einen Unterschied, ob ich die Entitys direkt
> instanziiere oder über eine Komponente?
Nein, macht keinen Unterschied.

Ich würde einen Addierer so beschreiben:
1
library ieee;
2
use ieee.numeric_std.all;
3
...
4
  signal a:   unsigned(7 downto 0);
5
  signal b:   unsigned(7 downto 0);
6
  signal sum: unsigned(8 downto 0);
7
  ...
8
  ...
9
  sum <= a + b;

Duke

von Christian S. (christian_s75)


Lesenswert?

Hallo Duke,

danke für die Antwort. Ich habe es jetzt zunächst mal per 
Direktinstanziierung gelöst.
Die Möglichkeit, eine Component in einem Package anzulegen finde ich 
trotzdem (wnn auch hier nicht notwendig) interessant. Mein Problem dabei 
ist, dass ich zwar im Package eine Komponente angelegt habe, das binding 
zur eigentlichen Entity (in einer weiteren Datei) bekomme ich aber nicht 
hin. Dachte, das würde dann über eine Konfiguration gemacht, allerdings 
bekomme ich dann eine Fehlermeldung. Kannst du mir das kurz erläutern?

Zum Addierer: der soll explizit als einzelne 1Bit-Addierer erstellt 
werden, geht da mehr um den Lerneffekt als um Sinnhaftigkeit.

schöne Grüße

Christian

von Duke Scarring (Gast)


Lesenswert?

Christian S. schrieb:
> Mein Problem dabei
> ist, dass ich zwar im Package eine Komponente angelegt habe, das binding
> zur eigentlichen Entity (in einer weiteren Datei) bekomme ich aber nicht
> hin.
Da muß eigentlich nichts explizit verbunden werden. Dadurch das man das 
Package und die Entity in die selbe Bibliothek compiliert, finden die 
Tools das automatisch.

Bei Modelsim sieht das ungefähr so aus:
1
# Bibliothek anlegen
2
vlib mylib
3
4
# compilieren
5
vcom -work mylib mypackage.vhd
6
vcom -work mylib myentity.vhd

> Dachte, das würde dann über eine Konfiguration gemacht, allerdings
> bekomme ich dann eine Fehlermeldung. Kannst du mir das kurz erläutern?
Konfigurationen werden von Xilinx sehr stiefmütterlich unterstützt. 
Daher verwende ich die nie.
Was bekommst Du denn für Fehlermeldungen?

Duke

von Christian S. (christian_s75)


Lesenswert?

Hallo,

Ich habe nun folgenden VHDL-Code:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
LIBRARY HWM;
4
USE HWM.pac_addierer.ALL;
5
6
ENTITY addierer IS
7
  PORT  (
8
        ina     :  IN  STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
9
        inb     :  IN  STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
10
        sum     :  OUT STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
11
        carry   :  OUT STD_LOGIC
12
        );
13
END;
14
15
-- Aufbau des 8-Bit-Addierers aus einzelnen 1-Bit-Volladdierern
16
ARCHITECTURE add1_2_arch OF addierer IS
17
  SIGNAL  sum_tmp    : STD_LOGIC_VECTOR (7 DOWNTO 0);
18
  SIGNAL  carry_tmp  : STD_LOGIC_VECTOR (7 DOWNTO 0);
19
  
20
   COMPONENT add IS
21
    PORT  (
22
          ina   : IN  STD_LOGIC;
23
          inb   : IN  STD_LOGIC;
24
          cin   : IN  STD_LOGIC;
25
          sum   : OUT STD_LOGIC;
26
          cout  : OUT STD_LOGIC 
27
          );
28
    END COMPONENT add; 
29
  
30
  --FOR bitaddierer : add USE ENTITY work.vadd;  --(xxx)
31
    
32
BEGIN
33
34
35
  byteaddierer:
36
  FOR i IN 0 TO 7 GENERATE
37
    BEGIN
38
      bitaddierer : add
39
        PORT MAP (ina(i), inb(i), '0', sum_tmp(i), carry_tmp(i));
40
    END GENERATE byteaddierer;
41
  sum <= sum_tmp;
42
43
END;

Ich bekomme folgende Fehlermeldungen:

Wenn ich die mit (xxx) markierte Zeile auskommentiert habe, kompiliert 
das Projekt ohne Fehler. Simuliere ich das Ganze dann aber, so erhalte 
ich im Modelsim folgende Meldung:
1
#    Time: 0 ns  Iteration: 0  Region: /tb_addierer/m1/byteaddierer(3) File: O:/DATEN/HTW/Hardwaremodellierung/Uebungsblatt/1_addierer/addierer.vhd
2
# ** Warning: (vsim-3473) Component instance "bitaddierer : add" is not bound.

Wenn ich nun die mit (xxx) markierte Zeile nicht auskommentiere, dann 
bringt mir bereits der Compiler folgende Meldung:
1
** Error: O:/DATEN/HTW/Hardwaremodellierung/Uebungsblatt/1_addierer/addierer.vhd(89): No statement with label "bitaddierer" was found.
2
** Error: O:/DATEN/HTW/Hardwaremodellierung/Uebungsblatt/1_addierer/addierer.vhd(102): VHDL Compiler exiting

Ist wahrscheinlich irgendein blöder Fehler meinerseits, nur welcher :-??
Die zur Component gehörende Entity wurde korrekt in work compiliert.

danke schonmal&beste Grüße

Chris

Edit: Die Port Map der Component ergibt noch nicht wirklich Sinn, cin 
ist der Eingang für den Carry, cout der entsprechende Ausgang. Damit es 
funktional richtig ist, müsste der cin der ersten Komponente ja auf '0' 
gesetzt werden, der cout der letzten Komponente müsste an den Ausgang 
carry der Entity. Hat wohl nichts mit dem geschilderten Problem zu tun, 
habs nur geschrieben, um Unklahrheiten zu vermeiden.

von Christian S. (christian_s75)


Lesenswert?

Hallo nochmal,

sorry, hab noch was vergessen und kann jetzt nicht mehr editieren.

Duke Scarring schrieb:
> Da muß eigentlich nichts explizit verbunden werden. Dadurch das man das
> Package und die Entity in die selbe Bibliothek compiliert, finden die
> Tools das automatisch.

@Duke: Ich habe versucht, Entity und Package in die selbe Bib zu 
compilieren, erhalte aber die gleichen Fehlermeldungen. Wollte das nur 
noch ergänzen, danke für deine Antwort.

Gruß

Christian

von Duke Scarring (Gast)


Lesenswert?

Christian S. schrieb:
> Ich habe versucht, Entity und Package in die selbe Bib zu
> compilieren,
Dann zeig doch mal bitte den Code Deiner Bibliothek (USE 
HWM.pac_addierer.ALL;) und wie Du sie compiliert hast.

Duke

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.