Forum: FPGA, VHDL & Co. Verilog: 2 Clock domains, signal crossing


von Queck S. (Firma: Uni) (kiigass)


Lesenswert?

Hi Leute,

ich hab heute mal wieder ein blöde Frage. Ich haben ein 
Datenerzeugermodul (A) und eines welche diese Daten entgegen nimmt (B). 
Die clk von A ist deutlich schneller als die von B (ca. Faktor 2), aber 
die beiden sind völlig unabhängig von einander. Um den Übergang zu 
realisieren, habe ich nun folgendes generisches Modul geschrieben:
1
module clk_domain_switch #(parameter W=64)
2
  (
3
   input         mclk,
4
   input         sclk,
5
   input         nd, //neue Daten werden von A geliefert
6
   input         ack,//B hat die Daten genommen
7
   input [W-1:0]      din,
8
   output reg         nda, //neue Daten für B sind verfügbar
9
   output reg [W-1:0] dout
10
   );
11
12
   always @(posedge mclk)
13
     if(nd)
14
       dout <= din;
15
16
   always @(posedge mclk)
17
     if(nd)
18
       nda <= 1;
19
     else if(ack)
20
       nda <= 0;
21
   
22
endmodule // clk_domain_switch

Mir kommt das ein wenig seltsam vor, weil es ... nunja, zu einfach 
ist^^. Außerdem scheint man die sclk überhaupt nicht zu benötigen. Stehe 
ich auf dem Schlauch, oder ist das wirklich so einfach?

danke

PS: Hier fehlt ein verilog-Tag =)

von Dr. Schnaggels (Gast)


Lesenswert?

>Mir kommt das ein wenig seltsam vor, weil es ... nunja, zu einfach
>ist

Wenn es dein Modul ist, wieso wunderst du dich über deine Arbeit?
;-)

von Queck S. (Firma: Uni) (kiigass)


Lesenswert?

Dr. Schnaggels schrieb:
>>Mir kommt das ein wenig seltsam vor, weil es ... nunja, zu einfach
>>ist
>
> Wenn es dein Modul ist, wieso wunderst du dich über deine Arbeit?
> ;-)

ich weiß auch nicht XD soweit ich das in Erinnerung habe, ist es doch 
sonst deutlich schwieriger 2 verschiedene Clock Domains zu verwalten. 
Ich hab hier ja nichtmal die sclk verwendet.

von Schlumpf (Gast)


Lesenswert?

Du bist ja ein lustiger Zeitgenosse. Codierst was und wunderst dich, 
dass es so einfach ist gg

So wie ich deinen Code überblicke (kann kein Verilog), übernimmst du mit 
ein und dem gleichen Steuersignal (nd) die Daten in die Zieldomain und 
setzt gleichzeitig das Flag (nda), dass die Daten jetzt vorhanden sind.

Und was machst du, wenn die Laufzeit vom nd-Signal an den Vergleicher 
(vermutlich wird ein EN-Signal für das dout-Register daraus werden) 
kürzer ist, als die Laufzeit der Daten an das dout-Register und dann die 
Flanke von mclk genau dazwischen haut?
Oder wenn die Laufzeit von nd an das nda-Register so kurz ist, dass du 
nda erkennst, aber die Daten noch gar nicht in deiner Zieldomain 
angekommen sind?

.... hmm, vielleicht ist es ja doch nicht so einfach :-)

von berndl (Gast)


Lesenswert?


von eingast (Gast)


Lesenswert?

Du benutzt nd und din in der falschen Clockdomain. Korrekterer wäre 
meiner Meinung nach, zuerst nd und din durch einen zweistufigen 
Synchronisierer zu jagen (2*FF).

din ist bei dir einmal einsynchronisiert, nd gar nicht.

wenn nda in der sclk-domain benutzt wird solltest du das natürlich auch 
auf sclk synchronisieren.

Also: erst mal alles in eine clock domain bringen (bei dir mclk) mit 
2-stufen sync. Dann die Handshake-Logik in einer Clockdomain ausmachen 
und ggf notwendige Signale wieder (natürlich mit synchronisierer) zurück 
in die andere Clockdomain.

von Harald F. (hfl)


Lesenswert?

Hallo Queck,

dein Code ist leider nicht ganz selbsterklärend, aber ich nehme jetzt 
mal an, dass mclk ein Master Clock ist, der zu A gehört und sclk zu B. 
Das Signal nd soll wohl anzeigen, dass neue Daten vom Master ausgegeben 
wurden. Dann müsstest Du folgendes tun:

1. nd mit 2 Flipflops in die Taktdomäne sclk übernehmen und ein drittes 
Flipflop noch hintendran hängen.

2. Für den Slave ein Übernahmesignal erzeugen aus FF2 = gesetzt und FF2 
ist nicht gesetzt.

3. Den Ausgang des 3. FF als ack zum Master schicke. Dieser muss dieses 
Signal mit seinem Takt wieder durch 2 FF einsynchronisieren und weiß 
dann, wann er wieder neue Daten liefern darf.

Das müsste hinhauen. Grüße,
Harald

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.