Hallo, weis evtl. jemand wie man mit VHDL ein Signal um 90° phasenverschieben kann? Die Frequenz des Signals liegt zwischen 20khz und 100khz und wird mit 100mhz abgetastet. Ich weis, dass ich dies mit einem fifo machen kann (da ich die frequenz exakt weiß) allerdings wird dieses sehr groß. gibt es eine andere möglichkeit? es muss ja sicher eine mathematische lösung geben? Habe ISE 11.5 und einen Virtex 4 LX 60
Thomas Thomas schrieb: > Hallo, weis evtl. jemand wie man mit VHDL ein Signal um 90° > phasenverschieben kann? Mit dem Sprachumfang von VHDL ist das eigentlich ganz einfach, wenn es aber synthetisiert werden soll, wird es deutlich komplizierter. Da muß dann erst mal die Frage beantwortet werden: Was ist das für ein Signal? Analog? Digital? Wie schnell ändert sich die Frequenz? > es muss ja sicher eine mathematische lösung geben? Bei einem digitalen Signal kann man eigentlich nicht von einer Phasenverschiebung reden, denn da sind ja etliche Frequenzen versteckt. Und welche davon soll wie verschoben werden? Bei so einem Signal kann es sich also nur um eine Zeitverschiebung handeln. Und da stellt sich mir gleich die Frage: wie genau muß die "Phasenverschiebung" sein? Müssen das genau 90,000° sein, oder dürfen das evtl. sogar 89° oder 91° sein? Bzw. Bezogen auf 20kHz: müssen das genau 12,5us sein? > gibt es eine andere möglichkeit? Wenn es ein rein digitales Rechtecksignal ist, dann muß zuerst mal die Periodendauer ermittelt werden. Und dann ist für ein einzelnes Signal nur noch ein Schieberegister nötig, das an der richtigen Stelle einen Abgriff hat. Dieser Abgriff wird dann passend zur nötigen Auflösung und Abtastfrequenz berechnet. Bei 100MHz und 12,5us müsste das dann 1250 Bits lang sein, deshalb meine Frage, wie genau die Auflösung sein muss... Insgesamt sind für eine sinnvolle Aussage noch einige Fragen offen... Die Hauptfrage (nach den oben bereits gestellten) ist: Wofür brauchst du das?
Ich gehe jetzt einfach mal davon aus, dass es sich bei der "Phasenschiebung" um ein Delay handelt, welches mit 100MHz (nicht 100mHz) abgetastet wird. Dann könnte man bei einer Phasenlage <180° auch mit einem Timer (Zähler) arbeiten, der nur die Flanke auswertet und diese dann mit dem eingestellten Delay ausgibt. Genauigkeit: Bei 100MHz Samplerate sind dann entsprechend 10ns Schritte möglich.
Thomas Thomas schrieb: > Hallo, weis evtl. jemand wie man mit VHDL ein Signal um 90° > phasenverschieben kann? > Die Frequenz des Signals liegt zwischen 20khz und 100khz und wird mit > 100mhz abgetastet. > Ich weis, dass ich dies mit einem fifo machen kann (da ich die frequenz > exakt weiß) allerdings wird dieses sehr groß. gibt es eine andere > möglichkeit? es muss ja sicher eine mathematische lösung geben? > > Habe ISE 11.5 und einen Virtex 4 LX 60 Naja, was heißt hier sehr groß? ein viertel der Periodenlänge bei 20kHz sind 12,5us und dafür brauchst du einen Speicher von 1250Samples ... Wüsste jetzt nicht, was da daran "sehr groß" sein soll - vor allem für einen Virtex 4 ... Grüße, Backbert
Naja, ich würde die Periodendauer mit einem Zähler ermitteln, und das Signal dann mit ein paar anderen Zählern "nachbauen" und entsprechend auf das Eingangssignal synchronisieren. Vor allem, wenn es nur ein einziges Signal ist, wäre ein FIFO wohl etwas Overkill.
Ok das Signal ist ein analoges Signal. Die frequenz dabei kann variieren, list aber meist so zwischen 20 und 100khz. Die Abtastfrequenz ist 100Mhz (also 100MSPS). Die mache ich mit dem P240 Analog Board. -------- http://www.em.avnet.com/evk/home/0,1707,RID%253D0%2526CID%253D29162%2526CCD%253DUSA%2526SID%253D32214%2526DID%253DDF2%2526LID%253D32232%2526PRT%253D0%2526PVW%253D%2526BID%253DDF2%2526CTP%253DEVK,00.html -------- dieses da! Wofür ich das brauche: In unserem Fachgebiet arbeiten wir zur zeit an einem Rasterkraftmikroskop auf FPGA Basis. Dafür wollen wir eine Qcontroll bauen. Ist etwas kompliziert zu beschreiben, aber hier kann man genaueres nachlesen: http://www.imm.cnm.csic.es/spm/Articulos/APL8226.pdf die Phasenverschiebung kann auch variieren, sollte evtl einstellbar sein.
Thomas Thomas schrieb: > Ok das Signal ist ein analoges Signal. Leute, das war mein Verdacht... ;-) Ok, weiter mit der Salamitaktik: hat das analoge Signal irgendeine definierte Signalform (Dreieck, Sinus...)? Oder ist das ein "zufälliges" Signal? > Ist etwas kompliziert zu beschreiben, aber hier kann man genaueres > nachlesen: ... Ähm, soooooo genau wollte ich das nun gar nicht wissen... 8-o
Wenn das Signal quasi ein reiner Sinus ist, dann sollte es doch ebenfalls ausreichen das Signal um ein paar Takte zu verzögern. Für eine Frequenz ist dann die Phasenverschiebung festgelegt. Andere Frequenz heißt dann aber auch andere Phasenverschiebung. MfG Marius
> Das Signal ist sinusförmig (mit rauschen). Aber es ändert sich die Amplitude? Und in der Amplitude steckt Information? > Die Frequenz ist bekannt. Ist die Frequenz bekannt und konstant? Jetzt ist da noch die Frage nach der nötigen Genauigkeit der Zeitverschiebung... Muss das Signal mit 100MHz abgetastet und wieder ausgegeben werden?
Also wenn das Signal an einem ADC so wieder ausgegeben werden soll, wie es rein kam, aber halt mit Phasendrehung, würd ich dann halt die FIFO-Lösung implementieren. So ein Virtex hat ja genug, man muss nur die Verschaltung geschickt machen....über den Füllstands-Ausgang oder halt einstellbare Partial Full oder so....
Warum eigentlich FIFO? Was gebraucht wird, ist doch nur ein langweiliger Ringbuffer, dessen Lesezeiger=Schreibzeiger-x ist. Sicher, wenn man x online verändert, kracht's etwas, aber das passiert nur beim Setup der 90Grad. Mit Blockrams sollte das doch bequem in einer Handvoll Zeilen zu machen sein.
Ähm... Im Allgemeinen wird ein FIFO in der Praxis als Ringpuffer ausgeführt.
Aber hier braucht es keine zwei unabhängigen Zeiger mit Full/empty/Füllstand-Kram. Die Daten selbst landen in einem ringförmig (modulo) organisierten Speicher, das ist aber auch alles. wr_addr<=wr_addr+1; rd_addr<=wr_addr-delay; Das kann man doch nicht mehr guten Gewissens als FIFO bezeichnen ;)
Naja, ein FILO oder ein LIFO ist es nicht.
First In First Out gilt zwingend auch beim Ringpuffer...
Dass der nie "leer" wird, ist nur eine Randerscheinung.
> Das kann man doch nicht mehr guten Gewissens als FIFO bezeichnen ;)
Da habe ich kein schlechtes Gewissen... ;-)
>Ähm... >Im Allgemeinen wird ein FIFO in der Praxis als Ringpuffer ausgeführt. Ja, aber hier braucht es wirklich nur die Funktion "Ringpuffer" und der ist ja noch lange kein FiFo. :-) Es kracht übrigens nichts unbedingt, wenn man das Delay on-the-fly ändert. Im Gegenteil: Das dürfte wahrscheinlich die gewollte Funktion sein, nehme ich an.
Juergen S. schrieb: > Ja, aber hier braucht es wirklich nur die Funktion "Ringpuffer" und der > ist ja noch lange kein FiFo. Ja, weil da fehlt ja das Empty- und das Full-Signal. Dann noch das Almost-Full-Signal und ein Half-Full-Signal. Und für einen richtigen FIFO zwingend nötig ist auch ein Nearly-Almost-Empty- und ein Less-Then-Three-Quarters-But-More-Than-One-Third-Full-Signal... ;-)
Menschen sind Zweibeiner und so sind Ringbuffer eben FIFOs. Schau dir die einfachste Definition eines FIFOs im Vergleich zu FILO,LIFO an und du wirst sehen das ein Ringbuffer alle Merkmale eines FIFOs hat. Im Rahmen der Definition eines FIFOs, und da gehört eben nicht dazu das man bei den meisten FIFOs die Daten asynchron schreiben und lesen kann, sondern nur die Frage der Reihenfolge wie man den Buffer am Input füllt und Output liest, ist der Ringbuffer eben auch eine spezialisierte Form eines FIFOs. Gruß Hagen
Mei ... Es ist einfach nur ein Schieberegister mit 1250 Samples ... Und das Schieberegister kann man bequemst in einen BRAM implementieren. Man muss es nicht unnötig verwirrender machen als notwendig ;-) Grüße, Steuerbert
@Jürgen: > Es kracht übrigens nichts unbedingt, wenn man das Delay on-the-fly > ändert. Ich meinte das Krachen nicht funktionell ala Absturz, sondern wegen den Sprüngen im Ausgangsignal. Wollte man es sauberer machen, dürfte man das Delay höchstens alle zwei Takte um ein Sample verschieben. @Hagen: Ich sehs andersrum ;) Das FIFO hat mit den WR/RD-Zeigern und evtl. Hilfssignalen deutlich mehr an Spezifikation nötig als der nackte Ringbuffer. Das Ring heisst ja nur, dass die Zeiger modulo sind. Ob und wie die sich weiterbewegen, muss dann noch näher bestimmt werden. Delaylines wären mit konstantem Versatz, Echos wäre Auslesen mehrerer Werte an unterschiedlichen Stellen, aber konstantem Versatz zum WR-Zeiger, FIFO hat dynamische Elastizität zwischen WR und RD, etc. @Steuerbert: Man könnte die Phasendrehung auch über ein Hilbert-Filter machen, dann müsste man in einem bestimmten Frequenzbereich gar nichts mehr von Hand einstellen :P
Hallo, ich habe jetzt nur die ersten 20 Zeilen von dem verlinkten pdf gelesen, aber da stand was von 90° Phasendrehung, also nehme ich an, es geht eben darum, das AFM-Signal rückzuführen. Eventuell könnte man eine digitale PLL verwenden, um die Frequenz im FPGA zu reproduzieren, aber ich habe da keine Erfahrung, wie man eine Phasendrehung damit macht. lg Flint
Es kommt auch drauf an, ob das ursprüngliche Signal gegenüber dem verzögerten gebraucht wird, oder ob es zwei Filter sein dürfen, an deren Ausgängen eine Phasenverschiebung von 90 Grad gegeneinander besteht. Das heißt üblicherweise Hilbert-Transformation, wie schon genannt. Mit FIR-Filtern kann das eine Filter aus einer reinen Zeitverzögerung bestehen. Hilbert-Trafo als IIR-Filter habe ich hier mal beschrieben: http://www.mikrocontroller.net/articles/Hilbert-Transformator_%28Phasenschieber%29_mit_ATmega
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.