Forum: FPGA, VHDL & Co. Mit 2 FFs Trigger abtasten


von Sebastian (Gast)


Lesenswert?

Hallo Leute,

Ich habe einen Clock und einen optischen Trigger. Das Problem ist halt 
das die Phase zwischen den Clock und dem Trigger nicht konstant ist. Der 
Trigger wird aus einem optischen Signal erzeugt. Dies ist halt sehr 
empfindlich.

Die Digitaisierung startet mit dem Trigger. Nun habe ich jedoch das 
Problem das ich einen Jitter bei meinem abgetastetem Signal besitze. 
Dies war auch zu erwarten. Denn wenn der Trigger sehr dicht an der 
Setuptime Grenze kommt, dann Jittert das Signal um 1 Pixel.

Nun muss das digitalisierte Signal am PC unbedingt gemittelt werden. 
Demnach darf das Signal Jitterfrei sein.

Jetzt war meine Überlegung wie folgt. Ich beutze einen FF. Ein den D 
Eingang des FF lege ich den Trigger und auf den Clock Eingang mein 
Clock.

Anschließend benutze ich einen 2. FF und mache das gleiche. Der 
unterschied ist nur das ich den 2.FF im FPGA so platzieren muss, das die 
Daten (Trigger 250ns verspätet an den FF ankommen.

Wenn beide FFs den selben Wert besitzen. Dann weis ich das die Septup 
Time eingehalten wurde und der Trigger nicht gerade zu einer üngünstigen 
Phase anlag.

Mein Problem ist nur wie kann ich dem Xilinx Placer sagen das die 
Laufzeit von dem Trigger Signal xns Länger zum 2FF betragen soll? Gibt 
es da ein Constraint. Ich wollte jetzt nicht über LOC den FF selber 
irgendwo platzieren und dann über eine Timing Simulation prüfen obe 
alles funktioniert hat.

von Tom W. (Gast)


Lesenswert?

Ich verstehe nicht, was Du möchtst und anderen wird es ähnlich gehen.

Sebastian schrieb:
> Demnach darf das Signal Jitterfrei sein.
Das scheint mir nicht ganz sinnvoll.

Generell hört sich Deine Lösung nach einer Analogverschiebekette an und 
ich bezweifle, ob das in einm FPGA machbar ist.

von Achim S. (Gast)


Lesenswert?

Sebastian schrieb:
> Der
> unterschied ist nur das ich den 2.FF im FPGA so platzieren muss, das die
> Daten (Trigger 250ns verspätet an den FF ankommen.

ich hoffe mal, du willst um 250ps verzögert eintakten, nicht um 250ns.

Um Eingangssignale definiert zu verzögern besitzen einige FPGAs 
sogenannte "IDELAYs". Damit kannst du das Signal in Schritten von 
einigen 10ps in einem Bereich von eingen ns verschieben bevor es 
eingetaktet wird. Vielleicht hilft dir das weiter?

Aber weniger als einen Takt Jitter für die Abtastung schaffst du damit 
auch nicht nicht wirklich. Wenn dir das zu viel ist: die Abtastrate um 
Faktor x hochdrehen (das gibt dir den genaueren Triggerzeitpunkt) und 
dann nur in jedem x-ten Takt nach dem Trigger das Signal übernehmen.

von Sebastian (Gast)


Lesenswert?

Ich meinte natürlich 250ps

Ein Idelay kann ich nicht verwenden, denn der Trigger kommt nur an einem 
Pin rein. Von den Input Pin soll das Signal auf 2 unterschiedliche FF 
geleitet werden.

Das Triggersignal soll zum 1. FF z.B. 1000ps benötigen und zum 2. FF 
z.B. 1250ps benötigen.

Der Clock liegt an beiden FF zeitgleich an. Demnach würde ich das Signal 
zu 2 unterschiedlichen Zeiten abtasten.

von Duke Scarring (Gast)


Lesenswert?

Sebastian schrieb:
> Der Clock liegt an beiden FF zeitgleich an. Demnach würde ich das Signal
> zu 2 unterschiedlichen Zeiten abtasten.
Was soll das bringen?
Was möchtest Du optimieren?

Sebastian schrieb:
> Demnach darf das Signal Jitterfrei sein.
Diese Aussage verstehe ich nicht. Du wirst immer einen Jitter haben. Die 
Frage ist, wie groß darf der sein.

Sebastian schrieb:
> Dann weis ich das die Septup
> Time eingehalten wurde und der Trigger nicht gerade zu einer üngünstigen
> Phase anlag.
Was machst Du, wenn der Trigger in einer ungünstigen Phase anlag?
Ignorieren?

Warum nicht einfach über zwei hintereinandergeschaltete FF 
synchronisieren?


BTW, ich würde es mal mit einer Plazierung per Hand (LOC constraints) 
versuchen. Das dürfte die sichersten Ergebnisse bringen.
Kennst Du den FPGA-Editor? Der ist zwar etwas kryptisch zu bedienen, 
aber man kann gut nachschauen, ob das Ergebnis passt.

Duke

von Sebastian (Gast)


Lesenswert?

Es ist doch eigentlich sehr einfach.

Wenn die Phase des Triggers nicht konstant ist, dann ist nicht immer 
sichergestellt das die Setup Zeit vom FF eingehalten wird.

Und genau diesen Fall möchte ich erkennen. Daher ja der 2. FF. Dieser 
bekommt das Signal verzögert um eine Zeit x z.B. 250ps. Der Takt kommt 
bei beiden FFs ca zur gleichen Zeit an.

Wenn beide FFs nicht den selben Zustand am Ausgang besitzen, dann weis 
ich das die Setup Zeit vom FF verletzt wurde. Dann würde ich das Signal 
nicht zum mitteln nehmen.

Ich kann natürlich den FF per Hand platzieren doch ich dachte das die 
der Xilinx Mapper auch macht nur weis ich die Anweisung nicht.

von Achim S. (Gast)


Lesenswert?

Sebastian schrieb:
> Es ist doch eigentlich sehr einfach.

Für dich schon, im Gegensatz zu uns kennst du deinen Aufbau ;-)

Geht es dir darum, den Jitter von +/- 1 t_CLK auf +/- 0.5 t_CLK runter 
zu bringen? Dann taste den Trigger doppelt so schnell ab.

Oder geht es dir darum, dass am Ausgang des Trigger-FF eine Statemachine 
ab und zu falsch reagiert, weil die Setup-Zeit verletzt wurde? Dann 
synchronisiere über zwei hintereinandergeschaltete FF.

von Schlumpf (Gast)


Lesenswert?

Was du vor hast, ist eine total unübliche Lösung.

Mit dem Trigger wird vermutlich ein Vorgang ausgelöst, mit dem dann 
irgendwelche Daten erfasst werden, richtig?

Du hast also offensichtlich Zeit genug, um den Trigger in 2 Register zu 
speichern und dann musst du ja noch die Zustände der beiden Register 
plausibilisieren. Das kann auch nicht rein kombinatorisch erfolgen, da 
das Auswertesignal glitchen kann. Also musst du alles eh noch über eine 
Registerstufe führen.

Somit hast du noch einen Takt verloren.

Was du vor hast, kann man sicher machen, aber ich habe so meine Zweifel 
dran, ob es schlau ist, das so zu tun.

Beim Übergang von einer Taktdomäne in eine andere hast du IMMER einen 
Jitter, wenn die Takte nicht phasensynchron sind. Egal, wie du es 
machst.

von Sebastian (Gast)


Lesenswert?

Demnach weis keiner wie man dies mit einem Constraint machen kann?

von Schlumpf (Gast)


Lesenswert?

Meines Wissens gibt es kein Constraint, mit welchem du eine 
Mindestlaufzeit einstellen kannst.
Was du aber ebenfalls als Constraint übergeben kannst ist das Placement.
Wie das bei Xilinx funktioniert, weiss ich nicht.
Bei Lattice kann man einzelne Teile des Designs als Gruppe "markieren" 
und diese dann platzieren. Geht alles in Textform im Constraintfile.
Allerdings kannst du auch hier das Routing nur über einen MAXDELAY 
beeinflussen.
Aber geschickt gemacht, kannst du Quelle und Ziel so weit auseinander 
platzieren, dass bei idealem Routing (kürzester Weg) die Zeit rauskommt, 
die du dir wünschst. Mit dieser Zeit belegtst du dann MAXDELAY für 
dieses Signal.
Dann sollte bei jedem darauffolgenden Syntheselauf das Gleiche 
rauskommen.
Muss man sich aber vermutlich erstmal rantasten.

Aber abgesehen davon vermute ich, dass du mit deinem Vorhaben auf dem 
Holzweg bist und vermutlich deutlich eleganter gelöst werden kann.

Wenn du das aber unbedingt über so einen Delay lösen musst oder willst, 
dann wäre das o.g. eine Lösung

von Klaus F. (kfalser)


Lesenswert?

Ich denke, dass Du einen Überlegungsfehler in Deiner Vorstellung hast, 
denn letztendlich wirst Du immer einen Jitter von ca. einem Taktzyklus 
zwischen Ereignis und Abtastung haben.
Deine Trickschaltung verbessert das Ganze nur minimal.

Beispiel : Takt 100 ns, Setup Zeit 250 ps, Hold-time 20 ps.

Fall 1 : Ereignis bei t=300,021 ns, direkt nach dem Takt-Flanke
Abtastung Sensor erfolgt bei t=400 ns, ist sauber, Setup und Hold-Zeiten 
eingehalten.
-> Fehler (Jitter) 99,979 ns.

Fall 2 : Ereignis bei t=399 ns, kurz vor Takt-Flanke
Abtastung Sensor erfolgt bei t=400 ns, ist sauber, Setup und Hold-Zeiten 
eingehalten.
-> Fehler (Jitter) 1 ns

Fall 3 : Ereignis bei t=399,9 ns, kurz vor Takt-Flanke
Abtastung Sensor erfolgt bei t=400 oder t=500 ns, da Setup verletzt
-> Jitter 100,1 ns
Wenn ich richtig verstanden habe, willst Du gerade diesen Fall erkennen, 
damit Du eventuell das ganze um einem Takt veschieben kannst und den 
Fehler von 100,1 ns auf 0,1 ns reduzierst.
Das bringt Dir nun wirklich nichts, da Du immer einen maximalen Fehler 
von 99,9 ns hast.

von Sebastian (Gast)


Lesenswert?

@ Schlupf

Genau so wollte ich es auch machen. Man kann unterschiedliche Bauteile 
Gruppieren und dann in einer Aerea platzieren und das gleiche mit dem 
2.FF.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Warum ist mir das Wort "Holzweg" in den Gedanken hängen geblieben?

Das Problem kann m.E. ohne Funktionseinschränkung einfach über ein 
einziges Sync-Flipflop erledigt werden. Denn der Jitter wird hier immer 
+-1/2 Taktzyklus sein. Auch dieser dubiose Zwei-Flipflop-Trick ändert 
daran nichts...

von Schlumpf (Gast)


Lesenswert?

Lothar Miller schrieb:
> Warum ist mir das Wort "Holzweg" in den Gedanken hängen geblieben?

Weil es unangenehm ist, wenn man merkt, dass die "schöne" Idee nichts 
bringt :-)

Lothar Miller schrieb:
> Das Problem kann m.E. ohne Funktionseinschränkung einfach über ein
> einziges Sync-Flipflop erledigt werden. Denn der Jitter wird hier immer
> +-1/2 Taktzyklus sein. Auch dieser dubiose Zwei-Flipflop-Trick ändert
> daran nichts...

Sehe ich genauso und hab ich ja weiter oben auch schon geschrieben. Aber 
wenn er an seiner Lösung festhalten will...

Sebastian schrieb:
> @ Schlupf
> Genau so wollte ich es auch machen. Man kann unterschiedliche Bauteile
> Gruppieren und dann in einer Aerea platzieren und das gleiche mit dem
> 2.FF.

Ja dann mach es doch genau so.. Jedes FF in eine separate Gruppe, diese 
platzieren und los geht´s..

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.