mikrocontroller.net

Forum: FPGA, VHDL & Co. FIFO Programmierung


Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal an alle,

Seit einiger zeit beschäftige ich mich mit VHDL, sieht auch so ganz gut 
aus.
Kleine Projekte in VHDL zu erstellen, machen keine Probleme.

Deswegen möchte ich jetzt an größere Sachen wo ich einfach weiter üben 
kann.

Unter dem neuen WebPack V10 habe ich
>Open Example< den Demo Fifo Core v2_fifo_vhd_258 XAPP 258: 511x8Fifo VHDL 
gespeichert.

Mit dieser demo übe ich schon seit 1 Woche.

Ich kann Daten Speichern und ich kann die Daten wieder auslesen.

Nur beim ersten Read Befehl bekomme ich 32Bit mit nullen, erst der 
zweite Read Befehl
bringt mir das erste Write ans Tageslicht.

Kann mir jmd einen Tipp geben wie ich das hinbekomme, das wenn ich zb. 
64 mal Daten Speichere,
dann auch beim ersten Leseversuch das erste geschriebene Datenwort 
bekomme und nicht nullen.


Danke für Antworten.

mfg
frankS

Autor: ugly_dugly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hört sich für meinen Geschmack ganz nach einem Timing-Problem an. 
Ich vermute du übernimmst die Daten aus dem FIFO einfach zu früh. Bei 
einem normalen FIFO stehen die Daten erst nach der fallenden Flanke des 
read Impulses bereit (angenommen dieses Signal ist high-aktiv). Sie 
besitzen also eine Latenz von einem read Clock.

Willst oder musst du die Daten schon vorher übernehmen müsstes du einen 
sog. First-Word Fall-Through FIFO implementieren. Bei dem stehen die 
Daten schon mit dem ersten read Impuls bereit.

Hoffe ich konnte weiterhelfen.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das du mir so schnell geantwortet hast :-)


Also Timming würde ich nicht sagen, denn ich steppe das ganze.


>>Bei einem normalen FIFO stehen die Daten erst nach der
fallenden Flanke des read Impulses bereit
(angenommen dieses Signal ist high-aktiv). <<

Ich denke das könnte es sein, ich sende Read Impuls (high-aktiv) und 
lese die Daten, das teste ich naher mal.


>>Willst oder musst du die Daten schon vorher übernehmen müsstes du einen
sog. First-Word Fall-Through FIFO implementieren.<<


Das First-Word Fall-Through FIFO habe ich gerade unter IPCORE-Generator 
gefunden und mir ein Fifo erstellt, auch das werde ich mal testen.

mfg
FrankS

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Bei einem normalen FIFO stehen die Daten erst nach der
>>fallenden Flanke des read Impulses bereit
>>(angenommen dieses Signal ist high-aktiv).

Nein, sie stehen im naechsten Takt nach dem read Signal bereit. 
(Genauer: wenige Nanosekunden nach der steigenden Flanke der Clock, wenn 
das read Signal wenige Nanosekunden vor der Flanke bis wenige 
Nanosekunden anch der Flanke high war (wenig = 1-2 ns bei einem 
Virtex2/4). Das read-Signal kann z.B. dauerhaft high sein, dann werden 
in jedem Takt Daten gelesen.

Autor: ugly_dugly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Nein, sie stehen im naechsten Takt nach dem read Signal bereit<<.

Ja so ist es natürlich richtig. Aber eben nicht gleichzeitig mit dem 
read signal wollte ich damit nur sagen.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe,

Ich habe mir jetzt so wie ugly_dugly schrieb, einen First-Word 
Fall-Through FIFO erstellt.

Eingebunden habe ich den (ENTITY fifo_generator_v4_3 IS) in mein 
Main.hdl file (entity main is)


Und da stehe ich noch etwas auf dem Schlauch, da ich einen Fehler 
bekomme.

ERROR:HDLParsers:3281 - 
"C:/Xilinx_Projekte10/V2_FIFO_VHDL/Test_fifo/fifo_generator_v4_3.vhd" 
Line 50. behavioral is not an architecture body for fifo_generator_v4_3 
in library XilinxCoreLib.


genau in dieser zeile springt er  rein..

-- Configuration specification
for all : wrapped_fifo_generator_v4_3 use entity 
XilinxCoreLib.fifo_generator_v4_3(behavioral)

generic map(
  c_has_int_clk => 0,
  c_rd_freq => 1,
  c_wr_response_latency => 1,
  c_has_srst => 0,
         u.s.w .....


Könnt ihr mir einen Tipp geben, denn einen erstellten core vom 
CoreGenerator habe ich noch nie mit eingebunden.



mfg
Frank S

Autor: ugly_dugly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute du versuchst das vom Core Generator erzeugte VHDL File für 
die Einbindung des FIFOs in dein Top-Level zu verwenden. Dieses VHDL 
File ist aber nur für die Simulation gedacht. Du musst den FIFO aber per 
black_box attribut einbinden. z.B. wie folgt:
component fifo_sync_32Kx32
  port (
    clk      : IN std_logic;
    din      : IN std_logic_VECTOR(31 downto 0);
    rd_en    : IN std_logic;
    rst      : IN std_logic;
    wr_en    : IN std_logic;
    dout     : OUT std_logic_VECTOR(31 downto 0);
    empty    : OUT std_logic;
    full     : OUT std_logic;
    prog_full: OUT std_logic);
end component;

attribute box_type : string;
attribute box_type of fifo_sync_32Kx32  : component is "black_box";  
Guck einfach mal in die Hilfe zum Core Generator und ISE, da finmdest du 
mehr Infos dazu.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ugly_dugly wrote:
> Ich vermute du versuchst das vom Core Generator erzeugte VHDL File für
> die Einbindung des FIFOs in dein Top-Level zu verwenden.

Hallo ugly,

ja genau so ist es, aber ich sagte ja schon das ich noch nie einen
Core vom coreCenerator eingebunden habe...

Ich werde mir mal die Hilfe anschauen und wie man das macht.



mfg
FrankS

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na also, habe es geschafft. Man muss sich nur mal die Exampe von ISE 
anschauen. Also der Fifo bringt jetzt beim ersten Lesen auch das erste 
Word was man geschrieben hat. ( First-Word Fall-Through FIFO ) war das 
richtige.

Nur was ich noch nicht verstanden habe, bei dem Example sind

>-- FPGA Express Black Box declaration
>attribute fpga_dont_touch: string;
>attribute fpga_dont_touch of tenths: component is "true";

>-- Synplicity black box declaration
>attribute syn_black_box : boolean;
>attribute syn_black_box of tenths: component is true;

aber erst mit ugly_dugly seinem text ging es

>attribute box_type : string;
>attribute box_type of fifo_sync_32Kx32  : component is "black_box";



Kann mir das einer von euch sagen woher und wofür die Wörter kommen.
>fpga_dont_touch
>syn_black_box
>box_type



mfg
FrankS

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh mal in deine Projektansicht, lade das VHDL-File des Fifos, das der 
CoreGen erzeugt hat, per "Add -> Existing File" ins Projekt rein, dann 
kannst du unten bei Processes "View instantiation template" starten und 
schon wirft dir die ISE die korrekte Einbindung raus. Da musst du dann 
nur noch die Signale an deine internen Signale oder externe Ports 
anschließen.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das habe ich gemacht, aber bei mir kommt da nicht viel raus



Started : "View HDL Instantiation Template".
Compiling vhdl file
"C:/Xilinx_Projekte10/V2_FIFO_VHDL/mein_fifo/../fifo/fifo_generator_v4
_3.vhd" in Library work.
Entity <fifo_generator_v4_3> compiled.
Entity <fifo_generator_v4_3> (Architecture <fifo_generator_v4_3_a>) 
compiled.
tdtfi(vhdl) completed successfully.

Process "View HDL Instantiation Template" completed successfully


mfg
FrankS

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann öffne mal selber die Datei "fifo_generator_v4_3.vhi" im 
Projektverzeichnis, normalerweise wird die direkt nach dem Erstellen 
angezeigt.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich gerade gemacht, auch so wie du schon geschrieben hast, wird die 
fifo_generator_v4_3.vhi sofort geöffnet. Aber da steht die Anbindung 
auch nicht drin.. sondern..




>  COMPONENT fifo_generator_v4_3
>  PORT(
>    clk : IN std_logic;
>    din : IN std_logic_vector(31 downto 0);
>    rd_en : IN std_logic;
>    rst : IN std_logic;
>    wr_en : IN std_logic;
>    dout : OUT std_logic_vector(31 downto 0);
>    empty : OUT std_logic;
>    full : OUT std_logic
>    );
>  END COMPONENT;
>
>  Inst_fifo_generator_v4_3: fifo_generator_v4_3 PORT MAP(
>    clk => ,
>    din => ,
>    rd_en => ,
>    rst => ,
>    wr_en => ,
>    dout => ,
>    empty => ,
>    full =>
>  );

Autor: Michael Niegl (bigmike47)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was mehr braucht man denn noch?

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Frage war ja wie etwas oben geschrieben, wie man auf die attribute 
text kommt.





>Nur was ich noch nicht verstanden habe, bei dem Example sind

>-- FPGA Express Black Box declaration
>attribute fpga_dont_touch: string;
>attribute fpga_dont_touch of tenths: component is "true";

>-- Synplicity black box declaration
>attribute syn_black_box : boolean;
>attribute syn_black_box of tenths: component is true;

aber erst mit ugly_dugly seinem text ging es

>attribute box_type : string;
>attribute box_type of fifo_sync_32Kx32  : component is "black_box";

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich versteh dein problem nicht ganz. Den Abschnitt bei Component 
muss in die Architecture und die Instanziierung nach dem Begin in die 
Behavior des VHDL files, in welches du den FIFO einbauen willst. Noch 
die Signale anschließen und gut. Da muss man doch nix extra mit text 
irgendwas machen.

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt verstehe ich das erst. Wenn ich die 2 zeilen raus nehme,

>--attribute box_type : string;
>--attribute box_type of fifo_511_32  : component is "black_box";

bekomme ich nur eine Warnung.
>Xst:2211 - "C:/Xilinx_Projekte10/fifo/fifo/main.vhd" line 125: >Instantiating 
black box module <fifo_511_32>.

wenn ich die zeilen einschreibe, bekomme ich keine Warnung.
Das hat mich Interessiert, wie und woher der text kommt.
(Instantiating black box module)



mfg
FrankS

Autor: Frank Stucke (Firma: Keine) (franks)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

Ich spiele gerade mit dem BlockRam Generator rum, na ja halt üben üben 
üben :-)

Und bei einem Single Block Ram Erstellung bekomme ich
input clka;
input [31 : 0] dina;
input [10 : 0] addra;
input ena;
input [0 : 0] wea;
output [31 : 0] douta;



Nur bei input [0 : 0] wea;
verstehe ich nur Bahnhof ?  warum [0:0] ? das ist doch nur EIN Input .!

ich muss das also wirklich so schreiben, sonst bekomme ich einen Fehler.
wea: in  STD_LOGIC_VECTOR (0 downto 0);

Kann mir dazu jmd was schreiben ?



mfg

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.