Forum: FPGA, VHDL & Co. Einbinden mit component geht nicht.


von BerndS (Gast)


Angehängte Dateien:

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.

von BerndS (Gast)


Lesenswert?

Jetzt ist alles klar. Der Port "cin" wird nicht erkannt. Muss in Port 
"c" umbenannt werden. Jetzt funzt es.

von BerndS (Gast)


Angehängte Dateien:

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von The one (Gast)


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.

von BerndS (Gast)


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?

von BerndS (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch das komplette Programm (Anhang).

von SeriousSam (Gast)


Lesenswert?

Die Variable a oder a_negativ hat 9 Bits, der Eingang von Komplement hat 
jedoch nur 8 Bits.

von BerndS (Gast)


Lesenswert?

Aha, mit "elements" sind also Bits gemeint. Muss das noch einmal 
überfliegen.

von BerndS (Gast)


Lesenswert?

OK, ich muss also die Signale

"a_negativ" usw. auf eine Wortlänge von 8 Bit verkleinern.

->
1
signal a_negativ    : std_logic_vector (n-1 downto 0); ...

Jetzt müsste das wohl hinhauen.

von BerndS (Gast)


Angehängte Dateien:

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?

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.