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?
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.
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.
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. :-)
> 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...
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.
>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.
> 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.