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


von elfzehn (Gast)


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ß

von kmdf (Gast)


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

von Jürgen Schuhmacher (Gast)


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?

von elfzehn (Gast)


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


von J. S. (engineer) Benutzerseite


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.

von kmdf (Gast)


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.

von elfzehn (Gast)


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!

von J. S. (engineer) Benutzerseite


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 :-)

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.