Forum: FPGA, VHDL & Co. ADC vom MAX10 erzeugt Timing Violation


von Martin O. (ossi-2)


Angehängte Dateien:

Lesenswert?

Wenn ich den internen ADC im MAX10 verwende resultieren immer Timing 
Violations. Dabei haben die Ausgangssignale dann einen slack von ca 
-750.

Ich habe oben mal den Code angehängt. Der Code ist etwas länglich, aber 
stärker kürzen ging kaum. Relevant ist das Signal ADCval[0], das aus dem 
ADC-Block kommt ( eoc Signal verhält sich genauso)

Wenn ich, um LED2 anzusteuern, Variante 1 wähle, d.h. ich schicke 
ADCval[0] durch ein Register, tritt der Fehler auf. Ohne das 
Zwischenregister (Variante2) taucht keine Violation auf.

Hat einer ne Idee, woher -750 ns slack kommen ? Kann es sein, dass die 
Ausgangssignale des ADC in einer 1MHZ Takt Domäne liegen?

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


Lesenswert?

Martin O. schrieb:
> Kann es sein, dass die Ausgangssignale des ADC in einer 1MHZ Takt Domäne
> liegen?
wire clk_100 ;
wire clk_50 ;
wire clk_10 ;
wire clk12M ;
Das Problem an diesem Design ist, dass du viel zu viele Takte verwendest 
(alles mehr als 1 Takt ist zu viel, auf jeden Fall in einem 
Anfängerdesign).
Mein Tipp: nimm mal nur 1 Takt und mach den Rest mit daraus abgeleiteten 
synchronen Clock-Enables. So geht aktuelles FPGA-Design und dann 
bekommst du solche selbstgemachten Probleme nicht mehr.

BTW: so werden schon gleich gar keine Takte erzeugt:
assign clk_50=cntr100[0] ;
Stattdessen nimmt man die mit dem FPGA gekauften Clockmanager. Haben ja 
auch Geld gekostet...

: Bearbeitet durch Moderator
von Martin O. (ossi-2)


Lesenswert?

An dem geschilderten Problem ist aber nur der Takt clk_10 beteiligt. Die
anderen Takte sind nur aus dem Original übriggeblieben.

Mir ist klar, dass die Verwendung mehrerer Takte gegen die "Reine Lehre" 
verstösst, aber der ADC im MAX10 muss z.B. aus einem PLL-Block mit Takt 
beliefert werden (mit 10MHz). Wenn ich dann noch einen schnellen Takt 
vorsehe (100MHz) dann habe ich schon zwei....

von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> Mir ist klar, dass die Verwendung mehrerer Takte gegen die "Reine Lehre"
> verstösst, aber der ADC im MAX10 muss z.B. aus einem PLL-Block mit Takt
> beliefert werden (mit 10MHz). Wenn ich dann noch einen schnellen Takt
> vorsehe (100MHz) dann habe ich schon zwei....

Die grossen MAX10 haben 4 PLLs, jede davon kann fünf clocks verwalten - 
da gibt's wirklich keinen Grund, damit rumzugeizen (nicht mal bei den 
Kleinen, die nur zwei PLLs haben).

Mit "handgemachten" Clocks machst Du dir jedenfalls mehr Ärger.

von Martin O. (ossi-2)


Lesenswert?

Streicht einfach die Clocks clk_100 und clk_50 aus obigem Design, die 
werden dort eh nicht benutzt. Dann bleibt nur clk_10 PLL-generiert 
übrig. Das Design entspricht dann der Empfehlung "nur ein Takt" (aus dem 
ADC kommt aber ein Takt raus).

Das Problem mit der Timing-Violation bleibt aber bestehen.

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


Lesenswert?

Martin O. schrieb:
> Das Problem mit der Timing-Violation bleibt aber bestehen.
1
clkin_from_pll_c0  // Clock source from PLL1 c-counter[0] at BL corner or PLL3 c-counter[0] at TL corner
Kommt der 10MHz Takt auch tatsächlich von Unten Links oder Oben Links?

von Martin O. (ossi-2)


Lesenswert?

Ich kann zumindest jetzt die Timing-Violation unterdrücken mit:

set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]

das geht für ein Bit. Wie kann ich das abkürzend schreiben wenn ich 12 
Bits habe? Also :


set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]
set_false_path -from adc1|wire_from_adc_dout[1] -to ADCregistered[1]
...
set_false_path -from adc1|wire_from_adc_dout[11] -to ADCregistered[11]

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


Lesenswert?

Martin O. schrieb:
> Ich kann zumindest jetzt die Timing-Violation unterdrücken mit:
> set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]
Du kannst sie unterdrücken, du hast sie aber immer noch. Das ist wie 
"wegklicken"...

: Bearbeitet durch Moderator
von Martin O. (ossi-2)


Lesenswert?

Deswegen habe ich ja die ursprüngliche Frage gestellt: Woher kommen beim 
MAX10 ADC die Timing-Violations. (Siehe Original Post) Da bin ich auch 
noch nicht wirklich weitergekommen.

Wenn man ein Signal aus der einen Clock-Domäne in die andere 
"einsynchronisiert" dürfte eigentlich auch ne Timing-Violation erzeugt 
werden oder? Ist da die Verwendung von false_path erlaubt?

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


Lesenswert?

Martin O. schrieb:
> Woher kommen beim MAX10 ADC die Timing-Violations. (Siehe Original Post)
> Da bin ich auch noch nicht wirklich weitergekommen.
Hast du im Report mal nachgeschut, wo deine PLL sitzt?

> Wenn man ein Signal aus der einen Clock-Domäne in die andere
> "einsynchronisiert" dürfte eigentlich auch ne Timing-Violation erzeugt
> werden oder? Ist da die Verwendung von false_path erlaubt?
Ja und eigentlich nur da.

: Bearbeitet durch Moderator
von Martin O. (ossi-2)


Lesenswert?

"Hast du im Report mal nachgeschut, wo deine PLL sitzt?"

Was meinst Du mit "wo die PLL sitzt". Die PLL erzeugt aus dem 
angeschlossenen 12MHz MEMS Oszillator Takte von 10MHz und 100MHz. Klappt 
auch, soweit messbar. Der 10MHz Takt geht dann an den ADC (der auch 
ordnungsgemäss arbeitet.)



Die Frage bleibt:

set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]

Geht für ein Bit. Wie kann ich das abkürzend schreiben wenn ich 12
Bits habe? Also :


set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]
set_false_path -from adc1|wire_from_adc_dout[1] -to ADCregistered[1]
...
set_false_path -from adc1|wire_from_adc_dout[11] -to ADCregistered[11]

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


Lesenswert?

Martin O. schrieb:
> Was meinst Du mit "wo die PLL sitzt".
Ob eine der linken PLL zur Erzeugung des Taktes genutzt wird. So wie der 
ADC das offenbar braucht
Oder ob eine der rechten PLL verwendet und der Takt umständlich nach 
links geroutet wird.

von Markus F. (mfro)


Lesenswert?

Martin O. schrieb:
> Geht für ein Bit. Wie kann ich das abkürzend schreiben wenn ich 12
> Bits habe? Also :
>
> set_false_path -from adc1|wire_from_adc_dout[0] -to ADCregistered[0]

mit Tcl-Wildcards:
1
set_false_path -from adc1|wire_from_adc_dout[*] -to ADCregistered[*]

Aber wie schon gesagt: wenn Du die Timing-Violation-Meldung unterdrückst 
ist die Timing-Violation deshalb nicht weg.

: Bearbeitet durch User
von Martin O. (ossi-2)


Lesenswert?

@Lothar M.

Es wird eine linke PLL verwendet, die Wege dahin sind ziemlich kurz.

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.