Forum: FPGA, VHDL & Co. Component mit Generics, 2 mal einbinden


von Max (Gast)


Lesenswert?

Hi

Ich habe ein kleines Problem und suche jetzt scho 2 Stunden nach einer 
Lösung.

Es ist eig. ganz einfach:

Ich habe ein FIFO mit Generics das ich in einem anderen Modul benutzen 
möchte.
Doch in dem Modul brauche ich 2 FIFOs, mit unterschiedlichen 
Datenbreiten usw.

Also Binde ich das FIFO so ein:
1
  component AsyncFIFO
2
    generic(  Width : integer := 32;
3
          Depth : integer := 64;
4
          AdressWidth : integer := 6;
5
          RamTypeFifo : string := "Block");
6
    port(  ReadCLK : In std_logic;
7
        WriteCLK : In std_logic;
8
        ReadCE : In std_logic;
9
        WriteCE : In std_logic;
10
        RST : In std_logic;
11
        Din : In std_logic_vector(Width-1 downto 0);
12
        RE : In std_logic;
13
        WE : In std_logic;          
14
        Dout : Out std_logic_vector(Width-1 downto 0);
15
        Empty : Out std_logic;
16
        Full : Out std_logic);
17
  end component;

Und gebe denn später zweimal Unterschiedliche Generics an:
1
CommandFIFO: AsyncFIFO 
2
    generic map(Width => 26,
3
            Depth => 4,
4
            AdressWidth => 2,
5
            RamTypeFifo => "Distributed")
6
    port map(ReadCLK => CLK,
7
          WriteCLK => UI_CLK,
8
          ReadCE => CE,
9
          WriteCE => CE,
10
          RST => RST,
11
          Din => CommandFIFO_Din,
12
          Dout => CommandFIFO_Dout,
13
          RE => NewCommandEnable,
14
          WE => CMD_WE,
15
          Empty => CMD_Empty,
16
          Full => CMD_Full);
17
  
18
  DataInFIFO: AsyncFIFO 
19
    generic map(Width => 128,
20
            Depth => 16,
21
            AdressWidth => 4,
22
            RamTypeFifo => "Block")
23
    port map(ReadCLK => CLK,
24
          WriteCLK => UI_CLK,
25
          ReadCE => CE,
26
          WriteCE => CE,
27
          RST => RST,
28
          Din => DataIn,
29
          Dout => DataInput,
30
          RE => NewDataEnable,
31
          WE => DataIn_WE,
32
          Empty => DataIn_Empty,
33
          Full => DataIn_Full);

Problem ist jetzt dass, das ISE nat. meckert von wegen das die Instanz 
z.B. eine andere Signal Breite bei Dout hat als es die Componente hat.
1
ERROR:Xst:2587 - Port <Dout> of instance <DataInFIFO> has different type in definition <AsyncFIFO>.

So, dafür muss es ja iwie eine einfache Lösung geben und deswegen hoffe 
ich einfach auf eure Hilfe :)

Gruß Max

von Sym (Gast)


Lesenswert?

In der Component steht eine andere Länge als in der Instanzierung. 
Natürlich geht das nicht.
Wieso gibst du in der Entity und Component keine ranges an?

von D. I. (Gast)


Lesenswert?

Sym schrieb:
> In der Component steht eine andere Länge als in der Instanzierung.
> Natürlich geht das nicht.
> Wieso gibst du in der Entity und Component keine ranges an?

Das ist nicht das Problem. Das ist nur dafür da, wenn man die generics 
nicht mappt, dass man Standardwerte hat

Wie ist das Signal "DataInput" definiert?

Und zeig mal die Entity-Beschreibung von AsyncFIFO, da wird der Hund 
begraben liegen.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hi

Einzeln Instanzieren geht ja ohne weiteres, muss das nur beim einbinden 
der Component dort die selben Werte bei den Generics einstellen wie 
sp#ter dann beim Instanzieren :-/

Das mit den Range hört sich nach was passendem an kannst du mir das 
vllt. an nem kleinen Beispiel verdeutlichen ?
Google hat da grade leider nichts zu!

Gruß Max

PS: Nur zur Zufriedenstellung, das Fifo ist angehängt!

von Jan M. (mueschel)


Lesenswert?

In dem von dir geposteten Code ist kein Fehler zu sehen.
Schau doch mal, ob DataInput wirklich ein std_logic_vector(127 downto 0) 
ist.

Ansonsten poste doch bitte mal den kompletten Code in dem du die beiden 
Fifos instantiierst damit man das nachvollziehen kann.

Btw, eine der beiden generics
>Depth : integer := 64;  --FIFO Tiefe
>AdressWidth : integer := 6;
kannst du dir sparen, Depth kannst du einfach berechnen mit 
2**AdressWidth.

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


Lesenswert?

Jan M. schrieb:
> Depth kannst du einfach berechnen mit 2**AdressWidth.
Aber der umgekehrte Weg ist ein wenig beschwerlicher... ;-)
http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html

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.