www.mikrocontroller.net

Forum: FPGA, VHDL & Co. 2 Taktdomänen


Autor: elfzehn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei meinem Schaltungsdesign in VHDL gibt es 2 Takte, ein "langsamer" 
100Mhz Takt (CLK) und ein schnellerer 133Mhz Takt (FCLK) mit dem auf ein 
externes SDRAM zugegriffen wird.
Die Taktumsetzung für die Daten erfolgt mit FiFos mit unterschiedlichem 
Lese/Schreibetakt. --

Jetzt mein Problem: ich hab ein Signal das vom langsamen Takt erzeugt 
wird und in einem Prozess im schnellen Taktsystem (SDRAM Control Logik) 
ausgewertet wird.

Wie kann ich vermeiden, dass es zu Hazards und Metastabilität kommt? In 
der Simulation tut alles das was es soll, im echten System noch nicht so 
richtig.

signal_clk  : Signal in CLK Taktsystem synchron erzeugt
signal_fclk : ins FCLK Taktsystem umgesetztes Signal, zur synchronen 
Abfrage mit FCLK vorbereitet

--Prozess zur Taktumsetzung: Synchrones Abtasten des signal_c
   Process(FCLK, R)
   if R == '1' then
      signal_fclk <= '0';
   elsif rising_edge(FCLK)
      signal_fclk <= signal_clk;
   end if;
   end process;

Ich vermute dass an dieser Umsetzung das Problem liegt.
Habt ihr Vorschläge wie die Umsetzung erfolgen kann ohne in Metastabile 
Zustände zu gelangen?


(Hab hier im Forum was von 2 Flip flops gefunden, war aber keine 
Beschreibung wie das funktionieren soll)

wäre dankbar wenn mir jemand weiterhelfen könnte !!
Gruß

Autor: kmdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst einfach zwei FlipFlop in serie schalten, um Metastabilitäten 
zu vermeiden.

signal_fclk_sync <= signal_clk;
signal_fclk <= signal_fclk_sync;

Beim ersten FlipFlop kann es noch Metastabilitäten geben. Die Spikes 
sind aber vorbei, wenn das Signal in das zweite FlipFlop übernommen 
wird.

Gruss kmdf

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wobei das clocken mit dem schnellen Takt zu erfolgen hat. Gfs 
brauchst du auch noch eine "händische" Flankendetektion des langsamen 
durch den schnellen Takt, je nachdem was Du machen willst.

So wie Du es schreibst, willst Du den Takt samplen - was ist mit den 
Daten?

Autor: elfzehn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@kmdf

also du meinst einfach so? muss ich mal ausprobieren. Danke schon mal.

  Process(FCLK, R)
   if R == '1' then
      signal_fclk <= '0';
   elsif rising_edge(FCLK)

     signal_fclk_sync <= signal_clk;
     signal_fclk <= signal_fclk_sync;

  end if;
   end process;


@Jürgen Schuhmacher

ich will eigentlich nicht den Takt samplen, sondern nur das Signal 
signal_clk (das aus der langsamen Taktdomäne kommt) in der schnellen 
auswerten.

die Daten sind nicht das Problem, die speicher ich in Fifos mit 
unterschiedlichen schreib-/lesetakten


Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem Du den Takt so einsynchronisierst, sampelst Du ihn ja de facto. 
Meine Frage galt zudem den Daten, bei denen die Instabilitätsbetrachtung 
auch gilt- vor allem wenn nun alle 100MHz/3 (= 133/4) der Takt um 75% 
verzögert übernommen wird. Die Daten sollte gfs auch verlängert werden.

Autor: kmdf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich es verstanden habe, willst du ein Signal aus der langsamen 
Tacktdomäne mit dem Tackt der anderen Synchronisieren. Wenn dein Signal 
länger als die Periodedaurer des anderen Tacktes ansteht, kannst du das 
Signal, wie in deinem letzte Bespiel, synchronisieren.

Autor: elfzehn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kmdf:  super, vielen Dank

Jürgen: Mein Lesefifo läuft mit dem schnellen Takt zum schreiben, und 
mit dem langsamen Takt zum Lesen (Coregen Unit), insofern dürfte das für 
die Daten kein Problem sein... denke ich.... danke!

Autor: Jürgen Schuhmacher (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@elfzehn: Ich hoffe, du schreibst damit nicht mehr pro Zeiteinheit rein, 
als Du abholen kannst.

@kmdf: Du kannst Dir Tipparbeit sparen, wenn Du das Wort "Takt" nach der 
neuen Rechtschreibung ohne "c" schreibst :-)

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.