Forum: FPGA, VHDL & Co. IO-Ausgang zeitlich sehr genau positionieren


von Edi M. (Gast)


Lesenswert?

Ich möchte mit einem FPGA einen high speed shutter betätigen, der ein 
Hochfrequenzdesign steuert. Dieses läuft auf> 1GHz und folglich muss der 
Schalter auf ca 0,2 .. 0,3 ns genau schalten. So genau lässt sich das im 
FPGA aber nicht direkt erreichen, weil die Taktfrequenz auf sagen wir 
300 MHz (also Faktor 10 zu grob) limitiert ist. Man müsste es also mit 
den Delays einstellen.

Ich denke, dass es reichen wird, wenn ich mit dem Takt auf die richtige 
Position gehe, also ganzzahlig verzögere, und dann den Rest mit den 
IO-Delays fahre. Welche Massnahmen wären zu ergreifen, um die Synthese 
per Constraints richtig zu steuern, dass bei einem IO-Delay von null 
eine ganz bestimmte Verzögerung durch das Routing erfolgt?

Soweit mir bekannt, kann man das Routingdelay nur nach oben hin 
begrenzen, sodass die Synthese es hinschiebt oder meldet, wenn es nicht 
geklappt hat.

Ich meine, ich müsste das so ähnlich ansetzen, wie man schnelle DDR-Rams 
fährt, sodass die Verzögerungen in einem bestimmten Bereich bleiben und 
dann mit den programmierbaren IO-Delays feintunen.

Wie genau bekommt man das hin?

von Christian R. (supachris)


Lesenswert?

Die Synthese und auch die nachfolgenden Schritte ändern am Delay selber 
erst mal nichts, nur weil du Constraints vorgibst. Da bekommst du am 
Ende nur die Meldung, ob es geklappt hat, oder nicht. Sie optimieren 
aber den Rest auf die Constrints hin. Wenn du ein Output Delay 
einstellen willst, musst du das über die ODELAY Primitive machen. Die 
gibts meines Wissens eh nur in den großen Virtex, ich glaube ab Virtex 
5. Die Spartan haben nur sehr begrenzte Delay Fähigkeiten, Spartan 6 zum 
Beispiel nur mit Ringoszillator, ist temp.- und spannungsabhängig.
Zu was muss das Ausgangssignal überhaupt so genau kommen? Zu einem 
Eingangssignal? Dann hättest du ja noch das vom Routing und den IOB 
Zellen kommende Delay dazu, und das ist im Datenblatt mit Min-Typ-Max 
angegeben, also auch nicht wirklich fix.

von user (Gast)


Lesenswert?

Wäre es nicht auch eine Möglichkeit nen SERDES zu verwenden.
Stratix V FPGAs haben SERDES die bis zu 14GBit/s machen

von Georg A. (Gast)


Lesenswert?

Wenn es um regelmässige Pulse geht und nicht auf eine bestimmte 
Verzögerung aufgrund eines externen Triggers, könnte man das auch mit 
der Phasenjustage der DCMs machen. Damit sollte man so auf einige 10ps 
genau hinkommen.

von Edi M. (Gast)


Lesenswert?

user schrieb:
> Wäre es nicht auch eine Möglichkeit nen SERDES zu verwenden.
Zu wenige Ausgänge mit SERDES -> zu teuer.

Georg A. schrieb:
> Phasenjustage der DCMs machen.
Viel zu wenige Resourcen PLL -> viiiiell zu teuer. :-)

von Falk B. (falk)


Lesenswert?

Piccolo MC von TI, der hat 150ps Zeitauflösung bei den Timern.

von Georg A. (Gast)


Lesenswert?

> Zu wenige Ausgänge mit *

Tja, der Hinweis, wieviele IOs da so geschoben werden müssen, hat in den 
Anforderungen gefehlt...

Es gäbe noch eine quasi-analoge Möglichkeit: Die Ausgänge auf langsame 
Slewrate stellen und über einen DAC+R einen leichten 
Gleichspannungspegel auflegen. Damit kann man die Schaltschwelle eines 
Eingangs durchaus um einige 100ps verschieben. Der DAC kann dabei aus 
einen PWM/PDM/delta-sigma-Block mit Tiefpass aus einem FPGA-IO gemacht 
werden. Die Werte muss man halt probieren... In gewissem Sinne intern 
kalibrieren kann man das dann über ein Readback des Pins selbst, wenn 
man es mit einem per DCM nahe an den Umkipppunkt geschobenen Sampletakt 
vergleicht.

> Piccolo MC von TI, der hat 150ps Zeitauflösung bei den Timern.

Was es alles gibt ;) Aber da passt sicher auch was mit den noch nicht 
erwähnten weiteren Anforderungen zusammen...

von Edi M. (Gast)


Lesenswert?

Ja, das habe ich auch schon gedacht, aber ist zu kompliziert. Ausserdem:

> man es mit einem per DCM
Ich habe kaum DCMs

von Christian R. (supachris)


Lesenswert?

Hm, du hast uns immer noch nicht gesagt, wieviele Ausgänge zu welcher 
"Referenz" so genau positioniert werden sollen und um welches FPGA es 
sich handelt. OSERDES (nicht GTP/GTX...) gibts bei Xilinx übrigens, wenn 
vorhanden an jedem IO, aber die gehen auch nur bis 1GHz oder sowas, also 
nixmit ps-Bereich.

von Georg A. (Gast)


Lesenswert?

>Ja, das habe ich auch schon gedacht, aber ist zu kompliziert. Ausserdem:

Ja mei, wenn du solche Anforderungen (GHz...ps...viele IOs) hast, muss 
man ein paar grössere Geschütze auffahren. Mit einem BC337 wird sich das 
halt nicht lösen lassen. Bauteilemässig wäre die Pegelverschiebung 
jedenfalls günstig (RC-Kleinkram).

>> man es mit einem per DCM
>Ich habe kaum DCMs

Eine reicht für die Kalibrierung.

von J. S. (engineer) Benutzerseite


Lesenswert?

> Es gäbe noch eine quasi-analoge Möglichkeit: Die Ausgänge auf langsame
> Slewrate stellen und über einen DAC+R einen leichten
> Gleichspannungspegel auflegen.
Das ist die genauseste Methode, geht aber noch etwas einfacher und fast 
genau so präzise.

> Damit kann man die Schaltschwelle eines Eingangs durchaus um einige
> 100ps verschieben.
Geht ebenfalls noch eine ganze Ecke genauer. :-)

> Der DAC kann dabei aus einen PWM/PDM/delta-sigma-Block
Und auch das geht noch einfacher, wenn man die PWM nicht einkanalig mit 
nur einem Pin baut.

Ich habe mich im Zuge einer industierellen Entwicklung mit dem Thema mal 
befasst und gefunden, dass man im FPGA mittels IO-Delay unter Umgehung 
von MCMs/DCMs/PLLs auf ungefähr 50ps genau schieben kann. Feiner geht es 
dann nur noch mit dem FPGA-Editor unter Nutzung von existenten 
Chip-Strukturen. Aufgrund von Hersteller-Infos und eigenen Überlegungen 
sind 15ps theoretisch und ca 20ps praktisch möglich - weitgehend 
jitterfrei, wenn man es richtig anfängt. Genauer geht es statisch nur in 
einem ASIC unter Nutzung kalibierter Routing-Delays.

Dynamisch (also mit Kalibierung) liesse sich theoretisch jeder beliebige 
Wert erzielen, wenn man genügend Pins hinzunimmt und ein wenig mit den 
Impulsen trickst. Praktisch kommt man an eine Rausch- und Jittergrenze. 
Ich habe aber eine Schaltungsidee, die nur 2 Out-Pins und einen weiteren 
In-Pin zur Kalibierung benötigt, um auf ca. 1/50 des Taktes zu kommen. 
Das wären bei 300MHz in etwa 30ps. Mit einer zweiten Stufe (mit dann 3+1 
FPGA-Pins) wäre nochmal eine Verfeinerung um Faktor 3-5 drin. Ich denke, 
dass man auf unter 10 ps kommen kann und dies ohne irgendwelche 
IO-Delays, PLLs oder dergleichen. Man braucht nur etwas Vogelfutter. 
Damit wäre jedes PLD nutzbar. Man müste allerdings gut treiben und sehr 
sauber abschließen.

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.