mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL Syntaxproblem: type incompatible


Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
habe mal wieder ein Problem mit einer Fehlermeldung der ISE.

Habe eine Component geschrieben in der ein 34 bittiger Vector:
Data_out: out STD_LOGIC_VECTOR(33 downto 0) 
definiert wird, um Ihn als Ausgabevektor zu nutzen.
Die Syntaxkontrolle und Synthetisierung dieser Komponente liefert keine 
Fehler!

Nun versuche ich diese Komponente in eine Top-Level Entity einzubinden, 
was mit anderen Komponenten auch bereits gut funktioniert hat, 
allerdings verwendete ich in diesen keine Vektoren, sondern nur 
STD_LOGICs.

In der Top-Entity habe ich ebenfalls einen Ausgabevektor definiert:
 pdata_top: out STD_LOGIC_VECTOR (33 downto 0) 
und versuche nun den Vektor der Komponente an die Top_Entity weiter zu 
geben. Leider bekomme ich dabei eine Fehlermeldung:
"Type of Data_out is incompatible with type od pData_top.

Die Zuweisung habe ich wie folgt in der Instantierung versucht:
Data_out => pData_top

Auch der Umweg über ein als STD_LOGIC_VECTOR defniertes Signal in der 
Architecture der Top-Entity blieb leider mit der gleichen Fehlermeldung 
erfolglos.

Hat vllt. jemand einen Tipp wo ich noch nach dem Fehler suchen könnte?
Verwende auch in beiden sourcen die gleichen Libs:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

Da die Vektoren vom gleichen Typ und in der gleichen Größe definiert 
sind, habe ich leider keinen Ansatz mehr, an welchem Punkt hier eine 
Inkompatibilität vorliegen soll.

Gruß & Dank,

Stefan K.

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

Bewertung
0 lesenswert
nicht lesenswert
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

Das ist aber "voll mit der Schrotflinte draufgehalten".
Viel hilft viel? Irgendwas wird schon treffen?

Machs so:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
Und verwende die Konvertierungen und Casts aus dem NUMERIC_STD Package. 
Denn sowohl in den STD_LOGIC_xx wie auch im NUMERIC_STD sind 
Typumwandlungen definiert, und damit bekommst du nur ein wildes 
Durcheinander.


> allerdings verwendete ich in diesen keine Vektoren,
> sondern nur STD_LOGICs.
??????
Zeig doch mal mehr von deinem Code.

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Lothar,

also erstmal zu den Libs, ... die IEEE.STD_LOGIC_ARITH.ALL konnte ich 
grade ohne Probleme auskommentieren, versuche ich jedoch auch noch die 
"unsigned" einzusparen, so meckert die Syntaxkontrolle bei meinen 
Binärzählern.

Meine Top-Entity sieht wie folgt aus:
------
-- Header
------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Reg_Tester is
port (
    -- Eingänge der Top-Entity:
    Clk_top :   in STD_LOGIC;
    Reset_top :  in STD_LOGIC;
    Clk_en_top :  in STD_LOGIC;
    ADC_top :  in STD_LOGIC;
    sout_top :      out STD_LOGIC;
    
    -- Ausgänge der Top-Entity:
    pData_top:  out STD_LOGIC_VECTOR(33 downto 0);
    SClk_top:  out STD_LOGIC;  --Debug Only
    SClk_run_top:   out STD_LOGIC  --Debug Only
    );
end Reg_Tester;

architecture Behavioral of Reg_Tester is
-- interne Signale des TopLevels: --
signal SClk_top_int: STD_LOGIC;
signal SClk_run_top_int: STD_LOGIC;
signal pData_top_int: STD_LOGIC_VECTOR(33 downto 0);

--Komponentendeklaration --

--Einbinden des SClkGenerators als Komponente: --
component SClk_Gen is
  port (
      -- Eingänge der Komponente:
      Clk:   in   STD_LOGIC;
      Clk_en: in   STD_LOGIC;
      
      -- Ausgänge der Komponente:
      SClk:    out   STD_LOGIC;
      SClk_run: out  STD_LOGIC      
      );
end component SClk_Gen;
-------------------------------------------------------------------------------

-- Einbinden des Bit-Mustergenerators als Komponente: --
component bitgen is
  port (
         -- Komponenteneingänge:
         SClk:   in  STD_LOGIC;
         Reset:  in  STD_LOGIC;
         AD_Conv:  in  STD_LOGIC;
         
         -- Komponentenausgänge:
         slaveout: out  STD_LOGIC
        );
end component bitgen;

-------------------------------------------------------------------------------

-- Einbinden des TestReg als Komponente: --
component RXSREG is
  port (
      -- Komponenteneingänge:
      Clk:  in    STD_LOGIC;
      SClk:  in    STD_LOGIC;
      Reset:  in    STD_LOGIC;
      RX_en:  in    STD_LOGIC;
      MISO:  in    STD_LOGIC;
      AD_Conv:in    STD_LOGIC;
      
      -- Komponentenausgänge:
      Data_out: out  STD_LOGIC
      );
end component RXSREG;
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------

-- Begin der TopLevel-Architecture --
begin
-- Instantierung des SClk-Generators: --
SClkGen_top: SClk_Gen
port map(
      Clk => Clk_top,
      SClk => SClk_top_int,
      Clk_en => Clk_en_top,
      SClk_run => SClk_run_top_int
      );
-------------------------------------------------------------------------------
-- Instantierung des Bit-Mustergenerators: --
BitGen_top: bitgen 
port map(
  SClk => SClk_top_int,
  Reset => Reset_top,
  AD_Conv => ADC_top,
  slaveout => sout_top
  );
-------------------------------------------------------------------------------

--Instantierung des Testregisters: --
BitGen_top: RXSREG
port map(
  Clk => Clk_top,
  SClk => SClk_top_int,
  Reset => Reset_top,
  RX_en => ADC_top,
  Data_out => pData_top_int
  );
-------------------------------------------------------------------------------

SClk_top <= SClk_top_int;
SClk_run_top <= SClk_run_top_int;
pData_top <= pData_top_int;


end Behavioral;


Sowohl der zuerst eingebundene Taktgenerator, als auch der darauf 
folgende Bitgenerator laufen in der Simulation auch als eingebundene 
Komponenten problemlos. Nur das einbinden des RXReg funktioniert 
irgendwie nicht. Da meldet ISE immer wieder das die Typen von Data_out 
und pData_top_int bzw. pData_top inkompatible wären.

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

Bewertung
0 lesenswert
nicht lesenswert
> so meckert die Syntaxkontrolle bei meinen Binärzählern.
Klar, das  +'1' für std_logic_vector ist in der NUMERIC_STD nicht 
definiert. Dafür gibt es dort aber sehr schöne SIGNED und UNSIGNED 
Datentypen, mit denen sich sauber rechnen lässt (+-*/). Mein Tipp: sieh 
dir das mal genauer an.


> signal pData_top_int: STD_LOGIC_VECTOR(33 downto 0);
:
> Data_out: out  STD_LOGIC
:
> Data_out => pData_top_int
> Da meldet ISE immer wieder das die Typen von Data_out
> und pData_top_int bzw. pData_top inkompatible wären.
Die sind inkompatibel, weil STD_LOGIC /= STD_LOGIC_VECTOR. Welchem der 
34 Bits von pData_top_int soll denn das 1 Bit von Data_out zugeordnet 
werden?
So würde es z.B. gehen:
>> Data_out => pData_top_int(0)

Autor: Stefan K. (stefan82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ouch ... Danke für den Hinweis ...
in der Konfiguration der Komponente selbst ist Data_out natürlich als 
Vektor (33 downto 0) definiert ... den Fehler in der 
Komponenten-Deklaration hab ich nun allerdings seit 2 Std. übersehen.... 
ouch ...

Die Fähigkeiten der einzelnen Libs werd ich mir dann auch noch mal 
genauer zu Gemüte führen.

DANKE erstmal für deine schnelle und kompetente Hilfe!

Gruß Stefan82

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du weist einem Ausgang einem Ausgang zu.

"pdata_top: out STD_LOGIC_VECTOR (33 downto 0) "

lass mal unten das "out" weg

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

Bewertung
0 lesenswert
nicht lesenswert
> Du weist einem Ausgang einem Ausgang zu.
Der Ausgang einer Komponente wird dem Ausgang der Top-Entity zugewiesen. 
Also "nur" durchgereicht. Das ist gut so  ;-)
Allerdings sollte (wie beschrieben) die Breite des durchgereichten 
Vektors passen.

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.