Ich bekomme streaming daten mit einer 50MHz Clock rein (Je ein Datum pro
Clock) und habe nebst den Daten selbst nur die Clock. Diese Daten müssen
auf einen 80MHz DSP übertragen werden. Wie mache ich das ?
Bei einem Datenbus kriege ich das hin, da das OE nach den Adressen und
den DAten kommt und man mindestens einen Clock Zeit hat.
Wenn ich aber hier einfach den Bus absample, kriege ich in seltenen
(aber unweigerlich auftretenden) Fällen einen Aussetzer, da die Daten
gerade nicht stabil sind. Die clock abzusampeln bringt mir auch nichts,
da ich nicht jede Flanke erwische.
Wie mache ich das, Besten ?
@ Fredy (Gast)
>Ich bekomme streaming daten mit einer 50MHz Clock rein (Je ein Datum pro>Clock) und habe nebst den Daten selbst nur die Clock. Diese Daten müssen>auf einen 80MHz DSP übertragen werden. Wie mache ich das ?
<OT>
Du hast DEN Takt!
</OT>
Das Zauberwort heisst asynchroner FIFO.
MfG
Falk
FIFO ist nicht, ich brauche jedes Datum einmal und richtig. Bzw kann ich
mir keine Latenz erlauben. Als FIFO kämen also nur 2 oder 3 Register in
Betracht. Angedacht habe ich das schon, nur wie mache ich das mit den
Zählern? Der eine wird ja vom Schreibtakt getrieben, der andere mit dem
Lesetakt der neuen Domain. Was passiert beim Vergleich der Counter ?
Die beiden Counter kommen aus verschiedenen domain. Wenn ich den
Schreibcounter in der Zieldomain abfrage, kann er instabil sein.
Ging es nicht mit einem Wechselbuffer und einem Mechanismus, der
automtisch den selektiert, der gerade nicht beschrieben wird?
Ich meine mich zu errinnern, daß es auf der Xilinx-Seite mal so eine
Handvoll Tutorials gab, die solche Sonderprobleme behandlete. Es waren 6
Stpck, meine ich. Dort gabe es so einen Konstrukt zum Handling von 2
domain-Takten - ich habe mich eben erfolglos totgesucht.
Jemand ne Idee ?
Fredy wrote:
> FIFO ist nicht, ich brauche jedes Datum einmal und richtig.
mit was fuer komischen FIFOs hast du denn bis jetzt gearbeitet?
> Angedacht habe ich das schon, nur wie mache ich das mit den> Zählern?
Du instanzierst ein FIFO vom FPGA Hersteller, denn darin ist die
Problematik die du beschreibst schon sauber geloest. Dein Interface
sieht etwa so aus wie von Kest beschrieben.
> Ging es nicht mit einem Wechselbuffer und einem Mechanismus, der> automtisch den selektiert, der gerade nicht beschrieben wird?
Im Prinzip ja.
Cheers, Roger
Mach doch ein FIFO, welches aus 2-3 Registern besteht. Es muss ja nicht
gleich riesengroßes sein.
Es gibt auch asynchrone FIFOs als VHDL-Beschreibung. Habe mal verwendet,
aber nicht ausgiebig getestet. Also am besten einfach Coregenerator von
Xilinx oder MegaWizzard von Altera anschmeißen. Viel Erfolg!
Grüße,
Kest
Zwei-drei register? du versuchst doch nicht etwa einen bus synchronizer
zu bauen?! (also zwei register an unterschiedlichen takten miteinander
zu verbinden) Das verfälscht mit Sicherheit das Datum, da müsstest du
eine checksumme zur fehlerkorrektur mitführen undbist immer noch dem
gesetz der Wahrscheinlichkeit ausgeliefert.
Ein kleiner Speicher aus den LUT-speicherzellen (distributetd RAM bei
Xilinx)
als dual-port speicherfeld ist effizienter (1 slice hat 1 FF und 16
Speicherzellen). eventuell müsstest du den Datenstrom in Pakete zerlegen
(per Software).
Wie gesagt Grundprinzip ist ein RAM mit zwei Datenports (dual Port),
eine Fifo ist ein sonderfall davon. Den datenport auf 50 MHz klemmst du
fest auf write = '1', den anderen fest auf read = '1'. an die beiden
adressen kommt jeweils ein counter. der an 50 MHz (writepointer) zählt
bei jedem Takt, der an 80 MHz (readpointer) nur wenn die Differenz
zwischen beiden countern groß genug ist. Vorsicht für die
Differenzbildung mußt du über Taktgrenzen, nimm nur das oberer bit, dann
klappt es mit einem synchronizer. Das wäre dann (wie) ein Wechselbuffer.
das OE setzt du nur wenn der readpointer inkrementiert, sonst hast du
doppelte worte auf dem Bus. ein bißchen Zeitversatz (meinst du das mit
Latenz?) hast du immer.
vielleicht machen sich one hot counter für den Vergleich besser?
Aber wie ein Vorredner erwähnte, da hat coregen bestimmt schon ein
geprüftes Modul dafür?
@ Fredy (Gast)
>FIFO ist nicht, ich brauche jedes Datum einmal und richtig. Bzw kann ich
???
Ein FIFo macht das.
>mir keine Latenz erlauben. Als FIFO kämen also nur 2 oder 3 Register in
Vollkommen ohne Latenz geht es sowieso nicht, da die beiden Takte
asycnhron zueinander sind.
>Betracht. Angedacht habe ich das schon, nur wie mache ich das mit den>Zählern? Der eine wird ja vom Schreibtakt getrieben, der andere mit dem>Lesetakt der neuen Domain. Was passiert beim Vergleich der Counter ?>Die beiden Counter kommen aus verschiedenen domain. Wenn ich den>Schreibcounter in der Zieldomain abfrage, kann er instabil sein.
Um genau dieses Problem zu lösen gibt es ASYNCHRONE FIFOs. Fix und
Fertig gestestet von jedem FPGA HErsteller als
Macro/Core/MegaWizard/Whatever.
>Ging es nicht mit einem Wechselbuffer und einem Mechanismus, der>automtisch den selektiert, der gerade nicht beschrieben wird?
Im Prinzip schon, doch da muss man aufpassen, dass man sich nicht ins
Knie schiesst. Solche Sachen sind anfällig für sporadische Fehler. Da
fehlt dann hin und wieder ein Datum alle paar zehntausend Takte. Man
muss hier WIRKLICH wissen was man tut!
>Stpck, meine ich. Dort gabe es so einen Konstrukt zum Handling von 2>domain-Takten - ich habe mich eben erfolglos totgesucht.http://www.xilinx.com/xlnx/xweb/xil_tx_display.jsp?category=&iLanguageID=1&multPartNum=1&sTechX_ID=pa_clock_bound
MfG
Falk
Vielleicht hätte ich schreiben sollen "fertiges FIFO" ist nicht. Die
FIFOs der Wizzards kenne und nutzeichja , aber ichhabe das Probem, daß
ich aus diversen Gründen die pointer-Vrrwaltung selber machen muss. Es
darf z.B. keinen overrun oder underrun geben, daher muss - weit VOR
Erreichen von buffer full, bzw buffer empty, die datenrate des
Schreibprozesses manipuliert werden. Der Schreibprozess kann NICHT
warten und der Leseprozess ist ebenfalls immer lesewillig.
Mir würde es reichen, wenn ich ein buffer 25% and 75% hätte. Ich werde
jetzt mal probieren, 3 Buffer zu nehmen und zu verketten. Damit wären
die beiden Steuersignale des mittleren buffers in etwa das, was ich
brauche. Allerdings habe ich dann nur jeweils einen Takt / ein Datum
Reserve zum Nachbarpuffer und das wird knapp.
Ich brauche eine saubere Architektur, die mir jedes Datum einzeln per
Handshake auf die andere Seite gibt. Da es vom langsamen in den
schnellen Takt geht, müsste es eigentlich gehen.
Fredy wrote:
> Es darf z.B. keinen overrun oder underrun geben, daher muss - weit VOR> Erreichen von buffer full, bzw buffer empty, die datenrate des> Schreibprozesses manipuliert werden. Der Schreibprozess kann NICHT> warten und der Leseprozess ist ebenfalls immer lesewillig.
da widersprichst du dir aber. Wenn dein Leseprozess immer lesewillig
ist, dann kann es keinen overrun geben.
> Ich brauche eine saubere Architektur, die mir jedes Datum einzeln per> Handshake auf die andere Seite gibt. Da es vom langsamen in den> schnellen Takt geht, müsste es eigentlich gehen.
Es einen anderen aktuellen thread mit aehnlichem Problem
Beitrag "Warnmeldung unter Xilinx"
Cheers, Roger
@ Fredy (Gast)
>ich aus diversen Gründen die pointer-Vrrwaltung selber machen muss. Es
Glaub ich nicht. Nimm einen asynchronen FIFO, um die Daten über die
Taktgrenzen hinweg zu bewegen. Dann kannst du auf der 80 MHz
Empfängerseite alles mögliche machen, und zwar alles mit dem 80 MHz
Takt. Schön synchron.
>darf z.B. keinen overrun oder underrun geben, daher muss - weit VOR
Geht alles spielend mit einem asynchronen FIFO.
>Erreichen von buffer full, bzw buffer empty, die datenrate des>Schreibprozesses manipuliert werden. Der Schreibprozess kann NICHT>warten und der Leseprozess ist ebenfalls immer lesewillig.
Auch alles kein Thema. Ist bissel Steuerlogik um den FIFO rum. Glaub
mir, einen asynchronen FIFO willst du nicht selber machen.
>Ich brauche eine saubere Architektur, die mir jedes Datum einzeln per>Handshake auf die andere Seite gibt. Da es vom langsamen in den
Eben, einen asynchronen FIFO.
>schnellen Takt geht, müsste es eigentlich gehen.
Der "schnelle" Takt ist nichtmal doppelt so schnell. Also alles nicht
wirklich viel Luft.
MfG
Falk
"Glaub ich nicht."
Gute Antwort, wenn man die Aufgabe nicht kennt. Wenn es so einfach wäre,
einfach einen FIFO reinzuschmeissen, bräuchte ich ja GAR NICHTS
programmieren und wäre fertig.
Wir sind leider keinen Schritt weiter: Es bliebe immer noch das Problem
der Pointer-Behandlung und den eintakten geht nicht, da es kein
Bezugsmass gibt. Ich mache es nun so, daß ich den auf Plausibilität
prüfe und so eine zeitlich ungefähre Aussage habe. Reserven dafür habe
ich.
Offen ist nach wie vor die Quelle der angesprochenen Xilinx-Seiten. Ich
habe auch heute wieder mal gesucht und bin nicht fündig geworden.
@ Fredy (Gast)
>Wir sind leider keinen Schritt weiter: Es bliebe immer noch das Problem>der Pointer-Behandlung und den eintakten geht nicht, da es kein>Bezugsmass gibt. Ich mache es nun so, daß ich den auf Plausibilität>prüfe und so eine zeitlich ungefähre Aussage habe. Reserven dafür habe>ich.
Totaler Murks! Du erfindest das Rad neu, aber leider kommt nur ein
Fünfeck raus.
Mir scheint eher, dass du etwas starrsinnig bist und auf eine abstruse
Lösung schon fixiert bist. Na dann mach mal. Viel Erfolg.
>Offen ist nach wie vor die Quelle der angesprochenen Xilinx-Seiten. Ich>habe auch heute wieder mal gesucht und bin nicht fündig geworden.
Meinen Link gelesen? War das der falsche?
MFG
Falk
@Fredy : Hört sich nach einem Problem an, das ich auch gerade habe
>Erreichen von buffer full, bzw buffer empty, die datenrate des>Schreibprozesses manipuliert werden. Der Schreibprozess kann NICHT>warten und der Leseprozess ist ebenfalls immer lesewillig.
Der Schreibprozess MUSS aber warten, wenn Dein Buffer im Begriff ist, zu
voll zu werden (wo auch immer da die Grenze sein mag. Wenn ich das
richtig verstanden habe, willst Du die Datenrate träge nachregeln ?
Im Prinzip gibt es nur zwei Möglichkeiten: Die Takte stehen in einer
festen Beziehung. Dann kannst Du die Zeiger wie jedes andere vom Takt
gegenüber abhängige Signal normal eintakten wie Du willst: Du wirst
immer stabile Werte haben.
Wenn die Takte weglaufen, musst Du die Stabilität an dem letzten sich
änderenden Signal einer Signalgruppe festmachen, also eintakten und
vergleichen. Dann hast Du doch Deinen stabilen Bus / Zeiger, Datenstrom,
oder was auch immer. Kostet maximal 2-3 Takte Latenz.
@ Jürgen ... (engineer)
>Der Schreibprozess MUSS aber warten, wenn Dein Buffer im Begriff ist, zu
Ja, aber das die Quelle nur 50 MHz hat, die Senke aber mit 80 MHz läuft
sollte das kein Thema sein. E sei denn, die Bearbeitung/Abtransport auf
dem 80 MHz Takt sind zu langsam (block weise gesehen).
MFG
Falk