djhall 0 19 мая Опубликовано 19 мая · Жалоба Доброго дня, Для меня очевидно, что временные ограничения придумали в аду, поэтому хотелось бы попросить помощи сообщества, чтобы лучше их понять. Дизайн простой: - clk - тактовая частота 50 МГц - PLL создаёт две частоты clk[0] и clk[1] по 100 МГц. Никаких сдвигов между частотами нет. - Двунаправленная шина данных data_io. Все регистры входные и выходные регистры тактируются от clk[0] - Внешнее устройство тактируется от clk[1] Как я знаю есть два вида синхронизации: System Synchronous и Source Synchronous. System Synchronous это когда FPGA и внешнее устройство тактируются от одного внешнего по отношению к FPGA тактового генератора. Source Synchronous в свою очередь делится на: - Source Synchronous Outputs - тактовая частота рождается в FPGA и тактирует внешнее устройство, данные передаются от FPGA к внешнему учстройству. - Source Synchronous Inputs - тактовая частота рождается во внешнем устройстве и тактирует FPGA, данные передаются от внешнего устройства к FPGA. Далее Source Synchronous интерфей делется на целый зоопарк различных вариантов: Center-Aligned, Edge-Aligned, Skew Based, Setup/Hold Based. Причём различные производители Intel и AMD имеют разную терминологию. Выходит, что дизайн описанный выше при работе на выход подходит под Source Synchronous Outputs, а при работе как вход уже не подходит под Source Synchronous Inputs, т.к. тактовая частота генерируется внутри FPGA, а не внешним устройством. SDC файл такой: #(tSU внешнего устройства) set tSU 1.7 #(tH внешнего устройства) set tH 1.0 #(max задержка дорожек печатной платы) set trce_dly_max 0.2 #(min задержка дорожек печатной платы) set trce_dly_min 0.1 set t_out_max [expr $trce_dly_max + $tSU] # 1.9 ns set t_out_min [expr $trce_dly_min - $tH] # -0.9 ns create_clock -name clk -period 20.000 [get_ports {clk}] derive_pll_clocks -create_base_clocks derive_clock_uncertainty create_generated_clock -name output_clock -source [get_pins {pll_top_1_inst|altpll_component|auto_generated|pll1|clk[1]}] [get_ports {clk_out}] set_output_delay -max -clock output_clock $t_out_max [get_ports {data_io[*]}] -add_delay set_output_delay -min -clock output_clock $t_out_min [get_ports {data_io[*]}] -add_delay Как расчитать set_input_delay? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 53 20 мая Опубликовано 20 мая · Жалоба 8 часов назад, djhall сказал: Как расчитать set_input_delay? Тут ничего рассчитывать не нужно, нужно просто задать задержку, вносимую внешними цепями в пути данных. set_input_delay как бы говорит анализатору (STA), что, мол, там снаружи сигнал ещё задерживается на столько-то, поэтому у тебя вот бюджет таймингов уменьшается на эту величину. Например, если снаружи нет ничего, кроме проводников на плате, и их длина такая, что задержкой в них можно пренебречь, то следует указать значение ноль. Если есть какие-то ощутимые задержки, то их и указать. Особенно это касается случаев, когда данные, например, проходят через какой-то буфер, который вносит пару нс, причём, там ещё и разброс значений присутствует -- тогда для max и min будут разные значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться