Forum: FPGA, VHDL & Co. Phasendrehung Digital


von Thomas T. (warhammerth)


Lesenswert?

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

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


Lesenswert?

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?

von Matthias G. (mgottke)


Lesenswert?

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.

von Backbert (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von Thomas T. (warhammerth)


Lesenswert?

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.

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


Lesenswert?

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

von Thomas T. (warhammerth)


Lesenswert?

Das Signal ist sinusförmig (mit rauschen). Die Frequenz ist bekannt.

von Marius W. (mw1987)


Lesenswert?

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

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


Lesenswert?

> 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?

von Christian R. (supachris)


Lesenswert?

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....

von Georg A. (Gast)


Lesenswert?

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.

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


Lesenswert?

Ähm...
Im Allgemeinen wird ein FIFO in der Praxis als Ringpuffer ausgeführt.

von Georg A. (Gast)


Lesenswert?

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 ;)

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


Lesenswert?

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... ;-)

von J. S. (engineer) Benutzerseite


Lesenswert?

>Ä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.

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


Lesenswert?

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... ;-)

von Hagen R. (hagen)


Lesenswert?

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

von Steuerbert (Gast)


Lesenswert?

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

von Georg A. (Gast)


Lesenswert?

@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

von Flint (Gast)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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