Hur hittar jag optimal FPGA timing

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Hur hittar jag optimal FPGA timing

Inlägg av rehnmaak »

Jag har en ad-omvandlare som körs med 100M Sampel/s. Datautgångarna från ADC:n är kopplade till en FPGA och även klocksignalen till ADC:n kommer från FPGA:n. Fasläget på klockan från FPGA till ADC:n går att justera (med DCM:er för er som känner till Xilinx). Eftersom klockan till ADC går att justera så kan jag alltså styra hur lång tid före den INTERNA klockan data från ADC:n ska komma.

Så frågan jag har är hur kan jag veta att jag har optimalt fas-läge på klockan till ADC:n? ADC:n (AD9215 från Analog) har inget testläge som jag har sett finns på AD-omvandlare från andra tillverkare vilket skulle ha gjort det enklare att testa.
bearing
Inlägg: 11259
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Hur hittar jag optimal FPGA timing

Inlägg av bearing »

Såhär står det i databladet:
"The AD9215 provides latched data outputs with a pipeline delay of five clock cycles. Data outputs are available one propagation delay (tOD) after the rising edge of the clock signal. Refer to Figure 2 for a detailed timing diagram."

tOD är typ 4.8 ns och max 6.5 ns.

Kanske missar jag något här, men borde inte optimalt vara t.ex. 2/3 (6,66 ns) eller 3/4 (7,5ns) förskjutning?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Re: Hur hittar jag optimal FPGA timing

Inlägg av rehnmaak »

tOD är ju 2.5ns - 6.5ns dvs klockning bör ske -3.5ns till 2.5ns optimalt är alltså -0.5ns.

Enligt timingrapporten så ska data vara stabilt 3.6ns - 7.4ns (typiskt 5.5ns) efter klockan. Så jag måste alltså fasvrida klockan 6ns, alternativt invertera klockan och fördröja 1ns.

Hellst skulle jag dock vilja med någon experimentell metod justera klockan till optimalt läge. Det är väl mest det jag skulle behöva några ideer på hur jag ska göra.

EDIT: Med 6ns fördröjning blir data stabilt -2.5ns före klockan och hold 8.5ns efter klockan.

Timing rapporten:

Kod: Markera allt

Setup/Hold to clock clk
------------+------------+------------+------------------+--------+
            |Max Setup to|Max Hold to |                  | Clock  |
Source      | clk (edge) | clk (edge) |Internal Clock(s) | Phase  |
------------+------------+------------+------------------+--------+
adc0<0>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<1>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<2>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<3>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<4>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<5>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<6>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<7>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<8>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc0<9>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc1<0>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc1<1>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc1<2>     |   -3.632(R)|    7.407(R)|sys_clk_100       |   0.000|
adc1<3>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<4>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<5>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<6>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<7>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<8>     |   -3.633(R)|    7.408(R)|sys_clk_100       |   0.000|
adc1<9>     |   -3.616(R)|    7.388(R)|sys_clk_100       |   0.000|
------------+------------+------------+------------------+--------+

DigitalGnomE
Inlägg: 1
Blev medlem: 31 januari 2011, 20:58:30

Re: Hur hittar jag optimal FPGA timing

Inlägg av DigitalGnomE »

För att bestämma den minsta tiden som behövs för en säker signalöverföring från A/D -> FPGA på en signalledning får du följande:

T_min = T_output + T_clkskew + T_setup + T_flight

T_output = tOD (tiden från klockflank till giltig utdata från A/D)
T_clkskew = skillnaden i ankomsttid (positiv eller negativ) mellan två D-vippor klockade av samma klocka. Notera att klocksignalen till A/D:n också kan ha en "T_flight" (se nedan), som inräknas i total skew.
T_setup = setup-tiden för I/O-buffern + D_vippa i FPGA:n
T_flight = (Längden på ledningen) / (Signalens utbredningshastighet)

Det framgår inte av din beskrivning om ledningarna är korta.
Ska systemets maximala möjliga klockfrekvens (1/T_min) bestämmas, ska du använda max-värden i högerledet ovan.

Hur mycket skew du kan tillåta på klockan blir ett laborerande med formeln ovan.
T_min = 10 ns. Tillåten skew beror starkt på tOD:s värde. Setup-tiden i FPGA:n går kanske att få ner något. Det beror på hur du fått din syntes+routing i FPGA:n. Går indata direkt från I/O-buffern på FPGA:n till en D-vippa det första den gör?

Min enda idé för att få fram ett faktiskt värde på tOD, är att mäta med oscilloskop eller motsvarande med klockflanken på den ena kanalen på oscilloskopet och dataledningarna en och en på den andra kanalen (med 100 MHz klocka in på A/D:n). Eftersom du kommer mäta snabba flanker och stigtiderna hos komponenterna grovt räknat bestämmer frekvensinnehållet i signalen , behöver du ett oscilloskop med hög bandbredd (flera ggr 100 MHz) och lämplig prob, vilket kanske inte är en särskilt praktisk eller ekonomisk lösning. Du kan vilja prova med en lägre system-frekvens när du mäter/laborerar. Med ett prototypkort med en ingång för variabel klockfrekvens via t ex en sma-kontakt, kan man prova sig fram till en systemfrekvens som fungerar.

Lycka till!
Skriv svar