www.mikrocontroller.net

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


Autor: BerndS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgenden Volladdierer
library ieee;
use ieee.std_logic_1164.all;

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

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

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

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

architecture struktur of RCAddierer is
  signal c : std_logic_vector (0 to n); -- Hilfssignal
  
  component Volladdierer is
    port (a, b, c : in std_logic; sum, cout : out std_logic);
  end component Volladdierer;
  
  begin
    c(0) <= cin;     -- Eingang Übertrag
    g1 :   for i in 0 to n-1 generate
        fm : Volladdierer port map (a(i), b(i), c(i), sum(i), c(i+1));
    end generate g1;  -- Ausgang Übertrag
    cout <= c(n);
    
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.

Autor: BerndS (Gast)
Datum:

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

Autor: BerndS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
OK, jetzt geht auch die Bildung des Komplents einer Binärzahl:
library ieee;
use ieee.std_logic_1164.all, ieee.std_logic_arith.all;

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

end entity Komplement;

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

  component RCAddierer is
    generic (n: natural := 8);
    port (a, b: in std_logic_vector (n-1 downto 0);   -- Summanden,
          cin : in std_logic;                    -- Übertragbit "carry",
          sum : out std_logic_vector (n-1 downto 0);    -- Summe,
          cout:  out std_logic);                      -- Übertragbit "carry" des Addierers
  end component RCAddierer;
  
  begin
    P1 : RCAddierer
    generic map(n)
    port map (not x, zero, '1', z(n-1 downto 0), open);
      
end architecture struktur;

Habt ihr noch Verbesserungen vorzuschlagen. Bin Anfänger.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

entity Komplement is
    generic (n  : natural := 4);
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
end Komplement;

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

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

entity Komplement is
    generic (n  : natural := 4);
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
end Komplement;

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

Oder so:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity Komplement is
    generic (n  : natural := 4);
    Port ( x : in   STD_LOGIC_VECTOR (n-1 downto 0);
           z : out  STD_LOGIC_VECTOR (n-1 downto 0));
end Komplement;

architecture Behavioral of Komplement is
begin
   z <= std_logic_vector(0 - signed(x));
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.

Autor: The one (Gast)
Datum:

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

Autor: BerndS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
P_a_negativ :   Komplement
          generic map (n)
          port map (a, a_negativ);
  

Fragment.

Habe ich da was falsch deklariert?

Autor: BerndS (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch das komplette Programm (Anhang).

Autor: SeriousSam (Gast)
Datum:

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

Autor: BerndS (Gast)
Datum:

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

Autor: BerndS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich muss also die Signale

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

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

Jetzt müsste das wohl hinhauen.

Autor: BerndS (Gast)
Datum:
Angehängte Dateien:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.