Forum: FPGA, VHDL & Co. Delay Locked Loop (DLL) Allgemein


von Daniel R. (dan066)


Lesenswert?

Ich habe eine Verständnisfrage zum DLL eines DCMs: Warum braucht man ein 
DLL?

Ein DLL hat die Eingänge CLKIN (zu synchronisierender Takt) und CLKFB 
(vormals ausgegebener Takt der durch das Taktnetzwek des FPGAs geleitet 
wurde und mit Verzögerung zum DCM zurück kommt). Außerdem den Ausgang 
CLKOUT (synchronisierter Takt der ans Taktnetzwerk des FPGAs rausgeht).
Was das DLL macht ist den Takt der über CLKIN reinkommt soweit verzögert 
auf CLKOUT auszugeben, dass die CLKOUT-Taktflanken synchron zu denen aus 
CLKFB sind. Im Endeffekt wird CLKIN also um CLKIN_Periode - 
Signallaufzeit_durch_Tanknetzwerk verzögert bei CLKOUT ausgegeben (max. 
eine knappe CLKIN-Taktperiode). Wenn dann beides synchron ist Locked das 
DLL dann, wenn es den endgültigen Verzögerungswert gefunden hat. Soweit 
so verständlich.

Aber warum braucht man diesen synchronisierten Takt der bei CLKOUT 
rauskommt? "Man sagt" er wird gebraucht um Clock Skew zu minimieren 
(also Unterschiede bei den Laufzeiten des Taktsignals zu den FFs). Warum 
verhindert ein DLL einen Clock Skew?

Und wie kann man sich das Clock Distribution Network ungefähr 
vorstellen? Sind das Leitungen die einmal im Kreis laufen (über die FPGA 
Chipfläche)?

Und warum kann der Delaywert überhaupt konstant festgelegt werden? Wenn 
man den Takt von CLKIN verzögert auf CLKOUT ausgibt und dann über den 
Eingang CLKFB das verzögerte Signal von CLKOUT empfängt, dann verzögert 
sich doch auch der bei CLKFB empfangene Takt. Das Ganze müsste sich 
endlos immer weiter verschieben...

Ich würde mich sehr freuen, wenn mir das jemand plausibel machen könnte.

von Martin (Gast)


Lesenswert?

Eine DLL braucht man um einen definierten Delay zu erzeugen.
Als Zeitreferenz  benötigt man einen Takt.

Manche DLLs  können nur ein Delay erzeugen  das kleiner ist  als  die 
Referenztaktperiode,
mache  können ein delay erzeugen dass grösser ist.

Wozu man das braucht:  nun, ist doch egal,
man braucht  es sonst  gäbs  die Dinger nicht.

Hängt vom Einzelfall ab.

von J. S. (engineer) Benutzerseite


Lesenswert?

Martin schrieb:
> Wozu man das braucht:  nun, ist doch egal,
> man braucht  es sonst  gäbs  die Dinger nicht.
:D

Man kann DLL z.B. dazu gebrauchen, um eine exakte Phase 
wiederherzustellen:

Will man Daten mit ihrem Takt annehmen, ist der Takt mitunter nicht so 
eingestellt, dass er mitten im Auge sitzt. In einem FPGA unterliegt der 
Takt zudem zusätzlichem Delay durch Routing und einen buffer. Mittels 
der DLL-Funktion lässt sich der Takt nun automatisch so hinschieben, 
dass er den eingehenden Taktflanke entspricht und im anderen Fall 
wiederum davon ausgehend so hinschieben, das er optimal sitzt. Das ist 
bei HF-Schaltungen oft unumgänglich.

Der eingehende Takt wird damit "geglättet" und auf den statisch besten 
Zeitpunkt gesetzt. Allerdings muss man aufpassen, dass durch den so 
vorrausschauend erzeugten Takt der Bezug zwischen Daten und Original 
verloren prinzipiell verloren geht, was bei stark schwankenden Takten, 
bei denen die Daten eigentlich korrekt mitschwingen, u.U. zu Fehlern 
führt.

Dies gilt z.B. bei Chips, die exzessives frequency speading betreiben.

von Lattice User (Gast)


Lesenswert?

Jürgen S. schrieb:

>
> Dies gilt z.B. bei Chips, die exzessives frequency speading betreiben.

Gerade mit SSC (spread spectrum clocking) ist die DLL stabiler als der 
Umweg über eine PLL eine phasenverschobene Clock zu erzeugen.

Was bezeichnest du als exzessive?

von J. S. (engineer) Benutzerseite


Lesenswert?

Lattice User schrieb:
> Gerade mit SSC (spread spectrum clocking) ist die DLL stabiler als der
> Umweg über eine PLL eine phasenverschobene Clock zu erzeugen.
Ich verglich nicht DLL und PLL sondern DLL und nicht-DLL.

Exzessiv wäre es, wenn die Frequenz von Takt zu Takt so schnell 
wechselt, dass die entstehenden Periodenänderungen im Bereich des timing 
budgets liegen. Den Fall hatte ich schon.

von Georg A. (georga)


Lesenswert?

> Warum verhindert ein DLL einen Clock Skew?

So ein Clocknet hat eine von den angeschlossenen Komponenten abhängige 
Lastkapazität. Die Struktur ist ein verästelter Baum, sodass die 
Leitungswege zu allen Orten gleich lang sind. Aber 1 Flipflop belastet 
weniger als tausende. Wenn der darüber laufende Takt immer 
phasensynchron zu einem externen sein soll, muss man die Verzögerung 
variabel halten. Die muss ja um einen Takt minus der Verzögerungszeit 
von Clockbuffern und Clocknet verschieben. Könnte man entweder vorher 
ausrechnen und ins Design hart codieren, passt nur bei veränderten 
Umgebungsbedingungen (Spannung, Temperatur, anderer Chip) nicht mehr.

Da ist eine automatische Regelschleife wie sie in der DLL drin ist, 
praktischer. Die Delays über die Rückkopplung sind bekannt (bzw. 
identisch zum Weg Pin->DLL-CLKIN designed), damit wird dann dynamisch 
jede Unregelmässigkeit ausgeglichen.

von Daniel R. (dan066)


Lesenswert?

Danke für die Antworten.

Mir leuchtet nur nicht ein, warum der verzögert ausgehende CLKOUT nicht 
dazu führt, dass auch der zurückkommende CLKFB verzögert wird. Dadurch 
ist CLKFB dann nicht mehr synchron zu CLKIN und CLKIN muss noch weiter 
verzögert werden, das wiederum zu einer weiteren Verzögerung von CLKOUT 
führt und so würde es sich immer weiter verzögern. Warum ist diese 
Vorstellung falsch?

von Georg A. (georga)


Lesenswert?

Das "ist nicht mehr synchron" ist keine Einbahnstrasse. Der 
Phasendetektor erkennt, ob die steigende Flanke von CLKIN vor oder nach 
der steigenden von CLKFB kommt. Geht halt bis +-180Grad. Damit wird 
solange an der Phasenverschiebung durch die zig hunderte internen 
Delaystufen rauf- oder runtergeschraubt, bis die Abweichung +-0 ist.

von Daniel R. (dan066)


Lesenswert?

Georg A. schrieb:
> Damit wird
> solange an der Phasenverschiebung durch die zig hunderte internen
> Delaystufen rauf- oder runtergeschraubt, bis die Abweichung +-0 ist.

Naja aber wenn diese +-0 Abweichung gefunden ist, wird die Delaystrecke 
gelockt und bleibt dann so.
Gibt es vielleicht ein Bild davon, wo man sieht wie das Clocknet beim 
DLL rausgeht und dann durch den FPGA und wieder zurück zum DLL? Ich kann 
mir einfach nicht vorstellen wie die Verdrahtung genau aussieht.

von Georg A. (georga)


Lesenswert?

> Naja aber wenn diese +-0 Abweichung gefunden ist, wird die Delaystrecke
> gelockt und bleibt dann so.

Nein, das wird kontinuierlich nachgeführt.

> Gibt es vielleicht ein Bild davon, wo man sieht wie das Clocknet beim
> DLL rausgeht und dann durch den FPGA und wieder zurück zum DLL? Ich kann
> mir einfach nicht vorstellen wie die Verdrahtung genau aussieht.

Hast du zufälligerweise das Xilinx-Webpack installiert? Da sieht man das 
im fpga-editor sehr schön. Aber prinzipiell wird das am Einspeisepunkt 
des Clocktrees abgegriffen und über einen Buffer wieder in die DLL 
geführt. Der Abgriff ist nicht am Ende des Clocktrees, weil es *das 
eine* Ende gar nicht gibt. Es reicht, wenn man die Gesamtbelastung 
feststellt.

von Daniel R. (dan066)


Lesenswert?

Georg A. schrieb:
> Hast du zufälligerweise das Xilinx-Webpack installiert? Da sieht man das
> im fpga-editor sehr schön.
Ja hab ich. Das würde bestimmt helfen. Wie komme ich denn genau zu der 
Ansicht?

von Georg A. (georga)


Lesenswert?

Produzier einfach so ein Simpel-Design, wie es in den Appnotes zur 
DLL/DCM steht. Also 2*BUFG, 1*DCM und damit nichts wegoptimiert wird, 
ein FF am Takt, das ein Signal eintaktet und wieder ausgibt. Spartan3E 
sollte schon reichen... Dann das geroutete Design (.ncd) in den 
FPGA-Editor laden, reinzoomen und nach der einsamen Leitung suchen ;)

von Daniel R. (dan066)


Lesenswert?

Danke. Das probier ich aus.

Abgesehen davon, bezogen auf meinen Anwendungsfall: was ich eigentlich 
haben will ist ja " nur" ein taktteiler. Und eigentlich reicht es für 
sowas ja sich ein derived clock Signal bzw clock enable zu bauen ( 
zählschleife).
Hätte ich in dem Fall mit Kanonen auf Spatzen geschossen wenn ich 
stattdessen einen dcm verwende?

In welchen Fällen ist ein dcm einer zählschleife vorzuziehen?

: Bearbeitet durch User
von Georg A. (georga)


Lesenswert?

> Abgesehen davon, bezogen auf meinen Anwendungsfall:

Den du leider nicht beschrieben hast ;)

Wenn das runtergeteilte Signal wirklich dein allereinziges Taktsignal 
ist und auch absehbar bleibt und die tatsächliche Phase zu äusseren 
I/O-Signalen absolut piepegal ist (eher selten...), kannst du natürlich 
auch mit einem Zähler runterteilen. Zweierpotenzen sind dabei trivial 
(Abgriff eines FF-Ausgangs), alles andere braucht etwas Vorsicht, damit 
da keine Glitches rauskommen. So Pfusch/Tricks mit Decodern nach dem 
Zähler hat man früher gern bei TTL gemacht, das ging da meistens noch 
gut. Bei FPGAs aber gehts gut daneben...

Bleibt es nicht dein einziger Takt oder ist dann doch irgendwas mit 
Setup/Hold nach aussen hin einzuhalten (bzw. überhaupt im Timinganalyzer 
rauszubekommen), muss es eigentlich eine DCM werden. Das Runterteilen 
kann man im Prozess explizit machen, wenn man gleich mehrere Phasen auf 
einmal braucht und es keine schwer zu erreichenden Timing-Constraints 
gibt:
1
process(clk)
2
begin
3
  if rising_edge(clk) then
4
    cnt<=cnt+1;
5
    if cnt(0)='0' then  -- halber Takt
6
      ...
7
    end if;
8
    if cnt(3 downto 0)="0000" then   -- 1/16tel
9
      ...
10
    end if;
11
    cnt1<=cnt1+1;
12
    if cnt1=41 then   -- 1/42tel
13
      cnt1<=0;
14
      ...
15
    end if;
16
  end if;
17
end process;

Der Vorteil der Methode ist, dass man absolut synchron bleibt, weil 
alles nur an dem einen Takt hängt.

Man kann auch verschiedene DCMs mit Teilfaktoren (und auch 
Multiplikatoren!) nehmen und trotzdem über alle Clockdomains synchron 
bleiben, dann muss man aber schon sehr genau wissen, was man macht und 
das auch mit diversen Constraints und tw. Extralogik sicherstellen. 
Bleib lieber erstmal bei einem Takt für alle Prozesse ;)

von Daniel R. (dan066)


Lesenswert?

Vielen Dank für die ausführliche Antwort.
Was ich vor hab ist, grob gesagt, ein eingehendes Signal in ein 
Schieberegister zu schieben und so aufgetretene Pulse (inkl. Dauer) im 
Signal zu erkennen. Dabei wollte ich die sampling-rate variieren können, 
um die Breite des Schirberegisters begrenzen zu können. Ich habe also 
einen Takt zum Abtasten und einen zum Analysieren des SR-Inhalts.

Für den DCM hatte ich mich entschieden, weil mir das als sicherste 
Lösung erschien. Außerdem liest man viel über die enthaltene DLL und 
deren Fähigkeit clock skew zu verhindern; was ja ein Feature ist, dass 
man eigentlich immer haben möchte (und ohne DCM nicht hat?).
Ergreift ISE bei der Synthese und beim Routing Maßnahmen, die ein 
Derived Clock Signal von Clock Skew befreien? Ich meine gelesen zu 
haben, dass die BUFG eine ähnliche Wirkung haben wie die DLL im DCM, 
stimmt das?

von Daniel R. (dan066)


Lesenswert?

Kann mir jemand sagen, ob ein Buffer, der an den Pins sitzt (z.B. ein 
BUFG oder ein IBUFG) eine DLL ähnliche Wirkung hat?
Ich hab mal gelesen, dass ISE beim Routing "gewisse Maßnahmen" ergreift 
um zu gewährleisten, dass ein eingehendes Clock-Signal (jetzt mal 
angenommen ganz ohne DCM) möglichst gleichzeitig bei allen FFs 
eintrifft. Wie wird dies ohne Benutzung eines DCMs erreicht?

von bko (Gast)


Lesenswert?


von Daniel R. (dan066)


Lesenswert?

Danke, aber das kannte ich schon;)

von Georg A. (georga)


Lesenswert?

DLL und BUFG ist was ganz anderes. BUFG ist nur ein (starker/schneller) 
Treiber, der direkten Zugriff auf das dedizierte Taktnetzwerk hat. 
Ausgleichen kann der aber nichts. Damit kann man zwar alle dran 
hängenden FFs synchron versorgen, aber es gibt immer noch ein paar ns 
Differenz, wenn das Signal von aussen reinkommen würde.

Das was du meinst, ist vermutlich die Erkennung im xst, ob das Signal 
ein Takt ist. Wenn das in einem rising/falling_edge steht, ist das ja 
auch recht wahrscheinlich... Dann wird ein BUFG zwischen Taktquelle und 
den FFs eingefügt, falls es noch keinen manuell instanziierten im Pfad 
dazu gibt.

von Daniel R. (dan066)


Lesenswert?

Nochmal vielen Dank für die Antworten.

Ich denke die Sache ist nun klar:
Clock Skew innerhalb des FPGAs wird von Xilinx dadurch minimiert, dass 
es die Clock-Treiber (IBUFG etc.) gibt, welche ein starkes Clock-Signal 
erzeugen und dadurch, dass es ein Clock Net in Baumstruktur gibt.
Das starke Clock Signal aus dem Treiber wird dann in das Clock-Net 
geleitet, wobei der Aufbau dieses Netzes die wichtigste Maßnahme gegen 
"internen" Clock-Skew ist. (Mit "internem Clock Skew" meine ich den 
Zeitunterschied zwischen dem ersten und letzten Eintreffen des Clock 
Signals an einem FF.)
Der DLL eines DCMs kann nicht verhindern, dass es diese zeitlichen 
Unterschiede zwischen dem Eintreffen des Clock Signals an den versch. 
FFs gibt, aber er kann dafür sorgen, dass die Verzögerung, die durch das 
Clock Net (ungefähr) entsteht, wegoptimiert wird.

Ich hatte fälschlicherweise angenommen, dass der DLL dazu da sei, dass 
das Clock Signal bei allen FFs gleichzeitig ankommt. Verwirrung entstand 
dadurch, dass dies mit nur einer Feedback-Leitung nicht möglich sein 
kann. Es bräuchte eine Feedbackleitung und einen DLL pro FF.

Danke georga für den Hinweis sich die Feedbackleitung einfach mal 
anzusehen;) Das habe ich getan und bemerkt, dass diese nur durch ein 
Viertel des FPGA verläuft. (Ich benutze den oberen linken DCM meines 
Spartan 3E 500. Die Feedbackleitung läuft durch das obere linke Viertel 
des FPGA, meine Anwendungslogik sitzt im oberen rechten Viertel.) Ich 
nehme an, dass die Feedbackleitung von ISE verlängert werden würde, wenn 
sich meine Logik auch auf die unteren Bereiche erstrecken würde.

von J. S. (engineer) Benutzerseite


Lesenswert?

Georg A. schrieb:
> DLL und BUFG ist was ganz anderes.
Die Verwirrung kommt an dieser Stelle möglicherweise daher, dass man bei 
den Xilinx-Buffern einen Teiler mit Faktor 2 einstellen kann.

von Daniel R. (dan066)


Lesenswert?

Jürgen Schuhmacher schrieb:
> Georg A. schrieb:
> dass man bei den Xilinx-Buffern einen Teiler mit Faktor 2 einstellen kann.

Das wird dann wohl der Eingangstaktteiler sein, den man bei Erstellung 
eines DCM aktivieren kann (dort ist nur eine Teilung durch zwei oder gar 
keine Teilung wählbar).

von Christian R. (supachris)


Lesenswert?

Nee, das sind spezielle Buffer, die sowas können. BUFIO2 zum Beispiel 
kann einige Teiler und auch Verdopplung.

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.