Доброго времени суток.
помогите с вопросом: какие констрейны нужно задавать для АЦП тактируемого от клока с ПЛИС?
Есть отладочная плата на stratix_IV и два мезанина с 2-мя АЦП на каждом, тактирую их от входящего на ПЛИС клока (125 МГц) без преобразований, через виртуальную дифф. пару (подаю прямой и инвертированный клок). Для регистрирования входных данных использую выходящие от 4-х АЦП клоки DCO. Если использую только 2 АЦП - всё хорошо, как только добавляю ещё 2 в проект, начинаются непонятки. TimeQuest говорит что всё нормально, но в SignalTap-е вместо принимаемого тестового синуса появляется всякий мусор.
Я задавал такие констрейны:
CODE
set_time_format -unit ns -decimal_places 3
#**************************************************************
# Create Clock
#**************************************************************
create_clock -name "clk" -period 8.000ns [get_ports {clk}]
create_clock -name altera_reserved_tck -period 100.000 -waveform {0.000 50.000} [get_ports altera_reserved_tck]
derive_pll_clocks -create_base_clocks
# Описание клоков, выдаваемых АЦП:
create_generated_clock -name clk_112_0A -source [get_ports {clk}] [get_ports {clk_112_0A}]
create_generated_clock -name clk_112_1A -source [get_ports {clk}] [get_ports {clk_112_1A}]
create_generated_clock -name clk_112_0B -source [get_ports {clk}] [get_ports {clk_112_0B}]
create_generated_clock -name clk_112_1B -source [get_ports {clk}] [get_ports {clk_112_1B}]
# Описание задержки выходного DCO клока на АЦП, относительно входного:
set_clock_latency -source 4.5 [get_clocks {clk_112_0A}]
set_clock_latency -source 4.5 [get_clocks {clk_112_1A}]
set_clock_latency -source 4.5 [get_clocks {clk_112_0B}]
set_clock_latency -source 4.5 [get_clocks {clk_112_1B}]
# Описание созданных клоков, идущих на АЦП:
create_generated_clock -name chanel_0A_clk_112 -source [get_ports {clk}] [get_ports {chanel_0A_clk_112}]
create_generated_clock -name chanel_0A_clk_112n -invert -source [get_ports {clk}] [get_ports {chanel_0A_clk_112n}]
create_generated_clock -name chanel_1A_clk_112 -source [get_ports {clk}] [get_ports {chanel_1A_clk_112}]
create_generated_clock -name chanel_1A_clk_112n -invert -source [get_ports {clk}] [get_ports {chanel_1A_clk_112n}]
create_generated_clock -name chanel_0B_clk_112 -source [get_ports {clk}] [get_ports {chanel_0B_clk_112}]
create_generated_clock -name chanel_0B_clk_112n -invert -source [get_ports {clk}] [get_ports {chanel_0B_clk_112n}]
create_generated_clock -name chanel_1B_clk_112 -source [get_ports {clk}] [get_ports {chanel_1B_clk_112}]
create_generated_clock -name chanel_1B_clk_112n -invert -source [get_ports {clk}] [get_ports {chanel_1B_clk_112n}]
#**************************************************************
# Set Clock Uncertainty
#**************************************************************
derive_clock_uncertainty
#**************************************************************
# Set Multicycle
#**************************************************************
set_multicycle_path -from clk_112_0A -to clk_112_0A -setup 1
set_multicycle_path -from clk_112_0A -to clk_112_0A -hold 1
set_multicycle_path -from clk_112_1A -to clk_112_1A -setup 1
set_multicycle_path -from clk_112_1A -to clk_112_1A -hold 1
set_multicycle_path -from clk_112_0B -to clk_112_0B -setup 1
set_multicycle_path -from clk_112_0B -to clk_112_0B -hold 1
set_multicycle_path -from clk_112_1B -to clk_112_1B -setup 1
set_multicycle_path -from clk_112_1B -to clk_112_1B -hold 1
#**************************************************************
# Set Input Delay
#**************************************************************
set_input_delay -add_delay -clock [get_clocks {altera_reserved_tck}] 20.000 [get_ports {altera_reserved_tdi}]
set_input_delay -add_delay -clock [get_clocks {altera_reserved_tck}] 20.000 [get_ports {altera_reserved_tms}]
set ext_Tsu_typ 2.9
set ext_Th_typ 3.0
# Входная задержка данных от АЦП по исходящему от АЦП клоку:
set_input_delay -clock "clk_112_0A" -add_delay -max [expr $ext_Tsu_typ] [get_ports {chanel_0A_dat_112[*]}]
set_input_delay -clock "clk_112_0A" -add_delay -min [expr $ext_Th_typ] [get_ports {chanel_0A_dat_112[*]}]
set_input_delay -clock "clk_112_1A" -add_delay -max [expr $ext_Tsu_typ] [get_ports {chanel_1A_dat_112[*]}]
set_input_delay -clock "clk_112_1A" -add_delay -min [expr $ext_Th_typ] [get_ports {chanel_1A_dat_112[*]}]
set_input_delay -clock "clk_112_0B" -add_delay -max [expr $ext_Tsu_typ] [get_ports {chanel_0B_dat_112[*]}]
set_input_delay -clock "clk_112_0B" -add_delay -min [expr $ext_Th_typ] [get_ports {chanel_0B_dat_112[*]}]
set_input_delay -clock "clk_112_1B" -add_delay -max [expr $ext_Tsu_typ] [get_ports {chanel_1B_dat_112[*]}]
set_input_delay -clock "clk_112_1B" -add_delay -min [expr $ext_Th_typ] [get_ports {chanel_1B_dat_112[*]}]
#**************************************************************
# Set Output Delay
#**************************************************************
set_output_delay -add_delay -clock [get_clocks {altera_reserved_tck}] 20.000 [get_ports {altera_reserved_tdo}]
#**************************************************************
# Set Clock Groups
#**************************************************************
set_clock_groups -asynchronous -group {clk}
set_clock_groups -asynchronous -group {clk_112_0A}
set_clock_groups -asynchronous -group {clk_112_1A}
set_clock_groups -asynchronous -group {clk_112_0B}
set_clock_groups -asynchronous -group {clk_112_1B}
set_clock_groups -asynchronous -group {altera_reserved_tck}
#**************************************************************
# Set False Path
#**************************************************************
# Исключаем анализ путей сигналов разрешения:
set_false_path -from * -to [get_ports chanel_0A_OE_n]
set_false_path -from * -to [get_ports chanel_1A_OE_n]
set_false_path -from * -to [get_ports chanel_0B_OE_n]
set_false_path -from * -to [get_ports chanel_1B_OE_n]
set_false_path -from * -to [get_ports chanel_0A_SPI_CS_n]
set_false_path -from * -to [get_ports chanel_1A_SPI_CS_n]
set_false_path -from * -to [get_ports chanel_0B_SPI_CS_n]
set_false_path -from * -to [get_ports chanel_1B_SPI_CS_n]
Кроме того, подскажите:
- Нужно ли задавать задержки клока и данных на плате, или при условии их равенства они компенсируются? (при приведённых констрейнах я пробовал их описывать, но это ничего не дало, к тому же я их мерил вручную осциллографом, и весьма не уверен в их точности);
- Как лучше задавать задержку выходящего от АЦП клока DCO, относительно входящего clk - через clock latency или прописывать через параметр -offset?
- По поводу задержки на портах, как я понимаю, для min/max входной задержки нужно указывать min/max Tco. В даташите на АЦП я нашёл только параметры Tso и Th, могу ли я использовать их в этих целях?
- Правильно ли я понимаю, что если Th для группы входного клока ~ 0.3 ns, это не есть хорошо?
В приведённом sdc файле я использовал мультициклы. Без них Th~ 0.3 ns, с ними ~ 8 ns, но проект всё равно нормально не работает (
Если есть какие соображения у кого - поделитесь пожалуйста!