Hallo allerseits,
ich habe immer wieder gelesen, dass man in FPGAs keine Delay-lines mit
logischen Zellen aufbauen soll, da viele Einflüsse die Delays
beeinflussen. Intel schreibt explizit:
> Do not use LCELL primitives to create an intentional delay or asynchronous
pulse. The delay of these elements varies with temperature, power supply voltage,
and device fabrication process, so race conditions can occur and create an
unreliable circuit.
Hat dass schonmal jemand getestet? Sind die Abweichungen im 'normalen'
Betrieb wirklich so schlimm? Ich hatte mal einen schnellen Test gemacht,
und die Abweichungen über mehrere Minuten war unterhalb dessen, was ich
messen konnte. Hatte ich da einfach Glück?
Ich würde gerne ein paar Ausgänge um bis 1-2ns (+- 200ps) verzögern, und
frage mich, ob das eine einfache Möglichkeit wäre. Leider habe ich keine
PLLs mehr verfügbar, mit denen das natürlich sauberer wäre.
cell schrieb:> und die Abweichungen über mehrere Minuten war unterhalb dessen
Hast du auch mal mit Föhn und Kältespray draufgehalten?
> Ich würde gerne ein paar Ausgänge um bis 1-2ns (+- 200ps) verzögern
Für ein Einzelstück kann man sich das schon mal hinpfriemeln, aber zu
den bereits von Intel/Altera beschriebenen Effekten kommt noch dazu,
dass du dann eben bei jedem Durchlauf der Toolchain Roulette spielst.
Und ganz spannend wird dann ein Update der Toolchain...
Es ist meistens sehr sinnvoll, Ausgaenge nur aus synchronen Schaltungen
(FD, ODDR, OSERDES u.ae.) zu treiben, da ansonsten interne Zustaende der
LUTs bei einem Zustandsuebergang direkt nach draussen gehen.
Da diese aber synchron sind, kann man danach im Normalfall keine
asynchronen Elemente mehr danach schalten (Ausnahmen: OBUFs. Diese haben
aber pro Pin eine recht konstante Verzoegerung.
ODELAYs waeren genau das was du braeuchtest, diese gibt es bei X
allerdings erst ab Kintex in den HP-Baenken. )
Falls du sowas unbedingt in der Fabric machen willst wuerde ich dringend
empfehlen, hier alles moegliche auch manuell zu platzieren (zumindest
LOC-Constraints), da die Schaltung sonst bei jedem Build anders laeuft.
Kannst du nicht von einer bestehenden PLL noch eine Clock mit
geringfuegig anderer Phase erzeugen, um deine handvoll Signale dann mit
einer zusaetzlichen Flipflop-Stage damit auszugeben? Ich habe meistens
noch 1-2 Abgriffe an den PLLs frei...
cell schrieb:> Ich würde gerne ein paar Ausgänge um bis 1-2ns (+- 200ps) verzögern, und> frage mich, ob das eine einfache Möglichkeit wäre.
dafür gibt es z.B. bei vielen Xilinx-Bausteinen die IODELAYs. Die hängen
zwar eigentlich ebenfalls von Temperatur, Spannung, Prozessfenster ab,
aber bei denen wird über die IODELAYCTRL der korrekte Delaywert jeweils
nachgeregelt (indem die interen Versorgungsspannung so varriert wird,
dass der gewünschte Delaywert genau erreicht wird).
cell schrieb:> Ich würde gerne ein paar Ausgänge um bis 1-2ns (+- 200ps) verzögern, und> frage mich, ob das eine einfache Möglichkeit wäre. Leider habe ich keine> PLLs mehr verfügbar, mit denen das natürlich sauberer wäre.
Das geht locker, in dem Bereich sauen dir externe Parameter nicht rein.
Vermutlich musst du nicht mal manuell plazieren. Ansonsten muss man das
fuer den klassischen TDC-Hack im ps-Bereich. Da findest du einiges
offenes Material im Netz (Stichworte CERN, Szintillationsmessung, TDC).
Nehme mal an, dass du dein FPGA - ich vermute jetzt mal Alterafabrikat -
gut kennst, ebenso deine Tools um die Zellen zu plazieren.
Fitzebutze schrieb:> Das geht locker, in dem Bereich sauen dir externe Parameter nicht rein.
doch das tun sie
und das ist auch nicht nötig weil die ios auf 50ps genau zu trimmen sind
Lothar M. schrieb:> cell schrieb:>> und die Abweichungen über mehrere Minuten war unterhalb dessen> Hast du auch mal mit Föhn und Kältespray draufgehalten?
Naja, das würde ich mal nicht als "normale Betriebsumgebung" bezeichnen.
Falls der FPGA dann natürlich mal in einer heißeren, oder kälteren
Umgebung steckt, kann das natürlich ein Problem sein. Mehr als +- 10°
Temperaturabweichung erwarte ich aber nicht, da müsste ich mal messen ob
das Timing dann mehr als 10% abweicht.
Hannes schrieb:> Kannst du nicht von einer bestehenden PLL noch eine Clock mit> geringfuegig anderer Phase erzeugen, um deine handvoll Signale dann mit> einer zusaetzlichen Flipflop-Stage damit auszugeben? Ich habe meistens> noch 1-2 Abgriffe an den PLLs frei...
Das wäre natürlich schöner, vielleicht sollte ich doch einfach eine
größere Version des FPGAs mit zusätzlichen PLLs nehmen.
Weltbester FPGA-Pongo schrieb im Beitrag #6022019:
> Fitzebutze schrieb:>> Das geht locker, in dem Bereich sauen dir externe Parameter nicht rein.> doch das tun sie>> und das ist auch nicht nötig weil die ios auf 50ps genau zu trimmen sind
Ich verstehe leider nicht, was Du damit meinst.
Hannes schrieb:> Es ist meistens sehr sinnvoll, Ausgaenge nur aus synchronen Schaltungen> (FD, ODDR, OSERDES u.ae.) zu treiben, da ansonsten interne Zustaende der> LUTs bei einem Zustandsuebergang direkt nach draussen gehen.
Das sollte doch kein Problem sein, wenn man zwischen Ausgang und
synchronem Flipflop nur z.B. eine carry-chain ohne komplexe LUTs hat,
oder?
Fitzebutze schrieb:> Da findest du einiges> offenes Material im Netz (Stichworte CERN, Szintillationsmessung, TDC).> Nehme mal an, dass du dein FPGA - ich vermute jetzt mal Alterafabrikat -> gut kennst, ebenso deine Tools um die Zellen zu plazieren.
Genau weil dort mit solchen Methoden gearbeitet wird, hatte ich hier die
Frage gestellt. Ich war mir jetzt unsicher ob man Intels explizite
Warnung unter gewissen Umständen misachten kann.
Klar kann man nur muss dir bewusst sein das es auch nach hinten losgehen
kann wenn durch Temperatur und andere Einflüsse das Timing um die Ohren
fliegt.
Ich hatte zu letzt ein ähnliches Problem.
5V TTL Gatter mußten ersetzt werden und das delay der zwei Buffer auf
bzw von 3.3V waren zu langsam um den Takt der vorher über ein Buffer
lief zu invertieren. Die PLL kahm nicht mit den 5MHz zurecht und ich
habe den Takt dann über interne Lut's um 360 Grad minus 8ns verschoben.
Da der vorherige line Driver als Inverter genutzt schon ein großes
Fenster hatte was das Timing angeht hatte es funktioniert.
Wenn es bei dir um +/-200ps geht musst du schon schauen welche Gatter
Laufzeiten dein FPGA hat. Der Spartan 7 hat bei einer LUT etwas über
250ps plus die Verbindungslänge an Laufzeit. Wenn du alle Toleranzen
einrechnest und in deiner Toleranz bleibst Why not?