mikrocontroller.net

Forum: FPGA, VHDL & Co. Übergang zwischen Taktdomänen


Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGASchubser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es gibt hier eine gute Seite dazu.
http://www.fpga4fun.com/CrossClockDomain.html

und wie ich Lothar Miller kenne hat er bestimmt auch was dazu auf seiner 
Homepage.

gruß

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sim schrieb:
> 2 Taktdomönen

Wo kommen denn die Takte her? Sind die irgendwie korreliert?

Duke

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sim schrieb:

> 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.


Das kenne ich :-) Muss aber ein asynchrones Fifo mit 2 Takten sein.
Beitrag "asynchroner FIFO und Timing Report Spartan3aDSP"

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Wo kommen denn die Takte her? Sind die irgendwie korreliert?

Ja, der eine kommt aus einer PLL (100MHz) und der andere wird über einen 
Taktteiler davon abgeleitet.

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hochpass schrieb:
> Nutzt du den Ausgang vom Zähler als Takt?

Nein, ich führe den Ausgang des Zählers nochmal über ein Flip Flpo. Wie 
hier beschrieben: 
http://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sim schrieb:
> Nein, ich führe den Ausgang des Zählers nochmal über ein Flip Flpo. Wie
> hier beschrieben:
Zeig doch mal deinen Code mit den 2 Takten...
Und wei der Eine aus dem Andreren erzeugt wird.

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> sim schrieb:
>> Nein, ich führe den Ausgang des Zählers nochmal über ein Flip Flpo. Wie
>> hier beschrieben:
> Zeig doch mal deinen Code mit den 2 Takten...
> Und wei der Eine aus dem Andreren erzeugt wird.

Und zusätzlich noch, welche "Warnings" rauskommen.

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;





... 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;  

Warnings sind recht viele. Soll ich die hier wirklich alle Posten?

Autor: Anguel S. (anguel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du CPLD oder FPGA? Woher hast Du das Beispiel? Sieht mir irgendwie 
komisch aus. Ist auch nicht der komplette Code irgendwie...

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Lattice XP2-8E FPGA.
Was ist an dem Code komisch?

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
berndl schrieb:
> da ein
> Logiksignal nicht ueber die normalen Clocknetze verteilt werden kann

In diesem Punkt muss ich Mathi recht geben, ich kann dieses Signal bei 
Lattice durchaus auf ein Clocknetz geben.

Gruß

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, großes Entschuldigung. Ich meinte natürlich ob ich einen Derived 
Clock ohne Bedenken verwenden kann.
Der Takt wird gemäß 
http://www.mikrocontroller.net/articles/Taktung_FPGA/CPLD erzeut.

Sorry, aber ich denke das mit der Verzögerung gilt dann genau so, oder?

Autor: sim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  sim (Gast)

>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?

Ja.

>Sollte ich dann doch eher den Gated Clock als Clock Enable verwenden?

Clock enable.

MFG
Falk

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.