mikrocontroller.net

Forum: FPGA, VHDL & Co. Phasendrehung Digital


Autor: Thomas Thomas (warhammerth)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Backbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Thomas (warhammerth)
Datum:

Bewertung
0 lesenswert
nicht 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%...
--------

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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Thomas (warhammerth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Signal ist sinusförmig (mit rauschen). Die Frequenz ist bekannt.

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steuerbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Flint (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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-Tr...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.