mikrocontroller.net

Forum: FPGA, VHDL & Co. Frage zu fifo


Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Lothar,

wenn ich deine Single-Clock-Fifo Beschreibung simuliere, erhalte ich in 
Modelsim folgende Fehlermeldung:
# ** Fatal: (vsim-3421) Value 256 is out of range 0 to 255.
process begin
  wait until rising_edge(CLK);
  if (Write='1' and full_loc='0') then
     memory(wrcnt) <= unsigned(Din);
     wrcnt <= wrcnt+1;
  end if;
  if (Read='1') then
     Dout <= std_logic_vector(memory(rdcnt)); -- Adresse getaktet --> BRAM
     rdcnt <= rdcnt+1;
  end if;
  end process;


In der Synthese stellt das Überrollen der Zähler kein Problem dar. Wie 
löst man das Problem für die Simulation?

Matze

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

Bewertung
0 lesenswert
nicht lesenswert
Hmm... böseböse... :-/
Das muß ich mal noch genauer anschauen...

Probiers mal mit einem unsigned als Pointer. Der läuft kostenlos über:
signal wrcnt : unsigned (Addrbreite-1 downto 0) := (others => '0');
signal rdcnt : unsigned (Addrbreite-1 downto 0) := (others => '0');

type speicher is array(0 to (2**Addrbreite)-1) of unsigned(Wortbreite-1 downto 0);
signal memory : speicher;   

begin
  process begin
  wait until rising_edge(CLK);
  if (Write='1' and full_loc='0') then
     memory(to_integer(wrcnt)) <= unsigned(Din);
     wrcnt <= wrcnt+1;
  end if;
  if (Read='1') then
     Dout <= std_logic_vector(memory(to_integer(rdcnt))); -- Adresse getaktet --> BRAM
     rdcnt <= rdcnt+1;
  end if;
  end process;
  Full  <= '1' when rdcnt = wrcnt+1 else '0';
  Empty <= '1' when rdcnt = wrcnt   else '0';
end Behavioral;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wrcnt <= (wrcnt+1) % 2**Addrbreite;
...
rdcnt <= (rdcnt+1) % 2**Addrbreite;
Das sollte den Fehler abwenden. Allerdings könnte es zu ernsten 
(funktionellen) Problemen kommen, wenn die FIFO-Adressen überlaufen...

Duke

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

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Allerdings könnte es zu ernsten (funktionellen) Problemen kommen,
> wenn die FIFO-Adressen überlaufen...
Welche Funktionseinschränkung würdest du da erwarten?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. müsste man sich die folgende Zeile mal genau angucken, ob Full 
immer richtig gesetzt wird:
Full  <= '1' when rdcnt = wrcnt+1 else '0';

Duke

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

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Full  <= '1' when rdcnt = wrcnt+1 else '0';
Hier müsste dann bei integer auf jeden Fall bei (wrcnt+1) auch die 
modulo-Operation mit rein. Wenn der Signaltyp unsigned ist, dürfte 
nichts passieren. Wie auch immer: ich werde mir das Ding nochmal 
vorknüpfen...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also, wie versprochen hier der überarbeitete Code. Einmal mit unsigned 
und einemal mit integer. Beide Beschreibungen verhalten sich in der 
Simulation und auch in der Synthese identisch. Es werden keine Daten 
verloren oder hergezaubert, die Signale Full und Empty kommen immer 
korrekt.
Ich habe zusätzlich zum Code vom ganz oben noch eine "Lesesicherung" 
eingebaut. Jetzt kann bei fälschlichem mehrmaligen Lesen trotz Empty='1' 
der Lesezeiger richtig verwaltet.

Autor: iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frage : schonmal einen ressourcenvergleich gemacht ?

wenn das keine Nachteile hat werde ich demnächst nurnoch eine solche 
Beschreibung benutzen, dann ist man wenigstens von der Technologie 
unabhängig, nicht wie beim coregen.

Autor: Matze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,

die unsigned-Variante sieht nun gut aus in der Simulation!

VG,
Matze

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
>> Frage : schonmal einen ressourcenvergleich gemacht ?
Gegen den Xilinx-Core habe ich noch nicht verglichen, aber die beiden 
Implementierungen (unsigned und integer) brauchen für einen 1k * 8Bit 
Fifo die Ressourcen wie im Screenshot.

> die unsigned-Variante sieht nun gut aus in der Simulation!
Die Integer-Variante laut meiner Simulation auch...

Autor: Matthias Krüßelin (kruessi80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe gerade auch den Fifo eingebaut.
Leider kann ich bei einer Addressbreite von 4
nur 15 statt 16 Einträgen speichern,
bis das Full-Flag kommt.
Ist dies so gewünscht?
Wie könnte man dies verbessern?

Matthias

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

Bewertung
0 lesenswert
nicht lesenswert
Matthias Krüßelin schrieb:
> Leider kann ich bei einer Addressbreite von 4
> nur 15 statt 16 Einträgen speichern,
Korrekt.
> Ist dies so gewünscht?
Es ist toleriert ;-)
Dadurch vereinfacht sich die Verwaltung von Full und Empty eklatant.

> Wie könnte man dies verbessern?
Die Verwaltung des Busy-Flags muß in den Schreib-Pfad des Prozesses mit 
hinein. Damit wird das Setzen und Rücksetzen des Flags aufgeteilt und 
schwieriger zu handhaben.

Und ehrlich: Wenn dein Fifo volläuft, dann kommt es auf 1 Datenwort hin 
oder her auch nicht mehr an  :-o

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man das FIFO komplett ausreizt müsste man bei wr == rd noch testen 
ob das fifo nun voll oder leer ist

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.