Forum: FPGA, VHDL & Co. asynchronen reset automatisieren


von Karl (Gast)


Lesenswert?

Ich habe eine externe PLL, die meinen FPGA speist, welche beim Start 
nicht immer zuverlässig anläuft, weshalb der Takt nicht sehr stabil ist 
und die PLL im FPGA nicht sauber anschwingt.

Daher soll die PLL resettet werden. Tue ich das mit einem Knopf im 
Testdesign per Hand, klappt das bestens. Dies möchte ich nun 
automatisieren.

Wie kann ich - ohne einen Takt - im FPGA einen Reset erzeugen, der etwa 
150ms nach Start der Schaltung den asynch rst der PLL bedient?

Ich kann an der Schaltung/Layout nichts mehr ändern, der FPGA muss das 
selber tun.

Bisher habe ich probiert, einen Zähler mit dem Inputtakt zu treiben, bin 
mir aber über das Routing unsicher:

Die Schaltung sieht so aus:


CLK_PIN -> IBUFG -> PLL_IN   PLL_OUT -> BUFG -> FPGA-TAKT
                 -> ZÄHLER   ZÄHLER_ENDE -> ASYNCH_PLL_RESET

Vom IBUFG geht es also einmal in die PLL und parallel in den Zähler. 
Dabei packt er das Timing nicht.

Wenn ich vom IBUFG  auf einen BUFG gehe, um den Zähler zu bedienen, 
kommt das bekannte "dedicated route" Problem.

von Schlumpf (Gast)


Lesenswert?

Karl schrieb:
> Wie kann ich - ohne einen Takt - im FPGA einen Reset erzeugen, der etwa
> 150ms nach Start der Schaltung den asynch rst der PLL bedient?

Karl schrieb:
> Bisher habe ich probiert, einen Zähler mit dem Inputtakt zu treiben, bin
> mir aber über das Routing unsicher:

Hast du nun einen Takt am FPGA oder nicht? Irgendwie erscheint mir das 
widersprüchlich, was du schreibst.

von allo (Gast)


Lesenswert?

Wenn man einen FPGA-internen Reset verwenden würde, dann würde ich das 
so machen:

Das Locked-Signal der PLL ist das Enable-Signal eines Zählers (der mit 
dem
PLL-Takt läuft). Wenn dieser Zähler einen bestimmten Zählstand erreicht 
hat, wird der FPGA-interne Reset losgelassen.

Ach ja, erwähnte ich, dass man einen FPGA-internen Reset verwenden 
müsste?

von Uwe (Gast)


Lesenswert?

> Wie kann ich - ohne einen Takt - im FPGA einen Reset erzeugen
Mit einem Takt im FPGA mit nem Ringoszillator (ist zwar ungenau sollte 
aber reichen).

von Karl (Gast)


Angehängte Dateien:

Lesenswert?

Nochmal zu Verdeutlichung: Es geht um die Erzeugung eines ASYNCHRONEN 
Resets für die interne PLL des FPGA, damit ich garantieren kann, dass 
die sich fängt, wenn draussen der Takt stabil ist. Wenn diese PLL dann 
läuft nutze ich wie gehabt, deren locked um die Schaltung loszulassen.

Interner Oszillator ist gut, möchte ich aber vermeiden.

Habe auf die Schnelle ein Bild gemalt:

Frage1: Brauche ich den bufg vor dem Zähler? (Der Zähler läuft nur gegen 
den Anschlag und erzeugt einen einzigen Puls)

Frage2: Ich bekomme ein Timingproblem vom asynch Reset zu dem PLL 
Ausgang für den System-Talt und auch dem RAM-TAKT, das mir nicht ganz 
klar ist. Wie kann ich ein TIG ansetzen, das diese Pfade ignoriert 
werden?

Welche Namen nimmt man da?

von Uwe (Gast)


Lesenswert?

> Der Zähler läuft nur gegen den Anschlag und erzeugt einen einzigen Puls
Du weißt doch gar nicht wie schnell die externe PLL gerade ist. Wenn sie 
nicht gelockt ist könnte sie doch 200MHz oder 20MHz haben. Da ist der 
Ringoszillator ja berechenbarer.

von allo (Gast)


Lesenswert?

Bei Deiner Schaltung beisst sich die Katze in den Schwanz ...

von allo (Gast)


Lesenswert?

>wenn draussen der Takt

Dann nimm doch zur Überwachungslogik einfach den PLL-Eingangstakt. Der 
ist stabil und schwingt nicht (unter der Annahme dass der externe 
Taktbaustein sich viel schneller stabilisiert als das FPGA konfiguriert)

von berndl (Gast)


Lesenswert?

allo schrieb:
> Dann nimm doch zur Überwachungslogik einfach den PLL-Eingangstakt

so mache ich das auch: Den Eingangstakt in ein Schieberegister packen, 
um damit nach PON die PLL fuer soundsoviele Takte im Reset zu halten. 
Dann das Locked-Signal der PLL (zur Sicherheit auch noch mal durch ein 
SR, hier aber mit der PLL-clk) als globalen synchronen Reset verwenden.
Hatte noch nie ein Problem damit...

von Karl (Gast)


Lesenswert?

Uwe schrieb:
>> Der Zähler läuft nur gegen den Anschlag und erzeugt einen einzigen Puls
> Du weißt doch gar nicht wie schnell die externe PLL gerade ist. Wenn sie
> nicht gelockt ist könnte sie doch 200MHz oder 20MHz haben. Da ist der
> Ringoszillator ja berechenbarer.
Es reicht, wenn ich ungefähr weiss, wie oft der maximal taktet und ich 
ein Minimum von 150ms (SPEC!) einstellen kann. Wenn es dann 300ms sind 
ist es mir auch Wurscht.

allo schrieb:
> Dann nimm doch zur Überwachungslogik einfach den PLL-Eingangstakt.
An den komme ich nicht ran und der wäre auch noch schlechter.

Das Grundproblem ist, dass der Takt manchmal abgeschaltet wird und dann 
nach Einschalten die PLL etwas spinnt und Zeit braucht.

So wie die Schaltung jetzt ist, arbeitet sie ja auch , nur die Synthese 
will nicht formell korrekt timen. Daher nochmal meine beiden Fragen:


Wie muss ich das TIG setzen und brauche ich den Buffer?

Wenn ich den Buffer vor dem Counter setzte kommt die Meldung mit dem 
"dedicated route" Problem und ohne Buffer finded die Synthese ein timing 
Problem zwischen dem Eingangstakt und dem RAM-Takt. Ich nehme an, dass 
er den Pfad vom Counterreset getrieben durch den Eingangstakt OSCCLK und 
den PLL-Ausgang verfolgt.

von Karl (Gast)


Lesenswert?

allo schrieb:
> Bei Deiner Schaltung beisst sich die Katze in den Schwanz ...
Wo denn?

von allo (Gast)


Lesenswert?

Nun ja: Du verwendest einen oszillierenden Takt, um ein 
Stabilitätskriterium zu erhalten.

von allo (Gast)


Lesenswert?

Mit "oszillierend" meine ich : bezüglich der Frequenz zeitweise 
unbestimmt

von dagfagr (Gast)


Lesenswert?

Wieso nicht einen zweite FPGA-interne PLL verwenden, die nur den 
Eingangstakt überwacht und den Reset für die erste PLL erzeugt?

Die PLL dürfte natürlich nicht als Eingangstakt den gleichen bekommen, 
wie die andere ...

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.