Forum: FPGA, VHDL & Co. Time to digital Converter (TDC)


von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

Hallo,
es gibt zwar schon einige Threads zu dem Thema hier und im Internet zur 
Realisierung eines TDC( Time to digital Converter) in einem FPGA.

Ich versuche gerade das Problem nicht über eine "carry chain" wie üblich 
sondern über die (temperaturkompensierte) IDELAY2 Primitive und einem 
Zynq und 200Mhz (78ps Auflösung) Referenzfrequenz zu lösen. Was anderes 
habe ich nicht.

Ich habe 32 IDELAY2 parallel geschaltet und die jeweiligen Anzapfung auf 
0,1,2 usw gesetzt. Ein Startereignis geht gleichzeitig auf alle Eingänge 
der Verzögerungsleitungen und die nächste Flanke meines Referenzclocks 
speichert die 32 Anzapfungen.

Wie man auf den Bildern sieht ist alles im IO Bereich geroutet nur die 
Dekodierung der 32 Tabsignale in ein 5 Bit Ausgangssignal nicht.

Jetzt meine Frage an die Spezialisten.

Auf dem linken Teil ist das Speichersignal RefClk über ein lokales 
ClockNet geroutet und im Report ist ein Skew von 22ps angegeben.
Das Startereignis lässt sich leider nicht auch auf einen lokale Clock 
Resource routen, weil das die IDELAY Eingänge nicht können.
Wie kann ich max. die Laufzeitdifferenz der 32 auf dem rechten Bild 
verdrahteten Signale bekommen.

Oder noch besser wäre die Laufzeitdifferenz zwischen RefClk und Start zu 
jeder einzelnen Zellen.

Das ganze ist mit PlanAhead 14.7 erstellt.

von Michael (Gast)


Lesenswert?

Hallo das Projekt sieht gut aus. Ist es vielleicht besser die ideales 
weiter vom Pin weg zu nutzen? Da dürfen die Delays ähnlicher sein. 
Vielleicht geht auch ein constrain für das Skew (Data zu clock)und dann 
automatisch platzieren zu lassen.

Michael

von Hans-Georg L. (h-g-l)


Lesenswert?

Michael schrieb:
> Hallo das Projekt sieht gut aus. Ist es vielleicht besser die ideales
> weiter vom Pin weg zu nutzen? Da dürfen die Delays ähnlicher sein.
> Vielleicht geht auch ein constrain für das Skew (Data zu clock)und dann
> automatisch platzieren zu lassen.
>
> Michael

Hallo Michael,

was meinst du mit weiter weg vom Pin ? IDELAY2 und das dazugehörige FF 
(ILOGIC) sitzen im IOB. Eine kürzere Verbindung gibt es nicht und die 
ist für alle 32 Zellen gleich.

Aber ich sehe gerade es gibt noch ein anderes Problemchen ;)
setup/hold vom FF = 0.02/0.33ns. Da muss ich den Router irgendwie dazu 
bringen ein ILOGICE3 mit aktiviertem ZHOLD_DELAY zu erzeugen.

Das Startsignal ist ja asynchron und rauscht in 78ps Schritten durch die 
Delays und ich will wissen, wo es sich zum Zeitpunkt der Anstiegsflanke 
meines Referenzsignal befindet. Wenn es mal auf '1' ist bleibt es auch 
aber ein 0-> 1 Wechsel kann jederzeit passieren. Mit den 20ps setup Time 
muss ich leben, aber eine Hold Time von 330ps wäre viel zu lang.

PS.
ich frag hier so dumm weil das für mich komplettes Neuland ist. Ich habe 
mit VHDL +FPGA bisher nur privat und unkomliziertem Timing gearbeitet.
Hauptberuflich habe ich:
Hardwareentwicklung (TTL,CMOS) -> Softwareentwicklung -> 
Systementwicklung -> Rentner. Und jetzt darf ich machen was ich will ;)

von Michael (Gast)


Lesenswert?

Wenn die FF weiter weg sind ist es einfacher gleich lange Wege zu 
finden.

Michael

von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

Michael schrieb:
> Wenn die FF weiter weg sind ist es einfacher gleich lange Wege zu
> finden.
>
> Michael

Hallo Michael,
Ich gehe davon aus, das die IOB geometrisch identisch sind und der 
Router da keine Möglichkeit hat einen IOB intern anders zu verdrahten.

von Hans-Georg L. (h-g-l)


Lesenswert?

So jetzt habe ich mal verschiedene Varianten durchprobiert.

Der Ausgang der Delay Lines wird bei allen Varianten über die 
Anstiegsflanke eines BUFIO direkt vom IDELAY2 ind ein 
FF(ILOGIC)gesampled.

Für die Eingänge der Delay Lines habe ich folgende Varianten probiert.
( Alle delay Lines stehen auf 0 !)

a.) Lass das mal den Router machen.
b.) StartDelay über Inverter weit weg von den Delay Eingängen gelegt.
c.) StartDelay an der Bank gegenüber angeschlossen.
d.) Die Die 32 StartDelay direkt über PAD an IDELAY2.

Aber irgendwie habe ich Probleme mit dem interpretieren der TRC Reports.

NET OFFSET = IN 50 ps VALID 0.8 ns BEFORE "ref_clk" RISING; ergibt bei 
Variante d:)

      Slack  Total-Delay
Setup  0,23     0,80
Hold  -1,08     2,03

Wenn alle Ausgaben im Report in ns sind würde ich das folgendermassen 
interpretieren:

Das Signal braucht vom PAD bis zum FF, das durch ref_clk getaktet wird, 
0,8ns und du hast als Setup noch 0,23 ns Reserve -> PASS.

Beim Hold würde es plötzlich 2,03 ns laufen und müsste noch für 1,08 ns 
anstehen bleiben -> deshalb FAIL

Kommen die Laufzeit Differenzen durch verschiedes Zeitverhalten der 
Anstiegs und Abstiegsflanken im Signalweg ?

Wo sind da meine 50ps ?

Oder liege ich völlig falsch ?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> Hauptberuflich habe ich:
> Hardwareentwicklung (TTL,CMOS) -> Softwareentwicklung ->
> Systementwicklung -> Rentner. Und jetzt darf ich machen was ich will ;)

So einen rüstiger Rentner.

Die delays über  LUTs?  Ist das Temp Risiko dir zu hoch?

von Hans-Georg L. (h-g-l)


Lesenswert?

René D. schrieb:
> Die delays über  LUTs?  Ist das Temp Risiko dir zu hoch?

nicht über Luts sondern über die temperaturkompensierten delay lines in 
den IO-Blocks. Da steht im Datenblatt, bei 200Mhz Referenzfrequenz, 78ps 
+/- 5ps für ein TAP und dadurch erhoffe ich mir eine bessere 
diferenzielle Linearität und ein besseres Temperaturverhalten wie über 
LUT oder Carry Chain.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Das Idelay ist für das Ausgleichen von Laufzeiten von parallelen Daten 
gedacht.
Da ich ausgehe, dass du hier ein Pulscatcher bauen willst.
Habe ich eine Frage.

du must von einem Pin über verschiedene IDelays zu den Flip flops.

Pin-> idelay-> FF
   -> idelay-> FF
   -> idelay-> FF

Ist so ein Routing überhaupt möglich? Ich würde einen Fehler von der 
Synthese erwarten.

von Ideengeber (Gast)


Lesenswert?

Hans-Georg L. schrieb:
> Da steht im Datenblatt, bei 200Mhz Referenzfrequenz, 78ps
> +/- 5ps für ein TAP und dadurch erhoffe ich mir eine bessere
> diferenzielle Linearität und ein besseres Temperaturverhalten wie über
> LUT oder Carry Chain.

Hallo Hans-Georg,

diese Linearität wirst Du nicht bekommen. Diese 78ps(+-2ps) gelten für 
den Durchschnitt, d.h. nur im Mittel (über 5-10 Taps) kann man von 78ps 
ausgehen. Die Streuung der einzelnen IDelays ist aber beträchtlich 
(22-107ps), zumindest beim Virtex4.
Die Jitter-Werte verschlechtern sich von Tap zu Tap. Sie sind abhängig 
vom Bit-Pattern. Die Verschlechterung ist linear.

Ich hatte mal auf Basis der IDelays ein TDR-Messgerät gebaut. Das hat im 
cm-Bereich gut funktioniert, allerdings waren die Messkurven wegen der 
Nichtlinearität der IDeleays kaum brauchbar.

Der Virtex4 hatte 63Taps zur Verfügung, bei späteren FPGAs sind es nur 
noch 16 Taps. Der Jitter war bei Nicht-Clock-Signalen einfach zu groß. 
Zumindest aus Sicht von Xilinx.

Hackst Du die Plazierung im FPGA-Editor zusammen oder läßt Du das von 
ISE/Vivado machen?

Gruß,

von Hans-Georg L. (h-g-l)


Lesenswert?

IDELAY2 lässt sich am Eingang auf einen Pin oder in die "fabric" routen.
Da hast die Möglichkeit entweder alle 32 Pins extern zu verbinden oder
1 Pin in die "fabric" und von dort auf die 32 IDELAYS zu verteilen.

von Hans-Georg L. (h-g-l)


Lesenswert?

Ideengeber schrieb:
>
> diese Linearität wirst Du nicht bekommen. Diese 78ps(+-2ps) gelten für
> den Durchschnitt, d.h. nur im Mittel (über 5-10 Taps) kann man von 78ps
> ausgehen. Die Streuung der einzelnen IDelays ist aber beträchtlich
> (22-107ps), zumindest beim Virtex4.
> Ich hatte mal auf Basis der IDelays ein TDR-Messgerät gebaut. Das hat im
> cm-Bereich gut funktioniert, allerdings waren die Messkurven wegen der
> Nichtlinearität der IDeleays kaum brauchbar.

Ich würde mir eine Auflösung von 100ps wünschen und die möglichst genau.

> Der Virtex4 hatte 63Taps zur Verfügung, bei späteren FPGAs sind es nur
> noch 16 Taps. Der Jitter war bei Nicht-Clock-Signalen einfach zu groß.
> Zumindest aus Sicht von Xilinx.

Vielleicht hat Xilinx in der Zwischezeit ja was dazu gelernt beim ARTIX 
(ZYNQ) sind es wieder 32 TAP.

> Hackst Du die Plazierung im FPGA-Editor zusammen oder läßt Du das von
> ISE/Vivado machen?

Teilweise ..
Ich habe mit der Hand die 32 IOB symetrisch, in 2 Gruppen, um den 
sample-clk Treiber, der die Delay im IOB FF speichert, plaziert. Dadurch 
habe ich ein Skew im clk von 59ps.

Jetzt habe ich erst mal die externe Parallelschaltung, der 
IDELAY-Eingänge probiert und komme da auf Laufzeitdifferenzen von 250ps. 
Die Differenzen kommen hauptsächlich von den PIN->IOB Verbindungen. 
Theoretisch könnte man jetzt auch die FFs in den Gruppen hin und 
herschieben und die externe Verbindung optimieren aber das nützt mir 
alles nix ich habe ein fertiges Board.

Die nächsten Variante lass ich mal vom Router machen mit Vorgaben über 
Constrains.

von Duke Scarring (Gast)


Lesenswert?

Hans-Georg L. schrieb:
> Die nächsten Variante lass ich mal vom Router machen mit Vorgaben über
> Constrains.
Das wird nicht wirklich funktionieren. Die Reihenfolge ist die:
1. der Router routet
2. die STA prüft die Constraints

Du kannst Placement-Constraints vergeben, die werden vom Router (bzw. 
vom Placer) beachtet.

Duke

von Uwe Bonnes (Gast)


Lesenswert?

Vielleicht hilft https://github.com/jobisoft/jTDC weiter?

Eigentlich fuer die ELB (http://www.elbonn.de/cms/) VME Boards gedacht, 
der TDC sollte aber auch anders nutzbar sein.

von Hans-Georg L. (h-g-l)


Lesenswert?

Uwe Bonnes schrieb:
> Vielleicht hilft https://github.com/jobisoft/jTDC weiter?
>
> Eigentlich fuer die ELB (http://www.elbonn.de/cms/) VME Boards gedacht,
> der TDC sollte aber auch anders nutzbar sein.

Zitat: To obtain a resolution higher than the 5ns from sampling with the 
system clock, the jTDC implements the tapped-delay-line method using 
carry chains.

Genau das wollte ich ja nicht und das ganze ist in Verilog und da bin 
ich im Moment zu faul das auch noch zu lernen ;)

Mit den Carry Chains gibts schon ein ein paar Projekte aber da muss man 
immer aufpassen weil sich die Carry Chains im Laufe der Geschichte bei 
Xilinx geändert haben und das nicht unbedingt übertragbar auf eine 
andere (Xilinx) FPGA Familie ist.

von Duke Scarring (Gast)


Lesenswert?

Ich glaube viele Leute brauchen TDC mit vielen Kanälen. Da bietet sich 
die Carry-Chain-Methode an.
Wenn ich Dich richtig verstanden habe, willst Du ja Dein Signal (intern 
oder extern) auf mehrere IDelays verteilen, d.h. Du bist auf sehr wenige 
Kanäle beschränkt.

Duke

von Hans-Georg L. (h-g-l)


Lesenswert?

Duke Scarring schrieb:
> Ich glaube viele Leute brauchen TDC mit vielen Kanälen. Da bietet sich
> die Carry-Chain-Methode an.

Full Ack.

> Wenn ich Dich richtig verstanden habe, willst Du ja Dein Signal (intern
> oder extern) auf mehrere IDelays verteilen, d.h. Du bist auf sehr wenige
> Kanäle beschränkt.
>
Leider kommt man nur an ein IDelay TAB gleichzeitig und deshalb muss ich 
für 32 Delays auch 32 IOB verbraten.
Also unbrauchbar für die reale Welt, aber ich lern was dazu ;).

Meine erste "geniale" Idee einer "self-clocked-delay" hat leider einen 
kleinen Haken, denn dazu müsste der Clock Eingang vom IDELAY bei 78ps 
einen Takt von 13GHz vertragen und er kann nur 800Mhz. Aber zum 
dekodieren bräuchte ich nur die Stellung des MUX auslesen und alles 
würde in 1 IOB passen.

Der Grund warum ich das mit den IDelay und nicht mit den CarryChains 
probiere war die automatische interne calibrierung der IDelays.

Ich könnte natürlich auch den Refclock durch die Idelay jagen und die 32 
Phasenverschobenen Signale in die "fabric" routen. Aber da frage ich 
mich ob ich mir da nicht wieder die Temperaturabhängigkeit einfange, 
weil ja nur die IOB compensiert werden.

Hier noch ein Link wo die Calibrierung beschrieben ist:
http://www.xilinx.com/support/documentation/application_notes/xapp707.pdf

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Hans-Georg L. schrieb:
> Aber da frage ich
> mich ob ich mir da nicht wieder die Temperaturabhängigkeit einfange,
> weil ja nur die IOB compensiert werden.

Ja, habe das mal bei Altera Stratix GX gemacht. Das muss permanent in 
einer Regelschleife kalibriert werden, will man interne Delays als 
Präzisionsschieber nutzen. Bei Xilinx wird es nicht anders sein :-)

Eine Möglichkeit, den Kalibrationsaufwand in Grenzen zu halten, wäre, 
die FPGAs auf konstanter Wärme (-> Leistungsregelung) zu halten. Das 
kann der FPGA auch selber tun, indem er den Drift an einigen Stellen mit 
geeigneten Strujturen misst und dann seine eigene Leistung regelt. 
(Verbaucherschaltung mit Taktabschaltung).

Das muss auch Zehntel-Grad genau gemacht werden.

Meistens braucht es noch Kühltechnik von Außen, um das Umfeld des FPGAs 
temperaturstabil zu halten.

Das alles ist aber ziemlich müßig, weil FPGAs für solche Sachen nicht so 
wirklich gut geeignet sind. Da gibt es antsprechende ASICS.

von Hans-Georg L. (h-g-l)


Lesenswert?

Jürgen S. schrieb:
> Hans-Georg L. schrieb:
>> Aber da frage ich
>> mich ob ich mir da nicht wieder die Temperaturabhängigkeit einfange,
>> weil ja nur die IOB compensiert werden.
>
> Ja, habe das mal bei Altera Stratix GX gemacht. Das muss permanent in
> einer Regelschleife kalibriert werden, will man interne Delays als
> Präzisionsschieber nutzen. Bei Xilinx wird es nicht anders sein :-)
>

Genau das ist ja bei den Artix schon eingebaut aber nur für die Delays 
der Ein und Ausgänge und mit diesem Feature wollte ich mal sehen wie 
weit ich komme.
Bei einer Zeitmessung brauchst du das aber auch noch für Start und 
Stopsignal. Das wären schon 64 IO verbraten für einen Kanal und das ist 
für mehrere Kanäle in der Praxis nicht brauchbar.

Aber ich habe dabei viel über IO-Struktur, clocking Resourcen und wie 
man interne "Verdrahtung" beinflussen oder direkt editieren kann 
gelernt.

Für Frequenzmessung könnte man vielleicht mit einer IDelay auskommen.
Da bin ich gerade dabei ;)

von J. S. (engineer) Benutzerseite


Lesenswert?

Kannst ja mal was posten, wenn Du magst. Welche board benutzt Du?

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.