mikrocontroller.net

Forum: FPGA, VHDL & Co. FIFO mit coregenerator erstellt, was nun..


Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

versuche mich in VHDL fleißig weiter und möchte ein FIFO in mein vhdl 
code einbauen. Ich habe für den Anfang als Eingang ein SWITCH (4 bit) 
und am AUSGANG 4 LED die dann entsprechen leuchten sollen.

So,ich habe mir mittels FIFO GENERATOR (XILINX) 4 bit breit und 4 bit 
lang erstellt. Ich habe dann den erstellten vhdl code in ein neues VHDL 
MODUL kopiert.

Dann habe ich es in mein Hauptmodul mittels COMPONENT definiert und in 
der ARCHITECTURE,-- PORT MAP die jeweiligen ein und ausgänge definiert

 COMPONENT FIFO_4BIT
  PORT  (   clk: IN std_logic;
        din: IN std_logic_VECTOR(3 downto 0);
        rd_en: IN std_logic;
        rst: IN std_logic;
        wr_en: IN std_logic;
        dout: OUT std_logic_VECTOR(3 downto 0);
        empty: OUT std_logic;
        full: OUT std_logic);
  
end COMPONENT;
......

FIFO : FIFO_4BIT
  PORT MAP (clk => clk_out, din => SAVE7, rd_en => clk_EN,rst => OPEN,wr_en =>clk_EN, dout=> SAVE7,empty => OPEN,full=> OPEN);


Meine Problem ist, was nun?

Ich möchte für den anfang daten einlesen und sie weiter geben. Muss ich 
das jetzt noch selber definier und wurde dies in Core generator schon 
erstellt und ich muss lediglich die Daten zuweisen.

Oder muss ich doch sagen mit steigender flanke und wenn read_en =1 
dann....

Kann mir da jemand helfen?


Gruss

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Coregen generiert ein File fifo_generator_ug175.pdf mit, das sollte 
man sich mal durchlesen, da steht wirklich alles drinnen was man wissen 
muss zu dem Teil...

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey cool danke, werd ich gleich machen!

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm.. ok mal durchgeblättert.


Würde es so gehen: z.B


FIFO : FIFO_4BIT
  PORT MAP (clk => clk_EN, din => dinx, rd_en => clk_2,rst => RESET,wr_en =>clk_2, dout=> doutx,empty => OPEN,full=> OPEN);


.....

FIFO_AUSGABE: process (reset,clk_EN)
  begin
  
  if reset ='1' then 
    dinx <="0000";
    doutx<="0000";
  elsif rising_edge (clk_EN) then
    if (clk_2 = '1') then
    dinx <=EINGANG ;
    end if;
    
  elsif falling_edge (clk_EN) then
    if  (clk_2 = '1') then
    doutx<=dinx;
    end if;
  
  end if;    
  end process FIFO_AUSGABE;

Mit steigender flanke und wenn EN = 1 dann übernimmt er das signal in 
dinx welches das din vom ist und mit fallender flanke und EN = 1 liest 
er es in den Ausgang ??

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich musst du nur wissen :

wenn read_enable am FIFO anliegt und eine positive Taktflanke im FIFO 
erkannt wird, dann werden die Daten 1 mal übernommen.

Der Rückweg sieht genauso aus :

Mit write_enable und Taktflanke liegen 1 Takt später bis zum nächsten 
Abruf die Daten am Ausgang an.


Insofern hast du erstmal alles richtig gemacht, full, empty usw brauchst 
du für erste Tests nicht zwingend beachten.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu spät...

in keinem Fall steigende und fallende Flanke benutzen, ansonsten sollte 
das funktionieren.

Wenn du sicher gehen willst das die ausgelasen Daten stimmen, dann bau 
dir einen "valid" port ein und übernimm die gelesenen Daten immer genau 
dann, wenn valid='1'

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

Bewertung
0 lesenswert
nicht lesenswert
   if reset ='1' then 
   :
   elsif rising_edge (clk_EN) then
   :   
   elsif falling_edge (clk_EN) then
   :
   end if;  
Packt der Synthesizer das?  Hmmm, könnte sein...
Ich würde die Beschreibung trotzdem als "unüblich" bezeichnen.

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab verwende ja für das ENABLE Signal ein Takt von 1 Hz, über einen 
counter und für die clk 20 MHZ, und wollte für read und write das selbe 
enable verwenden, geht das?

Und irgendwie gehts nicht so, kommt ne fehlermeldung....:(

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  FIFO_AUSGABE: process (reset,clk_EN)
  begin
  
  if reset ='1' then 
    dinx <="0000";
    doutx<="0000";
  elsif rising_edge (clk_EN) then
    if   (wr_en2 = '1') then
      dinx <=SAVE1 ;
    elsif (rd_en2 = '1') then
      doutx<=dinx;
    end if;
  end if;    
  end process FIFO_AUSGABE;
  
    
  AUSGANG<= doutx;


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

Bewertung
0 lesenswert
nicht lesenswert
> Packt der Synthesizer das?  Hmmm, könnte sein...
Tja, da habe ich ihn überschätzt:
nicht mal mit einer vereinfachten Variante geht das  :-(
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity BothEdges is
    Port ( reset : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           din : in  STD_LOGIC;
           rise : out  STD_LOGIC;
           fall : out  STD_LOGIC);
end BothEdges;

architecture Behavioral of BothEdges is
begin
   process (reset,clk) begin
      if reset ='1' then 
         rise <= '0';
         fall <= '0';
      elsif rising_edge (clk) then
         rise <= din;   
      elsif falling_edge (clk) then
         fall <= din;
      end if;   
   end process;

end Behavioral;
Fazit:
cannot be synthesized, bad synchronous description.

Aber so ginge es wieder:
begin
   process (reset,clk) begin
      if reset ='1' then 
         fall <= '0';
      elsif falling_edge (clk) then
         fall <= din;
      end if;   
   end process;

   process (reset,clk) begin
      if reset ='1' then 
         rise <= '0';
      elsif rising_edge (clk) then
         rise <= din;   
      end if;   
   end process;

BTW:
In der Simulation verhalten sich beide Beschreibungen identisch  :-o

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und mein code da oben, ich hab zwar den selben takt für rd_en und wr_en 
aber eben 2 signale erzeugt....

Ich krieg so ein fehler

:NgdBuild:455 - logical net 'AUSGANG_3_OBUF' has multiple driver(s):
     pin G on block XST_GND with type GND,
     pin DOADO<3> on block
   FIFO/BU2/U0/grf.rf/mem/gbm.gbmg.gbmga.ngecc.bmg/blk_mem_generator/valid. 
cstr/
   ramloop[0].ram.r/s6_noinit.ram/SDP.SIMPLE_PRIM9.ram with type 
RAMB8BWER,
     pin DOADO<2> on block
   FIFO/BU2/U0/grf.rf/mem/gbm.gbmg.gbmga.ngecc.bmg/blk_mem_generator/valid. 
cstr/
   ramloop[0].ram.r/s6_noinit.ram/SDP.SIMPLE_PRIM9.ram with type 
RAMB8BWER,

Autor: Igor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt, ich bin auch ein Dödel, es reicht ja lediglich die 
Signale über PORT MAP zu definiern und das fifo macht schon was es soll 
:)

Danke

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.