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


von Stefan K. (stefan82)


Lesenswert?

Hallo zusammen,
habe mal wieder ein Problem mit einer Fehlermeldung der ISE.

Habe eine Component geschrieben in der ein 34 bittiger Vector:
1
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:
1
 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:
1
"Type of Data_out is incompatible with type od pData_top.

Die Zuweisung habe ich wie folgt in der Instantierung versucht:
1
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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
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.

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


Lesenswert?

1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use IEEE.NUMERIC_STD.ALL;

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

Machs so:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
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.

von Stefan K. (stefan82)


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:
1
------
2
-- Header
3
------
4
library IEEE;
5
use IEEE.STD_LOGIC_1164.ALL;
6
use IEEE.STD_LOGIC_UNSIGNED.ALL;
7
use IEEE.NUMERIC_STD.ALL;
8
9
entity Reg_Tester is
10
port (
11
    -- Eingänge der Top-Entity:
12
    Clk_top :   in STD_LOGIC;
13
    Reset_top :  in STD_LOGIC;
14
    Clk_en_top :  in STD_LOGIC;
15
    ADC_top :  in STD_LOGIC;
16
    sout_top :      out STD_LOGIC;
17
    
18
    -- Ausgänge der Top-Entity:
19
    pData_top:  out STD_LOGIC_VECTOR(33 downto 0);
20
    SClk_top:  out STD_LOGIC;  --Debug Only
21
    SClk_run_top:   out STD_LOGIC  --Debug Only
22
    );
23
end Reg_Tester;
24
25
architecture Behavioral of Reg_Tester is
26
-- interne Signale des TopLevels: --
27
signal SClk_top_int: STD_LOGIC;
28
signal SClk_run_top_int: STD_LOGIC;
29
signal pData_top_int: STD_LOGIC_VECTOR(33 downto 0);
30
31
--Komponentendeklaration --
32
33
--Einbinden des SClkGenerators als Komponente: --
34
component SClk_Gen is
35
  port (
36
      -- Eingänge der Komponente:
37
      Clk:   in   STD_LOGIC;
38
      Clk_en: in   STD_LOGIC;
39
      
40
      -- Ausgänge der Komponente:
41
      SClk:    out   STD_LOGIC;
42
      SClk_run: out  STD_LOGIC      
43
      );
44
end component SClk_Gen;
45
-------------------------------------------------------------------------------
46
47
-- Einbinden des Bit-Mustergenerators als Komponente: --
48
component bitgen is
49
  port (
50
         -- Komponenteneingänge:
51
         SClk:   in  STD_LOGIC;
52
         Reset:  in  STD_LOGIC;
53
         AD_Conv:  in  STD_LOGIC;
54
         
55
         -- Komponentenausgänge:
56
         slaveout: out  STD_LOGIC
57
        );
58
end component bitgen;
59
60
-------------------------------------------------------------------------------
61
62
-- Einbinden des TestReg als Komponente: --
63
component RXSREG is
64
  port (
65
      -- Komponenteneingänge:
66
      Clk:  in    STD_LOGIC;
67
      SClk:  in    STD_LOGIC;
68
      Reset:  in    STD_LOGIC;
69
      RX_en:  in    STD_LOGIC;
70
      MISO:  in    STD_LOGIC;
71
      AD_Conv:in    STD_LOGIC;
72
      
73
      -- Komponentenausgänge:
74
      Data_out: out  STD_LOGIC
75
      );
76
end component RXSREG;
77
-------------------------------------------------------------------------------
78
79
80
-------------------------------------------------------------------------------
81
82
-- Begin der TopLevel-Architecture --
83
begin
84
-- Instantierung des SClk-Generators: --
85
SClkGen_top: SClk_Gen
86
port map(
87
      Clk => Clk_top,
88
      SClk => SClk_top_int,
89
      Clk_en => Clk_en_top,
90
      SClk_run => SClk_run_top_int
91
      );
92
-------------------------------------------------------------------------------
93
-- Instantierung des Bit-Mustergenerators: --
94
BitGen_top: bitgen 
95
port map(
96
  SClk => SClk_top_int,
97
  Reset => Reset_top,
98
  AD_Conv => ADC_top,
99
  slaveout => sout_top
100
  );
101
-------------------------------------------------------------------------------
102
103
--Instantierung des Testregisters: --
104
BitGen_top: RXSREG
105
port map(
106
  Clk => Clk_top,
107
  SClk => SClk_top_int,
108
  Reset => Reset_top,
109
  RX_en => ADC_top,
110
  Data_out => pData_top_int
111
  );
112
-------------------------------------------------------------------------------
113
114
SClk_top <= SClk_top_int;
115
SClk_run_top <= SClk_run_top_int;
116
pData_top <= pData_top_int;
117
118
119
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.

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


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)

von Stefan K. (stefan82)


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

von Gast (Gast)


Lesenswert?

Du weist einem Ausgang einem Ausgang zu.

"pdata_top: out STD_LOGIC_VECTOR (33 downto 0) "

lass mal unten das "out" weg

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


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.

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.