Forum: FPGA, VHDL & Co. FPGA Takt-Teilung


von Nasenmann (Gast)


Lesenswert?

Guten Morgen,

Ich diskutiere gerade mit einem Kollegen die Erzeugung eines halbierten 
Taktes. Wir haben einen Takt vom externen Quarz (Clock_Quarz) und wir 
wollen daraus einen synchronen Takt mit halber Frequenz (Clock_Half) 
erzeugen. Zwischen beiden Takt-Domains sollen Daten ohne 
Synchronisierungsaufwand ausgetauscht werden können.
Wir haben verschiedene Möglichkeiten besprochen und sind an einen Punkt 
gekommen, wo wir eine Meiungsverschiedheit haben.
Und zwar geht es um folgendes Konzept:
1
CLOCK_HALF_IBUFG_INST : BUFG
2
  port map (I => Clock_Half_In,
3
            O => Clock_Half);
4
(...)
5
process (Clock_Quarz) 
6
begin
7
  if (rising_edge(Clock_Quarz)) then
8
    Clock_Half_In <= not Clock_Half_In;
9
(...)
10
process (Clock_Half) 
11
begin
12
  if (rising_edge(Clock_Half)) then
13
(...)
Meine Meinung: Geht nicht, weil zwischen Clock_Quarz und Clock_Half eine 
Phasenverschiebung auftreten wird (verursacht durch die 
FlipFlop-Laufzeit von Quarz_Half_In) und der Datenaustausch ohne 
Synchronisierungsaufwand nicht gesichert ist.
Seine Meinung: Geht.

PS: Uns ist klar, daß es bessere Alternativen gibt und wir werden dieses 
Konzept auch nicht verwenden. Es geht hier nur ums Verständnis.

Wer hat Recht?

von DuArte (Gast)


Lesenswert?


von Joe (Gast)


Lesenswert?

Ich glaube zu wissen, dass die statische Timinganalyse nur abgeleitete 
Takte berücksichtigen kann, wenn man die Ableitung über eine PLL 
bewerkstelligt.

Was spricht gegen eine PLL?

von Franke (Gast)


Lesenswert?

Da die Takte statisch zu einander sind (werden ja vom gleichen 
abgeleitet) und die Gatterlaufzeit dich aus der Setup- und Hold-Time 
rausbringt, würde ich sagen geht.


Synronisieren musst du doch eigentlich immer nur zwei "freilaufende" 
Takte.


Cheers.

von Joe (Gast)


Lesenswert?

>a die Takte statisch zu einander sind (werden ja vom gleichen
>abgeleitet) und die Gatterlaufzeit dich aus der Setup- und Hold-Time
>rausbringt, würde ich sagen geht.

Aber wie garantierst du, dass der abgeleitete "Logik"-Takt ein
Takt-Routing und nicht Logik-Routing erfahren wird?

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


Lesenswert?

Nasenmann schrieb:
> Meine Meinung: Geht nicht, weil zwischen Clock_Quarz und Clock_Half eine
> Phasenverschiebung auftreten wird (verursacht durch die
> FlipFlop-Laufzeit von Quarz_Half_In) und der Datenaustausch ohne
> Synchronisierungsaufwand nicht gesichert ist.
> Seine Meinung: Geht.
Meine Meinung (und die der Tools, wenn man sich die Warnungen ansieht): 
Geht. Meistens. Ist aber Murks, wenn dieser abgeleitete Takt weit 
verstreut im FPGA verwendet wird, weil der "Takt" keinen Weg in ein 
Taktnetz findet und höchstwahrscheinlich über "normale" 
Routingressourcen verteilt wird. Ein unkalkulierbarer Skew ist die 
Folge.
Für lokale Anwendungen (z.B. 40 Flipflops eines SPI-Schieberegisters) 
könnte man bei großer Not sowas schon mal ins Auge fassen. Aber wehe, 
man gewöhnt sich so einen Designstil an...

von Bronco (Gast)


Lesenswert?

Lothar Miller schrieb:
> weil der "Takt" keinen Weg in ein
> Taktnetz findet und höchstwahrscheinlich über "normale"
> Routingressourcen verteilt wird.

Wieso das?
Er hat doch extra einen "BUFG" dazwischen geschaltet, damit müßte der 
Takt doch ins Taktnetz gehen, oder nicht?

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


Lesenswert?

Bronco schrieb:
> Er hat doch extra einen "BUFG" dazwischen geschaltet
Uuups... tatsächlich. Das geht allerdings nicht bei jedem FPGA. Wenn 
dann ein Taktnetz verwendet wird, bleibt nur noch der erhöhte Jitter 
durch den Umweg über ein normales Flipflop.

von Franke (Gast)


Lesenswert?

>Das geht allerdings nicht bei jedem FPGA

Kurze Frage, interessiert mich,
bei welchen geht das nicht ?

Danke

Gruß

von Christian R. (supachris)


Lesenswert?

Was genau spricht denn gegen einen DCM? Keine mehr verfügbar? Da hast du 
eine starre Phasenkopplung und weniger Jitter als bei der Frickelmethode 
oben.

von Edi M. (Gast)


Lesenswert?

Ich verstehe das Problem nicht. Entweder, man arbeitet komplett über 
denselben Takt mit enables und nimmt den zusätzlichen Strombedarf hin, 
oder man arbeitet mit zwei voll synchronen Takten aus einer PLL.
Diese sind zwar nicht 100% so entspannt wie ein einzelner Takt, aber die 
Synthesetools können das am Einfachsten berücksichtigen. Die Synthese 
nimmt für beide den Jitter an und rechnet damit sehr pessimistisch. Das 
ist der einzige echte Nachteil.

Der reale Jitter ist zwischen den Takten nahezu Null, WENN sie vom 
selben Oszillator kommen, was hier da sicher der Fall sein wird/kann. 
Wenn es jittert, jittern aber beide dynamisch in sehr ähnlicher Weise. 
Übrig bleibt nur das Routing-Delay an unterschiedlichen Stellen des 
Designs und die Tatsache das 2 Takte nicht so blastet sind, wie einer, 
was zu anderen Ergebnissen führt.

Alle Zwischenlösungen, die ich bisher gesehen und getestet habe sind 
schlechter.

von Nasenmann (Gast)


Lesenswert?

Zuerst vielen Dank für die Beiträge.

Joe schrieb:
> Was spricht gegen eine PLL?
Christian R. schrieb:
> Was genau spricht denn gegen einen DCM?
E. M. schrieb:
> Ich verstehe das Problem nicht.

Nicht falsch verstehen: Wir werden ein DCM benutzen.
Bei der Frage geht es nur um das Verständnis bzw. die Klärung der 
unterschiedlichen Meinung zwischen meinem Kollegen und mir.
Wir tun manchmal Dinge, von denen wir denken, sie verstanden zu haben, 
und nachher stellt sich raus, daß es doch nicht so war...

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


Lesenswert?

Franke schrieb:
> bei welchen geht das nicht ?
Ich meine behaupten zu können, dass es bei den alten Xilinx-FPGAs nicht 
ging (kann aber auch sein, dass ich mir nur an der Ecke die Finger 
verbrannt habe und deshalb weit davon weg bleibe...), ab S3 geht das 
offenbar problemlos. Und ich hatte das sogar schon mal probiert, da wird 
ab einer bestimmten Anzahl getakteter Flipflops sogar ein Taktnetz 
verwendet, obwohl nicht explizit ein BUFG angegeben wird:
1
   signal cnt : unsigned(23 downto 0);
2
   signal clk2_In, clk2: std_logic := '0';
3
   
4
begin
5
6
------  1  ------
7
  CLOCK_HALF_INST : BUFG
8
  port map (I => clk2_In,
9
            O => clk2);
10
  clk2_In <= not clk2_In when rising_edge(clk);
11
-----------------
12
13
------  2  -----
14
  clk2 <= not clk2 when rising_edge(clk);
15
-----------------
16
17
18
  cnt <= cnt+1 when rising_edge(clk2);
19
  Output <= std_logic_vector(cnt);
Beide Male kommt das selbe raus. Nur wenn wenige FFs zu takten sind, 
dann wird im zweiten Fall direkt ohne Taktnetz und doppelten Boden 
gearbeitet... ;-)

von Edi M. (Gast)


Lesenswert?

(Wo) ist denn das zweckmässig solche eine Beschreibung einzusetzen. Was 
machen den Quartus und die anderen Tools daraus?

von Klakx (Gast)


Lesenswert?

im ASIC-Entwurf sind solche Taktteiler gar nicht so unüblich. Synopsys 
bietet dafür auch constraints an. Dann werden beide Clock-Netzwerke auch 
synchron ausgerichtet. Für Xilinx FPGAs bin ich mir nicht sicher, ob 
diese generated-constraints unterstützt werden.

Richtig aufpassen muss man jedoch in der Simulation. Beide Clocks 
sollten auf das selbe Delta-Delay geschoben werden. Unconstrained sollte 
man diesen Teiler jedoch vergessen.

Wie gesagt, für den reinen FPGA-Entwurf PLL/DCM, Spezialkomponenten oder 
Clock-Enable. Dafür sind diese Tools ausgelegt.

von Edi M. (Gast)


Lesenswert?

Also eher was für die Schiene "experimental". Ich frage mich ohnehin, ob 
es in soliden Designs zweckmässig ist, sonderbare Tricks wie diesen 
einzusetzen. Muss ja alles lesbar und prüfbar sein.

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.