mikrocontroller.net

Forum: FPGA, VHDL & Co. Anwendungsgebiete für Schieberegister und FIFO


Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich mache mir gerade Gedanken darüber, wie ich einen "Impulsstrom" am 
Besten in einem PLD verarbeite. Ich bekomme also ständig Samples von 
einem Signal, auf dem Impulse mit unterschiedlichem Abstand auftreten. 
Der Abstand dieser Impulse muss ausgwertet werden. D.H. es müssen 
verschieden Pulsmuster erkannt werden können.

Ich habe mir gedacht, ich lasse die Samples der Reihe nach durch ein 
Schieberegister laufen, und implementiere Parallel dazu meine 
Auswertelogik.

Nun gibt es ja noch die Möglichkeit das Ganze in einen FIFO Speicher 
abzulegen. Dabei "bewegen" sich die Samples ja nicht an meiner 
Auswertelogik vorbei, sondern liegen statisch im Speicher, und werden 
irgendwann überschrieben.
Ich bin mir sicher, dass man mit einem FIFO dem Problem auch zu Leibe 
rücken kann, sehe aber noch nicht genau, ob dies einfacher oder besser 
zu realisieren ist als mit einem Schieberegister.

Könnt ihr mir mal sagen, wann man besser eine Schieberegister und wann 
einen FIFO benutzt? Und natürlich auch warum . . .

Vielen Dank!

Gruß
Maik

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Maik Ritter

>Ich mache mir gerade Gedanken darüber, wie ich einen "Impulsstrom" am
>Besten in einem PLD verarbeite. Ich bekomme also ständig Samples von

>Ich habe mir gedacht, ich lasse die Samples der Reihe nach durch ein
>Schieberegister laufen, und implementiere Parallel dazu meine
>Auswertelogik.

Kann man so machen.

Vorteil : Sehr schnell, weil die gesamte Logik parallel läuft.
Nachteil: Kann sehr viel Ressourcen verbrauchen, wenn ein langes 
Schieberegister und komplexe Auswertefunktionen benötigt werden.

>Nun gibt es ja noch die Möglichkeit das Ganze in einen FIFO Speicher
>abzulegen. Dabei "bewegen" sich die Samples ja nicht an meiner
>Auswertelogik vorbei, sondern liegen statisch im Speicher, und werden
>irgendwann überschrieben.
>Ich bin mir sicher, dass man mit einem FIFO dem Problem auch zu Leibe
>rücken kann, sehe aber noch nicht genau, ob dies einfacher oder besser
>zu realisieren ist als mit einem Schieberegister.

Deine Auswertelogik sitzt am anderen Ende vom FIFO und muss nun 
wortweise die Datenlesen und verarbeiten. Der Vorteil vom FIFO ist, dass 
er Schreib- und Leseseite geschwindigkeitsmässig entkoppelt. Das beste 
Beispiel ist der FIFO der RS232 Schnitstelle im PC. Ohne FIFO müsste die 
CPU jedes Byte einzeln abholen, das sind bei 115200 Baud 11520 
Byte/Sekunde. Der PC müsste alle 86,8us sein Programm unterbrechen und 
einen Interrupt durchführen um das Datenbyte zu holen. Mit Hilfe eines 
FIFOs (ist hier 16 Byte tief) kann er warten bis 16 Byte angekommen sind 
und muss nur noch alle 16*86,8us=1,3ms Daten abholen. Die 
Interruptfreqeunz schinkt auf 1/16!
Das gleiche gilt für einen PLD. Wenn du einn relativ langsamen 
Datenstrom hast, kannst du mit einem hohen PLD-Takt komplexe 
Berechnungen am Ende des FIFO durchführen, während am Eingang die Daten 
langsam aber kontinuierlich aufgezeichnet werden.

>Könnt ihr mir mal sagen, wann man besser eine Schieberegister und wann
>einen FIFO benutzt? Und natürlich auch warum . . .

Das kann man so allgemein kaum beantworten. Lange Schieberegister (> 100 
Bit) lassen sich meist sparsamer mit Hilfe von BlockRAM erzeugen. 
Allerdings hat man dann keinen direkten Zugriff auf die einzelnen Daten, 
die muss man dan wider seqeunziell lesen und verarbeiten.

MFG
Falk

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal was ist der Unterschied zwischen Fifo und Schieberegister?

Beim Schieberegister sind immer gleich viel Daten drin. Beim Fifo sind 
unterschiedlich viele Datendrinnen. Dies verwendet man deswegen dafür um 
verschiedene "Prozesse","Threads","Übertragungen" zu enkoppeln. Mit 
einem Schieberegister ist dies nicht möglich.
Außerdem kann man beim Fifo nur an einem Ende die Daten reinschieben und 
am anderen Ende abholen


Wenn man so wie du eine bereits definierte Datenmenge hat die immer im 
Speicher ist so würde ich ohne zu zögern ein Schieberegister verwenden.
1. Läßt es sich leicher implementieren
2. Braucht es weniger Speicher (sowohl flash als auch ram)
3. Kann der Auswerte-Code leichter drauf zugreifen.


Mal einfach so aus dem Kopf...
#define BREITE  8
uint8_t schieberegister[BREITE];


void reinschieben(uint8_t wert)
{
  uint8_t i;
  for (i=0;i<=BREITE;i++)
    schieberegister[i] = schieberegister[i+1];
  schieberegister[i]=wert;
  return;
}

Mfg
Ulrich

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry dat läßt sich natürlich nur mit dem gcc compilieren, habs erst 
jetzt gesehen dass VHDL besser gewesen wäre ;-)

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk und Ulrich!

Erst mal vielen Dank für eure Antworten!

>Das gleiche gilt für einen PLD. Wenn du einn relativ langsamen
>Datenstrom hast, kannst du mit einem hohen PLD-Takt komplexe
>Berechnungen am Ende des FIFO durchführen, während am Eingang die Daten
>langsam aber kontinuierlich aufgezeichnet werden.

Da mein Datenstrom sehr schnell ist (Pulsbreite < 1µs und Pulsspacing 
maximal 30µs) werde ich wohl ein Schieberegister verwenden.

>Lange Schieberegister (> 100 Bit) lassen sich meist sparsamer mit Hilfe >von 
BlockRAM erzeugen.
>Allerdings hat man dann keinen direkten Zugriff auf die einzelnen Daten,
>die muss man dan wider seqeunziell lesen und verarbeiten.

Hmmm, das ist natürlich doof. Ich habe mir schon den Cyclone II von 
Altera ausgeguckt, weil man da ja den Block RAM zum Schieberegister 
machen kann. Aber wenn man da gar keine parallele Logik dranhängen kann, 
dann habe ich ja auch nix gewonnen, oder?

Gruß
Maik

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Maik Ritter

>Da mein Datenstrom sehr schnell ist (Pulsbreite < 1µs und Pulsspacing
>maximal 30µs) werde ich wohl ein Schieberegister verwenden.

;-)
Das ist schnarchlangsam für einen PLD heutiger Zeit. Mit der richtigen 
Programmierung kannst du den locker mit 100 MHz takten.

>Hmmm, das ist natürlich doof. Ich habe mir schon den Cyclone II von
>Altera ausgeguckt, weil man da ja den Block RAM zum Schieberegister
>machen kann. Aber wenn man da gar keine parallele Logik dranhängen kann,
>dann habe ich ja auch nix gewonnen, oder?

Für diesen Ansatz, nein.

MFG
Falk

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk!

<Für diesen Ansatz, nein.

Wie sind denn die Größenordnungen bei einem ordentlichen PLD (FPGA, 
CPLD), was die realisierbare Schieberegistertiefe betrifft. Mir fehlt da 
ein wenig der Überblick, da ich mich erst seit kurzem mit dem Thema 
beschäftige.
Natürlich muss dann neben dem Schieberegister noch genug Auswertelogik 
implementierbar sein.

Gruß
Maik

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Maik Ritter

>Wie sind denn die Größenordnungen bei einem ordentlichen PLD (FPGA,
>CPLD), was die realisierbare Schieberegistertiefe betrifft.

CPLD bis max. 1024, CPLDs mit mehr Macrozellen gibt es AFAIK nicht.
FPGA einige 1.000 bis 100.000. Schau dir die Datenblätter bei Altera an, 
dort steht wieviel LCs die einzelnen FPGAs haben. Ein LC ist ein 
FlipFlop + LUT (Look Up Table). Damit kannst du ein Bit deines 
Schieberegisters realisieren.

MFG
Falk

Autor: Maik Ritter (kiamur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank noch mal! Jetzt bin ich schon etwas schlauer.

Ein abschließende Frage vielleicht noch:

Welchen Sinn macht denn ein im Block RAM realisertes Schieberegister, 
wenn man nicht direkt (also ohne extra Leseoperation) auf die Bits 
zugreifen kann?

Gruß
Maik

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Maik Ritter

>Welchen Sinn macht denn ein im Block RAM realisertes Schieberegister,
>wenn man nicht direkt (also ohne extra Leseoperation) auf die Bits
>zugreifen kann?

Man kann eine sehr grosse Verzögerung mit wenig Ressourcen aufbauen. Ich 
hab mal in einem Projekt das Gegenteil davon gemacht. Alle BlockRAMs 
waren aufgebraucht, ich brauchte aber ne Verzögerung von ca. 2x 2000 
Takten für ein Datensignal. Dafür sind dann 4000 LCs draufgegangen. So 
what. ;-)

MFG
Falk

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.