Übergang zwischen Taktdomänen

Gast #2004815
Lesenswert?
• ▲
▼
Hallo zusammen.

Ich habe 2 Taktdomönen und ein globales Statusregister. Dies wird aus 
der langsameren Domäne gesetzt und in der schnelleren abgefragt.

Ich habe bereits versucht den Übergang zu machen indem ich dieses 
Register über einen FIFO von einer zur anderen Takte. Allerdings scheine 
ich laut Timing analyse immernoch Probleme mit den Setup- und Hold 
Zeiten zu haben.

Wie gestaltet man einen solchen Übergang richtig?

Gruß sim
Gast #2005218
Lesenswert?
• ▲
▼
sim schrieb:
> Ja, der eine kommt aus einer PLL (100MHz) und der andere wird über einen
> Taktteiler davon abgeleitet.

Dann lässt sich doch ein synchrones Design erstellen.
Wenn du mit nem Clock Enable den Takt runterteils hast du keine 2 clock 
domains.
Gast #2005234
Lesenswert?
• ▲
▼
sim schrieb:
> Hmm, jetzt wo du es sagst, stimmt. Komisch dass ich aber Timing Errors
> bekomme am Übergang die sich stark verbessern wenn ich das Register über
> ein FIFO führe? Warum ist das dann so?

Ich weiß jetzt nicht wie du deinen Takt erzeugst.
Nutzt du den Ausgang vom Zähler als Takt? Stichwort Registered Clock 
oder nutzt du wirlich ein clock enable?
Ist ein großer Unterschied!!!!
Gast #2005368
Lesenswert?
• ▲
▼
Hier der Counter der Teilt...
1
  process(CLK_INT)
2
  begin
3
    if(CLK_INT'event and CLK_INT='1') then
4
    
5
      if(count >= (ClockDivider-1)) then
6
        MCLK_gated <= not MCLK_gated;
7
        count <= 0;
8
      elsif(count < (ClockDivider-1)) then
9
        count <= count+1;
10
      end if;
11
      
12
    end if;
13
  end process;

... und hier das Flip Flop
1
  process(CLK_INT, LOCK_int)
2
  begin
3
  
4
    if(LOCK_int='0') then
5
      MCLK <= '0';
6
      
7
    elsif(CLK_INT'event and CLK_INT='1') then
8
      MCLK <= MCLK_gated;
9
    
10
    end if;
11
  
12
  end process;

Warnings sind recht viele. Soll ich die hier wirklich alle Posten?
Gast #2007837
Lesenswert?
• ▲
▼
sim schrieb:
> Hier der Counter der Teilt...
>   process(CLK_INT)
>   begin
>     if(CLK_INT'event and CLK_INT='1') then
>
>       if(count >= (ClockDivider-1)) then
>         MCLK_gated <= not MCLK_gated;
>         count <= 0;
>       elsif(count < (ClockDivider-1)) then
>         count <= count+1;
>       end if;
>
>     end if;
>   end process;


das 'elsif' kannst du dir sparen, da reicht ein 'else'




> ... und hier das Flip Flop
>   process(CLK_INT, LOCK_int)
>   begin
>
>     if(LOCK_int='0') then
>       MCLK <= '0';
>
>     elsif(CLK_INT'event and CLK_INT='1') then
>       MCLK <= MCLK_gated;
>
>     end if;
>
>   end process;
Du erzeugst hier eine Clock aus einem Counter, also Logik. Diese MCLK 
willst du wohl an anderen FFs benutzen? So ala 'if rising_edge (MCLK)'?

Da wird es ueblicherweise Warnings und/oder Fehler hageln, da ein 
Logiksignal nicht ueber die normalen Clocknetze verteilt werden kann, 
sondern nur ueber die normalen Routing-Resourcen. Das MCLK bzw. 
MCLK_gated muesstest du als clock-enable verwenden und dann fuers Timing 
einen 'multi-cycle' definieren.
Gast #2007842
Lesenswert?
• ▲
▼
berndl schrieb:
> Da wird es ueblicherweise Warnings und/oder Fehler hageln, da ein
> Logiksignal nicht ueber die normalen Clocknetze verteilt werden kann,
> sondern nur ueber die normalen Routing-Resourcen. Das MCLK bzw.
> MCLK_gated muesstest du als clock-enable verwenden und dann fuers Timing
> einen 'multi-cycle' definieren.

Das stimmt für Lattice-FPGAs nicht. Dort ist es möglich so einen 
abgeleiten Takt zu erzeugen. Man sollte allerdings darauf achten die 
PFUs im Ripple-Mode zu verwenden und nicht im Daisy-Chain Mode um 
bessere Ergebnisse zu bekommen. Ein so erzeugter Takt kann dann wieder 
auf ein Takt-Netz geführt werden. Mehr dazu in TN1008 auf der 
Lattice-HP.
Gast #2008016
Lesenswert?
• ▲
▼
Mathi schrieb:
> Man sollte allerdings darauf achten die
> PFUs im Ripple-Mode zu verwenden und nicht im Daisy-Chain Mode um
> bessere Ergebnisse zu bekommen.

Das ist interessant. Aber ich versteh die Erklärung nicht so zu 100%. 
Wenn ich es so aufbaue wie in TN1008 und das MSB des Counters abgreife, 
dann ist doch das so erzeugte Signal kein Takt der durch 16 geteilt 
wurde. Er hat zumindest kein Puls Pause Verhältniss von 50/50 mehr, 
oder?

Muss ich einen solchen Takt auch nochmal über ein Flip Flop führen?

Gruß Sim
#2008108
Lesenswert?
• ▲
▼
>Da hätte ich gleich nich eine Frage, kann ich einen solchen gated Clock
>ohne bedenken verwenden? Oder ist das echt sooo schlimm wie man immer
>wider liest?

Die Antwort ist ein klares Jein mit Tendenz zum "besser nicht machen".
Nur ein paar Punkte:
- die gated clock ist immer leicht verzögert zum echten Takt, z.B. um 2 
ns bei einer Periode von 10 ns - das hieße, bei einem 
Taktdomänenübergang in die eine Richtung hast du nur 8 ns Zeit zwischen 
den beiden Taktflanken, in die andere Richtung sogar nur 2 ns. Das wird 
zu Timing-Problemen führen. Der timing-check berücksichtigt das bei 
seinen Überprüfungen (sofern die Taktraten richtig vorgegeben sind), es 
gibt also eine entsprechende Meldung "timing constraints not met".

- wird der abgeleitete Takt über normales Routing verteilt, ergibt sich 
ein großer Skew zwischen den einzelnen Registern, das führt beinahe 
zwangsläufig zu hold time violations - zumindest Lattice isplever kann 
das zwar automatisch korrigieren, aber das kostet Zeit und Ressourcen.

- soll der abgeleitete Takt wieder in ein globales Taktnetz, so hat man 
zwar keinen skew, aber eine stark erhöhte Laufzeit. Punkt 1 wird dadurch 
noch viel stärker ausgeprägt.

- ich bin bisher noch über kein Design gestolpert in dem ein 
abgeleiteter Takt wesentliche Vorteile gegenüber einem "echten" Takt aus 
einer DCM/PLL/DLL bzw. gegenüber einem clock-enable gehabt hätte.


Zusammenfassend: Man kann eine gated clock benutzen, wenn man genau weiß 
was man tut, allerdings gibt es kaum Gründe dafür.
Gast #2008169
Lesenswert?
• ▲
▼
Jan M. schrieb:
> Zusammenfassend: Man kann eine gated clock benutzen, wenn man genau weiß
> was man tut, allerdings gibt es kaum Gründe dafür.

Ich möchte noch einwerfen, das Jans Aussagen sich auf ein FPGA-Design 
beziehen und es hier ein Namensproblem gibt. Von einem Gated-Clock 
spricht man wenn man Flipflops mittels eines Gatters und eines 
Enable-Signals vom Taktnetz abtrennen kann. Damit ist kein abgeleiteter 
Takt gemeint.
Solche Techniken sind in der IC-Entwicklung gang und gebe.
Gast #2008294
Lesenswert?
• ▲
▼
Jetzt fällt mir gerade auf, wenn ich mir aus 100MHz einen Takt 
herabteile und diesen über ein FF führe um ihn zum Derived Clock zu 
machen, dann sind die Flanken ja doch nicht mehr sync. Denn der Derived 
Clock ist ja wie von Jan M. beschrieben verzögert worden. Stimmt das?

Sollte ich dann doch eher den Gated Clock als Clock Enable verwenden?
#2008679
Lesenswert?
• ▲
▼
Mathi schrieb:
> Jan M. schrieb:
>> Zusammenfassend: Man kann eine gated clock benutzen, wenn man genau weiß
>> was man tut, allerdings gibt es kaum Gründe dafür.
>
> Ich möchte noch einwerfen, das Jans Aussagen sich auf ein FPGA-Design
> beziehen und es hier ein Namensproblem gibt. Von einem Gated-Clock
> spricht man wenn man Flipflops mittels eines Gatters und eines
> Enable-Signals vom Taktnetz abtrennen kann. Damit ist kein abgeleiteter
> Takt gemeint.

Vollkommen richtig. Im FPGA sind diese beiden Arten von Takten aber 
praktisch identisch, deswegen auch der Mischmasch in meinem Post. Die 
möglichen Probleme sind in beiden Fällen gleich.


>Sollte ich dann doch eher den Gated Clock als Clock Enable verwenden?
Ja, das ist in jedem Fall die sauberere Lösung auf auf Dauer auch mit 
weniger Problemen verbunden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren