ADC vom MAX10 erzeugt Timing Violation

OP #5452370
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?
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #5452675
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...
OP #5452826
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....
#5452849
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.
OP #5452959
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.
OP #5452989
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]
OP #5452998
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?
Moderator (Firma: Titel) Persönliche Seite #5453005
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.
OP #5453024
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]
#5453185
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren