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