Hallo zusammen,
ich bin auf der Suche nach einer eleganten Lösung für ein CDC eines
unidirektionalen Interfaces.
1 | signal data_rdy : std_logic;
|
2 | signal addr : std_logic_vector(11 DOWNTO 0);
|
Beide Clock-Domains sind nicht phasengleich und können im der Frequenz
variieren. Die Quell-Domain kann also größer der Ziel-Domain sein, oder
auch kleiner, maximal jedoch Faktor 2 kleiner/größer.
Ein Handshake kann ich leider nicht einsetzen, ich habe also nur diese
beiden Eingänge zur Verfügung. Der Vorteil ist, dass ich eine definierte
Startadresse habe und die Adressen auch in definierter Reihenfolge
eintrudeln.
Meine Idee:
Ich verwende in der Quell-Domain einen Counter, der die data_rdy Pulse
zählt, damit diese dann in korrekter Anzahl auf der Ziel-Domain
ausgegeben werden können. Den Counter muss ich ausreichend groß
dimensionieren, so dass er auch bei "2*Ziel = Quell" nicht überläuft.
Also z.B. 9 Bit.
Nun hatte ich die Idee, dass der Counter in der Zieldomain entsprechend
heruntergezählt wird, bis er wieder auf 0 ist und solange synchron zum
Zieltakt Pulse ausgegeben werden.
An welcher Stelle aber muss ich den Counter dann sauber synchronisieren?
Und wie kann ich ihn dann gleichzeitig auf der einen Seite hochzählen,
aber auf der anderen Seite quasi asynchron herunterzählen?
Vielen Dank!
Andi :)