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.
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
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.
> 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.
"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.
> 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?
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.