Altera_Forum
Honored Contributor
11 years agoCyclone V readout of 300MHz DDR interface not meeting timing
Hi all,
I'm trying to use the Cyclone V SoCKit from Terasic (http://www.terasic.com.tw/cgi-bin/page/archive.pl?language=english&no=816) to read out a daughter card containing an LTC2153-14 ADC (http://www.linear.com/product/ltc2153-14). The ADC interface is source synchronous DDR, running at 300MHz, so 600Mbps. I'm using the ALTDDIO_IN module to translate the ADC's 7-bit DDR words into 14-bit parallel words inside the FPGA. The design is failing timing in TimeQuest, and I'm not sure how to proceed. My timing constraint file is below. A reference design showing this timing failure is also attached.# SDC file for this bare-bones version, just to see how fast the ADC_DDR runs# Create the reference clock
create_clock -name r_clk -period 50MHz
# ########################################################################################################### Constrain the LTC2153-14 ADC DDR I/F:# Identify a virtual clock as the "launch clock" (i.e., clock the data valid edges).
create_clock -name vclk -period 300MHz
# Identify ADC_ENC # From datasheet, Tenc-to-data_valid_low# min = 1.7ns# typ = 2.0ns# max = 2.3ns# So, the rising edge occurs -2.0ns typ before vclk falling edge (i.e, the rising edge is at -2.0 - Tc/2)# Since -waveform doesn't allow negative numbers, so we advance by Tc until we get a positive edge
create_clock -name adc_enc -period 300MHz -waveform { 3.000 4.666 }
# Identify ADC_CLKOUT as the input clock # From datasheet, Tskew = 0.4ns# So, rise edge occurs at -0.4ns before vclk rising edge# Since -waveform doesn't allow negative numbers, advance by 360deg = Tc
create_clock -name adc_clkout -period 300MHz -waveform { 2.933 4.600 }
# Identify the DDR latch clock, which is a same edge transfer at the center of the data eye# Want to latch data at center of data-valid period. # Nominally, 360deg x (Tc/4 + Tskew)/Tc
create_generated_clock -name ddr_clk
-source .gpll~PLL_OUTPUT_COUNTER|vco0ph}]
.gpll~PLL_OUTPUT_COUNTER|divclk}] -phase 135 -add
derive_pll_clocks
derive_clock_uncertainty
# From datasheet, Tenc-to-data_valid_skew (i.e., ADC_ENC to ADC_D skew):# min = 0.30ns# typ = 0.40ns# max = 0.55ns# So, max delay = 0.55ns - 0.40ns = 0.15ns# min delay = 0.30ns - 0.40ns = -0.10ns
set_input_delay -clock vclk -max 0.15
set_input_delay -clock vclk -min -0.10
set_input_delay -clock vclk -max 0.15 -clock_fall -add_delay
set_input_delay -clock vclk -min -0.10 -clock_fall -add_delay
# Add a false path statements for edges that should not be analyzed (this one is easiest to see with# a timing diagram).
set_false_path -setup -rise_from -fall_to
set_false_path -setup -fall_from -rise_to
set_false_path -hold -rise_from -rise_to
set_false_path -hold -fall_from -fall_to
# Don't analyze some paths
set_false_path -from -to *
set_false_path -from -to *
set_false_path -from -to *
Note that I'm using the "Explicit Shift" method discussed in Rysc's Source Synchronous Timing guide on the altera wiki (http://www.alterawiki.com/wiki/file:source_synchronous_timing.pdf), which has been very helpful. I feed the 300MHz adc_clkout signal (i.e., the parallel clock coming in with the data) to an altera_pll run in source synchronous mode, and apply a 135deg phase shift in order to generate ddr_clk, which clocks the ALTDDIO_IN registers. Note that 135deg phase shift is used instead of a simple 90deg phase shift because the ADC's datasheet says the data transition edges are 0.4ns after the adc_clkout edges, so 135deg is necessary to center the latching clock on the data eye. I need help understanding if I'm doing the timing analysis incorrectly (n.b. this is the first time I've worked wtih a source sychronous I/F, and I'm worried I'm missing something obvious), or else if the Cyclone V IOE registers just aren't fast enough for 600Mbps. If the latter, could others provide suggestions on how to make the design meet timing? Any help is greatly appreciated!