Forum: FPGA, VHDL & Co. Probleme mit synchronen Clock Ausgängen -> Timing Constraints


von Daniel S. (uc4life)


Lesenswert?

Hallo,

ich habe ein Problem beim Erstellen zweier Clocksignale. Ich habe einen 
Clockeingang mit 32 MHz. Aus diesem Signal muss ich zwei Clockausgänge 
generieren. Zum Einen eine Clock mit 32MHz und eine mit 16MHz.
Aus Unwissenheit heraus habe ich einfach den Clockeingang genommen und 
daraus die 32 und 16 MHz generiert um diese anschließend auf normale 
IO-Pins (Keine CLOCK-IOs!!!) zu geben. Auf dem Oszilloskop ist mir 
aufgefallen, dass je nach Compilierung die Signale zueinander 
phasenverschoben sind.

Ich habe bereits rausgefunden, dass ich auf sogenannte Timing 
Constraints zurückgreifen muss. Allerdings weiß ich nicht wie ich diese 
in VHDL implementieren muss.

Kann mir jemand helfen?
Ich arbeite mit einem Xilinx Virtex 4 Board.

Vielen Dank für eure Mühe im Vorraus.

Gruß
Daniel

von Falk B. (falk)


Lesenswert?

@Daniel S. (uc4life)

>Kann mir jemand helfen?

Erstmal lies was über Taktung FPGA/CPLD. Ist zwar nicht 100% das 
Problem hier, aber schafft wichtiges Verständnis.

>Ich arbeite mit einem Xilinx Virtex 4 Board.

Na dann ist ja alles Easy. Für den 32 MHz Takt nimmt man ein DDRO 
FlipFlop, also ein DDR-FlipFlop, welches direkt in den IO-Zellen sitzt. 
Einfach direkt instanziieren.
Für den 16 MHz Takt reicht ein normales IO-FlipFlop.

Damit ist deine Verzögerung festgenagelt.

MFG
Falk

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Daniel S. schrieb:
> Ich habe bereits rausgefunden, dass ich auf sogenannte Timing
> Constraints zurückgreifen muss. Allerdings weiß ich nicht wie ich diese
> in VHDL implementieren muss.
Timing-Constraints werden wie die IO-Constraints (Pinzuordnung) nicht im 
VHDL-Text eingegeben, sondern in einer Datei mit der Endung UCF (User 
Constraints File) abgelegt. In dieser Datei sollte mindestens 1 Timing 
Constraint stehen: der FPGA-Takt.

> Aus Unwissenheit heraus habe ich einfach den Clockeingang genommen
> und daraus die 32 und 16 MHz generiert
Wie hast du diese Takte generiert (Quelltext)?
Warum hast/brauchst du 2 Takte?

> Auf dem Oszilloskop ist mir aufgefallen, dass je nach Compilierung
> die Signale zueinander phasenverschoben sind.
Um wieviel? 1ns? 10ns?

von Christian R. (supachris)


Lesenswert?

Wichtig ist, wie schon gesagt, die Takte über ODDR FlipFlips auszugeben.
Zum Beispiel so:
1
USB_CLK : ODDR Port map(Q => USBclk, C => BusCLK, CE => '1', D1 => '1', D2 => '0', R => '0', S => '0');

Außerdem ist wichtig, dass sie auf einem globalen Clock-Netzwerk sind, 
also am besten per DCM erzeugen und die BUFG an den DCM Ausgängen 
aktivieren. Dann klappt das.

von Daniel S. (uc4life)


Lesenswert?

Danke für die Hilfe. Beim Recherchieren nach euren Tipps bin ich über 
ein DCM-Modul gestoßen das ich mit Hilfe eines Wizards in ISE erstellt 
habe. Dieses Modul kann unterschiedliche Takte aus einem vorgegeben Takt 
ableiten. Unteranderem auch das benötigte Ref-Clock und 1/2 Ref-Clock.

Jetzt haben die Clocksignal die selbe Phasenlage und mein Baustein läuft 
einwandfrei...

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.