Forum: FPGA, VHDL & Co. Anfängerfrage: Zugriff auf ein reg von unterschiedlichen Taktraten


von Bernd (65c02)


Lesenswert?

Hallo,
ich würde mich riesig über eine Hilfe von euch Verilog Profis freuen:

Ich habe mir über ein PLL einen clkSys von ~49MHz erzeugt. Aus diesem 
generiere ich mir einen clkPhi0 durch eine einfache Teiler/Zähler 
Funktionalität, welche mir ein clkPhi0 von ~0.98 Mhz gibt. Ich denke, 
beide CLKs werden quasi somit gemeinsam HIGH ;-) (sorry), wobei 
natürlich clkSys häufiger die Flanke wechselt als clkPhi0:
1
wire clkPhi0, clkSys;
2
reg [63:0] cntCycle, cntCycleOld;
3
...
4
5
always_ff @(posedge clkPhi0 or negedge rst) begin
6
...
7
cntCycle<=cntCycle+1;
8
...
9
10
always_ff @(posedge clkSys or negedge rst) 
11
...
12
cntCycleOld<=cntCycle;
13
if (cntCycleOld==cntCycle) debugVIC<=red;
14
else debugVIC<=yellow;

Ich stellte fest, dass wenn der obere Block mit dem Takt clkPhi0 
getaktet wird, im unteren Block stets debugVIC<=red ausgeführt wird 
(also als ob cntCycle nie inkrementiert wird). Wenn ich hingegen den 
oberen Block ebenfalls mit clkSys takte, wird debugVIC<=yellow (wie 
erwartet) ausgeführt.

Die Herausforderung für mich ist demnach, zwischen zwei asynchron 
getakteten Blöcken Daten (hier: reg) auszutauschen/zu synchronisieren. 
Ich hatte gehofft, dass die Synchronisierung klappt weil beide ja eine 
identische "High"-Flanke haben und ich nur dann drauf zugreife... War 
wohl nix. ;-(

Danke schon mal fürs Lesen.

: Bearbeitet durch User
von Gustl B. (gustl_b)


Lesenswert?

Mehr als nur dieser Schnipsel wäre gut um das auch zu simulieren.

von Martin S. (strubi)


Angehängte Dateien:

Lesenswert?

Du musst einen Gray-Counter verwenden, oder komplette Register ueber 
eine minimalisierte Gray-Coder-Pipe (siehe Anhang fuer ein Bit) in die 
andere Domaene uebergeben. Alles andere glitcht dir sonst beliebig rum, 
weil dann da (Klassiker!) die unterschiedlichen Laufzeiten zu 
verschiedenen Logikzellen ins Spiel kommen. Gibt's hier viele 
Abhandlungen dazu...

von Dergute W. (derguteweka)


Lesenswert?

Moin,

In diesem Fall scheint mir hier der Haupthund begraben zu sein:

Bernd schrieb:
> Aus diesem
> generiere ich mir einen clkPhi0 durch eine einfache Teiler/Zähler
> Funktionalität, welche mir ein clkPhi0 von ~0.98 Mhz gibt.

Wie waer's, wenn du alles mit dem original Takt taktest, aber fuer die 
langsamen Teile eben ein zusaetzliches "ClkEnable" Signal erzeugst und 
kein eigenstaendiges clkPhi0?

Gruss
WK

von Bernd (65c02)


Lesenswert?

Hallo,

erstmal Danke für alle Antworten.

Die Antwort von WK (derguteweka) hat mich nachdenklich gestimmt... Warum 
soll ich mich mit der Synchronisierung von Clock-Domains herumschlagen, 
wenn ich doch alles selbst in der Hand habe und stets mit maximaler 
Frequenz arbeiten und das langsamere clkPhi0 selbst aus der clkSys 
heraus signalisieren kann? Absolut korrekt. Vielen Dank für diese 
Antwort, ich werde es so machen, auch wenn dies vom diskreten 
Originalschaltplan abweicht.

Gelernt habe ich in den anderen Foreninhalten, dass unterschiedliche 
Clks stets synchronisiert werden müssen, unabhängig davon ob deren 
Flanken synchron HIGH werden oder nicht, und das dies ein echter Aufwand 
ist den, wenn man ihn vermeiden kann, auch vermeiden sollte.

Nochmal Danke,
Bernd.

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Bernd schrieb:
> elernt habe ich in den anderen Foreninhalten, dass unterschiedliche
> Clks stets synchronisiert werden müssen, unabhängig davon ob deren
> Flanken synchron HIGH werden oder nicht, und das dies ein echter Aufwand
> ist den, wenn man ihn vermeiden kann, auch vermeiden sollte.

An dem Satz stimmen 3 Sachen nicht:

1) Synchronisieren von Clocks ist nicht der Punkt, es geht um das 
Synchronisieren der Daten.

2) Flanken von Takten sind grundsätzlich nie 100% synchron. Das ist eine 
Frage des Budgets. Wenn das reicht, ist eine sichere Übergabe immer 
möglich, egal ob die Takte einen direkten Bezug haben und ab und 
scheinbar zum gleichen Zeitpunkt kommen. Es ist im Gegenteil so, dass 
dies genau dann am einfachsten funktioniert, wenn sich die Taktflanken 
NIE sehen.

3) Man kann da nichts vermeiden, weil das durch die Aufgabe vorgegeben 
ist. Dort, wo Takte aufeinander treffen, muss eine adäquate Lösung her. 
Was man machen kann, ist nicht unnötig viele Takte ins Design zu 
bringen.

Daher der Einwurf der enables. Aber:

In deinem Fall kann das durchaus sinnvoll sein, einen langsamen echten 
Takt zu nehmen und das passend zu behandeln. Dazu braucht es ein strobe 
Signal, das das neu Einschreiben eines Datums in REG anzeigt. Wenn sich 
das ändert, wird gelesen. Das zu synchen erfordert ein einmaliges 
Einsynchen der Daten und des Strobes.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Bernd schrieb:
> ich werde es so machen, auch wenn dies vom diskreten
> Originalschaltplan abweicht.

Ja, das ist einer der grossen Unterschiede, wenn man von Backblechen mit 
TTL/CMOS-Logik auf FPGA geht - rat'mal woher ich den kenne ;-)?

Gruss
WK

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.