Forum: FPGA, VHDL & Co. Simulation 16bit FIFO


von Andreas B. (loopy83)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin bei meinem Projekt auf einen merkwürdigen Fehler gestoßen.

Ich habe in meinem Design ein FIFO eingebunden, welches über den Ausgang 
eines Schieberegisters gefüttert wird. Immer wenn das Schieberegsister 8 
Schiebeoprationen durchgeführt hat, wird ein Ausgang namens "FULL" 
geschaltet der signalisiert, jetzt sind 8 neue bits vorhanden und zum 
Auslesen bereit. Das geschieht zwei Mal parallel und die Ausgänge der 
beiden SRs ergeben dann den 16bit Eingang des FIFOs.

Der Eingang des FIFOs (write) wird dann mit eben diesem FULL Signal 
getaktet, dass quasi immer 16bit neue Daten ins FIFO geschoben werden.

Der Ausgang des FIFOs wird extern getaktet und unterscheidet sich vom 
Eingangstakt. Das FIFO dient also mehr oder weniger nur der 
Synchronisation der Eingangs- und Ausgangsseite.

Nun habe ich versuchsweise den RD_EN und WR_EN dauerhaft mittels zweier 
Konstanten auf '1' gelegt, weil am Ausgangs des FIFOs nix anliegt.
1
constant FIFO_RD_EN : std_logic := '1'; 
2
constant FIFO_WR_EN : std_logic := '1';

Aber selbst mit dieser Maßnahme werden beide Signale in der Simulation 
unter Modelsim XE auf 0 gelegt.

Wie kann das sein, wenn ich beide Signale doch auf hart '1' gelegt habe?

Könnte eine Warnung im Modelsim Schuld daran sein?
1
# ** Warning: (vsim-3473) Component instance "fifo : fifo_16" is not bound.

Den Testbench habe ich im ISE erstellen lassen und meine Eingangssignale 
eingestellt.
Den FIFO habe ich via CoreGen erstellt, das daraus resultierende .xco 
File habe ich von Hand (weil hier die Option "View HDL Instantiation 
Template" nicht verfügbar ist, wie zum Beispiel bei einem DCM) 
eingebunden.
1
  COMPONENT FIFO_16 
2
  port (
3
  din: IN std_logic_VECTOR(15 downto 0);
4
  rd_clk: IN std_logic;
5
  rd_en: IN std_logic;
6
  rst: IN std_logic;
7
  wr_clk: IN std_logic;
8
  wr_en: IN std_logic;
9
  dout: OUT std_logic_VECTOR(15 downto 0);
10
  empty: OUT std_logic;
11
  full: OUT std_logic
12
  );
13
  END COMPONENT;
14
15
Fifo : FIFO_16 PORT MAP (
16
  din => DATA_IN_FIFO,
17
  dout => DATA_OUT_FIFO,
18
  rd_clk => PCLK,
19
  rd_en => FIFO_rd_en,
20
  wr_clk => FULL,
21
  wr_en => FIFO_wr_en,
22
  rst => RESET,
23
  empty => FIFO_empty,
24
  full => FIFO_full
25
  );

VIELEN DANK!!!

von SuperWilly (Gast)


Lesenswert?

># ** Warning: (vsim-3473) Component instance "fifo : fifo_16" is not bound.
>Könnte eine Warnung im Modelsim Schuld daran sein?


Ja definitiv! Du solltest herausfinden, wieso die Komponente nicht 
gefunden wird. Hast du die richtige Bibliothek eingebunden ?


SuperWilly

von Andreas B. (loopy83)


Lesenswert?

Hallo,
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
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
library UNISIM;
9
use UNISIM.VComponents.all;

So sieht es momentan aus, sollte meiner Meinung nach nichts fehlen, 
sonst würde er doch auch schon bei der Synthese meckern, oder?

Wie wäre denn der korrekte Weg, den IPCore des Fifos einzubinden bzw. 
aufzurufen? Denn bisher habe ich es ja nur per Hand gelöst... gibt es da 
eine "sicherere" Methode ähnlich dem "View HDL Instantiation
Template", denn diese Option ist ja hier leider nicht verfügbar.

Vielen Dank!

von Marcus W. (Gast)


Lesenswert?

> ... gibt es da eine "sicherere" Methode ähnlich dem "View HDL Instantiation
> Template", denn diese Option ist ja hier leider nicht verfügbar.

Benutzt du ein altes ISE?

Zumindest bei ISE 11 gibt es nämlich das Instantiation Template auch für 
FIFOs.
AFAIR wurde das .vho file bei früheren Versionen zwar im 
Projektverzeichniss angelegt, aber nur nicht im ISE verlinkt.

Gruß

von Marcus W. (Gast)


Lesenswert?

Achja, erzeugst du das FIFO im externen CoreGen oder innerhalb des ISE 
Designflows?

von Christian R. (supachris)


Lesenswert?

Die Warnung bedeutet, dass Modelsim den VHDL_Wrapper des FIFO-Cores 
nicht finden kann und daher nicht simulieren kann. Du musst zu deinem 
Modelsim Projekt die vom CoreGenerator erzeugte VHDL Datei hinzufügen 
und kompilieren, dann klappts.

von Cpt (Gast)


Lesenswert?

Hallo zusammen!

Hatte das Problem auch letztens :-) Hast du den externem Coregen 
benutzt? Dann ist der korrekte Weg (zumindest unter ISE 11.x) in deinem 
Projekt "add copy of source" zu wählen und dann das .xco file. Der Rest 
wird dann automatisch kopiert.
Hoffe das hilft weiter.

Gruß
Cpt

von Andreas B. (loopy83)


Lesenswert?

Hallo zusammen und danke für die Antworten.

Ich habe ISE 10.1 und habe den internen CoreGen genommen.

Ich weiß zwar nicht genau, wie es geklappt hat, aber nun geht es und der 
FIFO spuckt auch was aus :)

VIELEN DANK!!!

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.