Einbinden mit component geht nicht.

Gast #965085
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe folgenden Volladdierer
1
library ieee;
2
use ieee.std_logic_1164.all;
3

4
entity Volladdierer is
5
  port (a, b, cin : in std_logic; sum, cout : out std_logic);
6
end entity Volladdierer;
7

8
architecture struktur of Volladdierer is
9
  begin
10
    sum <= a xor b xor cin;
11
    cout <= (a and b) or (a and cin) or (b and cin);
12
end architecture struktur;

den ich mit dem Schlüsselwort "component" in diesen RCAddierer einbinden 
möchte:
1
library ieee;
2
use ieee.std_logic_1164.all, ieee.std_logic_arith.all;
3

4
entity RCAddierer is
5
  generic (n  : natural := 4);  -- Wortbreite des Addierers
6
  port (a, b : in std_logic_vector (n-1 downto 0);
7
      cin  : in std_logic;
8
      sum  : out std_logic_vector (n-1 downto 0);
9
      cout : out std_logic);
10
end entity RCAddierer;
11

12
architecture struktur of RCAddierer is
13
  signal c : std_logic_vector (0 to n); -- Hilfssignal
14
  
15
  component Volladdierer is
16
    port (a, b, c : in std_logic; sum, cout : out std_logic);
17
  end component Volladdierer;
18
  
19
  begin
20
    c(0) <= cin;     -- Eingang Übertrag
21
    g1 :   for i in 0 to n-1 generate
22
        fm : Volladdierer port map (a(i), b(i), c(i), sum(i), c(i+1));
23
    end generate g1;  -- Ausgang Übertrag
24
    cout <= c(n);
25
    
26
end architecture struktur;

Den Volladdierer habe ich im Menü "Project" -> "Add/Remove Files" in den 
Ripple Carry Addierer eingebunden (siehe Anhang). Das scheint noch nicht 
zu funktionieren. Ich erhalte folgende Fehlermeldung:

'Info: Elaborating entity "Volladdierer" for hierarchy 
"Volladdierer:\g1:0:fm"
Error: Port "c" does not exist in macrofunction "\g1:3:fm"'

Woran kann das liegen? Ich komme da nicht weiter.
Angehängte Dateien:
Gast #965090
Lesenswert?
• ▲
▼
OK, jetzt geht auch die Bildung des Komplents einer Binärzahl:
1
library ieee;
2
use ieee.std_logic_1164.all, ieee.std_logic_arith.all;
3

4
entity Komplement is
5
  generic (n: natural := 4); -- Wortbreite des Komplments
6
  
7
  port (x : in std_logic_vector (n-1 downto 0);
8
        z : out std_logic_vector (n-1 downto 0));
9

10
end entity Komplement;
11

12
architecture struktur of Komplement is
13
constant zero : std_logic_vector (n-1 downto 0) := (others => '0');
14

15
  component RCAddierer is
16
    generic (n: natural := 8);
17
    port (a, b: in std_logic_vector (n-1 downto 0);   -- Summanden,
18
          cin : in std_logic;                    -- Übertragbit "carry",
19
          sum : out std_logic_vector (n-1 downto 0);    -- Summe,
20
          cout:  out std_logic);                      -- Übertragbit "carry" des Addierers
21
  end component RCAddierer;
22
  
23
  begin
24
    P1 : RCAddierer
25
    generic map(n)
26
    port map (not x, zero, '1', z(n-1 downto 0), open);
27
      
28
end architecture struktur;

Habt ihr noch Verbesserungen vorzuschlagen. Bin Anfänger.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #965162
Lesenswert?
• ▲
▼
>Habt ihr noch Verbesserungen vorzuschlagen.
Geht es dir nur um das Zweierkomplement?

Dann gibt es kürzere und übersichtlichere Wege: Antatt die Struktur zu 
beschreiben ist es i.A. besser lesbar, das Verhalten zu beschreiben:
1
library IEEE;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.std_logic_unsigned.all;
4
USE ieee.numeric_std.ALL;
5

6
entity Komplement is
7
    generic (n  : natural := 4);
8
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
9
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
10
end Komplement;
11

12
architecture Verhalten of Komplement is
13
begin
14
   z <= (not x) + 1;
15
end Verhalten;

Oder alternativ mit der aktuellen numeric_std-Lib:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4

5
entity Komplement is
6
    generic (n  : natural := 4);
7
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
8
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
9
end Komplement;
10

11
architecture Behavioral of Komplement is
12
begin
13
   z <= std_logic_vector((not unsigned(x))+1);
14
end Behavioral;

Oder so:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4

5
entity Komplement is
6
    generic (n  : natural := 4);
7
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
8
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
9
end Komplement;
10

11
architecture Behavioral of Komplement is
12
begin
13
   z <= std_logic_vector(0 - signed(x));
14
end Behavioral;

Es gibt also etliche elegantere Methoden, als Berechnungen über eine 
Struktur zu beschreiben. Aber zum Lernen einer Strukturbeschreibung ist 
dieser Umweg (handgestrickte Addierer usw.) ok.
Gast #965310
Lesenswert?
• ▲
▼
Klar geht das einfacher. Das sollte wir aber so lösen. Schaltung des 
Volladdiers umsetzen, daraus einen Ripple Carry Addierer machen und den 
zur Berechnung des Komplements verwenden.

Das ganze Verfahren (mit dem Schlüsselwörtern "component" und "port map" 
errinert mich irgendwie an die Vererbung bei der objektorientierten 
Programmierung.
Gast #969633
Lesenswert?
• ▲
▼
Habe das Programm noch ein weinig erweitert (sihe Anhang). Das Problem 
ist, dass ich mich noch verhauen habe:

Error (10344): VHDL expression error at ALU.vhd(57): expression has 9 
elements, but must have 8 elements

Die Fehlermeldung kommt aus diesem
1
P_a_negativ :   Komplement
2
          generic map (n)
3
          port map (a, a_negativ);

Fragment.

Habe ich da was falsch deklariert?
Gast #970546
Lesenswert?
• ▲
▼
OK, Fehler gefunden: port z in Komponente Komplement muss natürlich von 
n nach 0 gehen.

Die ganzen Dateien (bis auf den Universaladdierer) werden korrekt 
gefunden und eingebunden. Den habe ich mit dem "Mega Wizard" erstellt. 
Da scheint Quartus noch ein bischen rumzuzicken. Könnt ihr mir sagen, 
woran das liegt?
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [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 einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.