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
@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
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...
1 | #define BREITE 8
|
2 | uint8_t schieberegister[BREITE]; |
3 | |
4 | |
5 | void reinschieben(uint8_t wert) |
6 | {
|
7 | uint8_t i; |
8 | for (i=0;i<=BREITE;i++) |
9 | schieberegister[i] = schieberegister[i+1]; |
10 | schieberegister[i]=wert; |
11 | return; |
12 | }
|
Mfg Ulrich
Sorry dat läßt sich natürlich nur mit dem gcc compilieren, habs erst jetzt gesehen dass VHDL besser gewesen wäre ;-)
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
@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
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
@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
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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.