Forum: FPGA, VHDL & Co. Frequenzadapter im FPGA


von Frager (Gast)


Lesenswert?

Ich habe folgendes Problem: Ich muss zwei alte Schaltungen teilweise 
digital kombinieren, die nicht auf derselben Frequenzlaufen. Die eine 
Teilschaltung kommt aus einem PLD, das mit 32kHz läuft. Insgesamt werden 
dort von 4 Baugruppen 32 Kanäle auf 8 DA-Wandler ausgegeben. Deren Werte 
laufen durch einen Filter und werden u.a. durch eine andere Schaltung 
einer anderen Baugruppe wieder ausgelesen. Die dortigen Wandler laufen 
aber mit der Abtastfrequenz von 50kHz. Jetzt soll die digitale 
Verarbeitung im FPGA laufen, wobei das Filter sehr einfach ist und nur 
um Spike-Detektion erweitert werden soll.

Die Taktfrequenzen von 32x 32kHz aus dem alten Design, mit denen die 
DACs gesteuert wurden, passen aber nicht zur Abtastung mit 50kHz. Das 
nächste Problem ist, daß die 4 Baugruppen alle unterschiedliche Quarze 
haben und auseinanderlaufen können. Ein einfaches asynchrones Fifo geht 
also nicht.

Ich brauche so eine Art digitale "analoge Schnittstelle", wohin man 
jederzeit einen Wert aktualisieren kann und auch jederzeit lesen kann, 
egal, ob sich die Takte überholen oder weglaufen. Die Taktflanken können 
sich ja auch überschneiden. Das darf kein Problem werden.

Wie macht man das? Wenn ich einfach ein Register mit 16 bit nehme, dann 
kommt es ja gfs zu falschen Samples, denn sich die Takte zu nahme 
kommen.

von Andreas (Gast)


Lesenswert?

Hallo Frager,

wenn Du das was Du vorhast richtig machen willst benötigst Du eine auf 
der Eingangsseite eine SampleRate Conversion.
Das wird dann eine ziemlich aufwendige Geschichte ( auch an Logic).

Du wirst Dir Zwischenwerte interpolieren muessen. Die Tatsache das deine 
DA Strecke mit 50kHz statt mit 32KHz läuft macht den Umstand das deine 
ADs auf- und aneinander herumschweben schon egal.

Wenn Du Dir das ganze ersparen willst und etwas "Hardwareaufwand" nicht 
scheust, dann schau mal bei Cirrus-Logic nach, die haben einige 
Samplerate Converter die im Audio Bereich eingesetzt werden. Denen 
kannst Du einen beliebigen Eingangs- und Ausgangstakt mitgeben...

Gruss

Andreas

von Neo (Gast)


Lesenswert?

Man muss im Prinzip das Rekonstruktionsfilter des DAC digital nachbilden 
und erhält den Analogwert in digitaler Form. Dazu braucht man den 
Sampletakt des eingehenden Signals und einen Systemtakt, mit dem Das 
Filter läuft. Ausgangsseitig macht man dasselbe. Man muss dann einen 
schnellen Zwischentakt einfügen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Ich muss zwei alte Schaltungen teilweise digital kombinieren,
> die nicht auf derselben Frequenzlaufen.
Sind die bisher auch schonmal miteinander gelaufen?
Wie ist denn der Taktdomänenübergang (32kHz --> 50kHz) bisher gelöst?

> Ich brauche so eine Art digitale "analoge Schnittstelle", wohin man
> jederzeit einen Wert aktualisieren kann und auch jederzeit lesen kann,
> egal, ob sich die Takte überholen oder weglaufen.
Du brauchst also eigentlich "nur" ein Register, das von der 50kHz-Seite 
(Ausgabe) gelesen werden kann, und garantiert keine korrupten Daten 
enthält.
Woran erkennst du, dass die Daten auf der 32kHz-Seite gültig sind? Gibt 
es da ein Write- bzw. Strobe-Signal?
Gibt es auf der Ausgabeseite ein Read-Signal das anzeigt, wenn Daten 
geholt werden?
Dann ist es einfach: Nimm ein FPGA mit höherer Taktrate (ist ja nicht 
schwierig z.B. 20MHz) und aktualisiere das Ausgaberegister nur in 
unkritischen Zeitbereichen.

von Frager (Gast)


Lesenswert?

"Du brauchst also eigentlich "nur" ein Register"
Das waere zu einfach. Es soll u.a. die VHDL zweier Baugruppen 
zusammengefasst werden ud der Datenstrom der von den Sendern erzeugt 
wird, direkt - ohne Umwege über die DACs - gemessen werden.

Da an den analogen Zweigen noch die alte Analogware dranhängt, darf 
daran nichts geaendert werden. Ich kriege halt zusaetzlich noch die 
digitalen Rohdaten, die zum DAC gehen. Von den Empfängerbaugruppen wird 
ein Mischsignal gesampelt, welches am Summenpunkt der Sender und der DUT 
abgenommen wird. Das gescchieht rein analog, wobei jederzeit einige 
Empfänger auch in höhre oder geringer Frequenzstufen übergehen koennen.

Da die beiden Schaltungen in der alten VErsion nur analog verkoppelt 
waren, war es Wuscht, ob einer ein paar ns gejittert hat oder die Quarze 
der Sender aus einander liefen, also z.B. 50.500 kHz statt 49,700 - am 
Summenpunkt gab es immer ein analoges Signal zum SAmplen - ohne 
Zeitversatz.

Ich brauche jetzt quasi eine VHDL, die mir aus den 50kHz ein permanentes 
Analogsignal bereitsstellt und wo es zu keinem Abtastproblem kommt.

Wenn ich einfach ein ASYCH Fifo nehme, dann überrennen sich die Takte 
weshalb einer mal aussetzen muss. Das führt zu einem Samplesprung und 
damit einem kurzzeitg konstanten Wert. Das koennen wir nicht gebrauchen.

"Gibt es auf der Ausgabeseite ein Read-Signal das anzeigt, wenn Daten"
"geholt werden?"

Die Analogsummenpunkte koennen zu jedem Zeitpunkt abgetastet werden, 
weil nicht bekannt ist, mit welcher Frequenz die Empfaenger genau 
laufen. Einer kann 30.01 kHu, der andere 29.96 k haben.

"und aktualisiere das Ausgaberegister nur in"
"unkritischen Zeitbereichen."
Genau das macht die Spruenge!

Ich brauche im Prinzip eine Nachbildung des oversampling 
REkonstruktionsfilters des DAC, dessen Ausgang sehr hochfrequent 
abgetastet wird. Dann brauche ich ein Rekonstruktionsfilter welches sich 
auf einen Lesetakt synchronisieren kann.

Also sowas wie: 50kHz auf 200MHz , dann 200 MHz auf 30kHz - bzw einige 
laufen auf 32kHz. Die analoge Grenzfrequenz, mit der die DACs arbeiten 
muessen n sind 20kHz und die ADCs laufen mit 12kHz. Das liegt daran, 
dass an den DAC noch weitere OPs nuckeln, die etwas mehr Bandbreite 
brauchen, als das Kontrollsignal.

Ich muss jetzt also 1 Filter schreiben, das moeglichst schnell getaktet 
werden kann und eingangsseitig mit 50kHz arbeitet und eine GF von 12k 
aufweist. Was nimmt man da fuer ein Filter? Wenn ich Mittelwerte bilde, 
brauche ich fuer 200M auf 12k rund 16000 Werte zum Summieren!!!!!

Das waere dann fein genug, um einen Fifosprung zu verkraften.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Wenn ich Mittelwerte bilde,
> brauche ich fuer 200M auf 12k rund 16000 Werte zum Summieren!!
Da gibt es aber andere Filter, die mit weniger Speicherplatz auskommen. 
Wenn du z.B. sowas wie ein RC-Glied nachbauen willst, brauchst du nur 
einen Summenspeicher. Das wurde hier im Forum bei den uC schon mal 
diskutiert.
Ich schau da schnell mal bei mir selbst vorbei, da finde ich das 
schneller ;-)
http://www.lothar-miller.de/s9y/archives/25-Filter-in-C.html
So ein Filter ist ohne großen Aufwand auch in VDHL zu implementieren.

> Wenn ich Mittelwerte bilde,
> brauche ich fuer 200M auf 12k rund 16000 Werte zum Summieren!!!!!
Sonst solltest du dir evtl. mal FIR-Filter ansehen, dazu brauchst du 
auch nicht derartig viel Speicher.

> 50kHz auf 200MHz
1:4000 --> klares Oversampling  :-/
Das ist m.E. ein recht krasser Zeitsprung. Welche Systemtheorie steckt 
da dahinter?

von Frager (Gast)


Angehängte Dateien:

Lesenswert?

Meinst Du, man kommt mit einem >2 fachen Oversampling aus?
Wenn man das ausganseitig mit einem Wandler macht, agiert der ja auch 
mit 256fachem Oversampling, macht schon mal Faktor 500! Und der hat 
sicher einen analogen Filter drin, der kontinierlich arbeitet, waehrend 
mein FPGA ja rastert, wenn es den Analogwert biltet.

Dein C-Programm hilft mir leider nicht weiter. Auch beim einem 
Summenfilter habe ich ja immer noch das Problem, der Taktflanken: Das 
Problem waere sicher keines, wenn die Takte 100% stabil wären und es nur 
Jitter gäbe. Dann würde eine 5 auf 15 auf 3 Inpolation die 
Taktuebersetzung machen und ein Fifo reichen, um den Jitter zu Puffern. 
Aber das Problem ist, dass die Takte sich überrennen, weswegen Samples 
übersprungen werden meussen und dass muss moeglichst fein passieren.

von Gast (Gast)


Lesenswert?

also vom eingang her braucht man ein downsampling filter von dem 
ausgehend man fuer jede abtastende clock einen upsampling wert 
bereitstellt. die abtastende clock muss dann moeglichst fein 
einsynchronisiert werden und je nach abtastzeitpunkt der zu uebergebende 
wert interpolitiert werden - koennte man die abtastende frequenz nicht 
kontinuierlich messen und passende filterkoeffizienten berechnen, die es 
zulassen, dass nict gleichförmig abgetastet wird?

von Frager (Gast)


Lesenswert?

Mit downsampling komme ich noch klar, aber upsampling?

von A. F. (chefdesigner)


Lesenswert?

Was Du Frequenzadapter nennst, ist meines Erachtens ein simples 
Resamplingfilter. Du must - mit einer möglichst hohen Taktrate - den 
Eingang und den Ausgang absampeln, die Zeitperiode ermitteln und die 
Koeffizienten für die Aktualisierung berechnen und damit den 
Zwischenfilterwert aktualisieren.

von Frager (Gast)


Lesenswert?

Aha. Leider blicke ich immer noch nicht durch. Ich beziehe mich nochmals 
auf das oben gepostete Bild:

Der Eingangstakt beträgt für alle Inputs rund 50kHz, d.h. es kann auch 
etwas mehr sein und Jitter haben. Die Ausgänge brauchen die Daten mit 
ihrem Takt. Auch diese sind nur ungefähr bekannt: 30kHz +/-

Jitter bekäme ich mit FIFOs komplett weg, aber wie man am Bild erkennt, 
holen sich die auslesenden Takte gegenseitig ein - es gibt keinen festen 
Bezug zum Eingang.

Wenn ich (auch mit einem noch so hohen Takt) den Eingang absample auf 
die Grenzfrequenz filtere und bereitstelle, dann bleibt immer noch das 
Problem, wann ich den Wert der Zieldomain übergebe: Ich muss mich ja 
auch auf die 30k synchronisieren und dort gibt es wieder Sprünge , wenn 
man an den Taktflanken angelangt ist.

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
Noch kein Account? Hier anmelden.