vlso 0 21 февраля, 2014 Опубликовано 21 февраля, 2014 · Жалоба Доброго времени суток ! Прошу совета опытных разработчиков, знатоков Altera TimeQuest Analyzer. Не могу понять особенностей работы FPLL в Cyclone5. Quartus 13.1 Web Edition, FPGA Cyclone 5 GT - 5CGTFD5C5F23C7 Исследую особенности нового для себя семейства Cyclone5 GT. Создал маленький тестовый проект на AHDL. Все входы и выходы LVTTL 3.3v. Потом сделал 2.5v - разницы почти нет. Имеется глобальный сигнал тактовой частоты 100 MHz, подаваемый на вход GCLK. Имеются два входа и два выхода (можно и по одному - просто два для более достоверной статистики и сравнения между собой). Имеются две независимых группы триггеров по три триггера в каждой группе с общим сигналом тактовой частоты. Первый триггер захлопывает данные с входа, второй захлопывает первый, а третий захлопывает второй и соединен с выходом. В общем простейшая цепочка триггеров с входа на выход. Крайние триггеры нужны, чтобы их запихать в IOE. Средние триггеры так, для порядка (привычка с семейства ACEX). :) Первый этап - проверка входных цепей (setup, hold). Пока на нём и застрял... В .sdc файле TimeQuest Analyzer указал, что входной сигнал валиден за 3 нс до положительного фронта тактовой частоты и 0 нс после. TimeQuest Analyzer выдал 0.629ns setup slack и 0.973 ns hold slack. Cуммарный slack примерно 1.6ns для самого тяжелого варианта использования (Slow 1100mV 85C). Не густо, но терпимо. То есть окно валидных данных на входном триггере за счет особенностей FPGA уменьшилось на 1.4 ns. Решил проверить работу FPLL. Создал мегавизардом вариацию, которая ничего не делает с входной тактовой частотой (PLL в NORMAL mode) в плане частоты и фазы. Просто умножает на 3, а потом делит на 3, сохраняя фазу (подстраиваясь к входной тактовой частоте). Подал тактовую частоту с выхода FPLL на входа всех триггеров. Входные триггеры разумеется разместил в IOEs. По идее, за счёт PLL, тактовая частота на портах .clk первого триггера практически приближается по фазе к искомой, что на пине. В .sdc файле соответственно добавил в группу тактовую частоту FPLL. Почему-то ожидал соизмеримых slack-ов, а получил печальную картину. Setup slack 0.042 ns, hold slack 0.4 ns. Долго колупался. Перепробовал все мыслимые и немыслимые настройки, пробовал все 13-ые версии Quartus, но значимо изменить суммарный slack, относительно выходной тактовой частоты PLL на .clk входе триггера, не получилось. Заметил, что если подавать тактовую частоту на другие шарики GCLK, то суммарный slack немного вырастает примерно до 0.85 ns. Видно зависит от того, через какой именно CLKCTRL будет выход PLL пропущен. А теперь самое интересное. Если проект компилировать под Cyclone4, то суммарный slack с этой же схемой с PLL и аналогичным .sdc файлом около 1.8 ns ! Неужели так всё ухудшили в Cyclone 5... Сравнил отчеты cyclone4 и cyclone5. Время компенсации GCLK для PLL при расчете setup почти такое же, как и для HOLD. Соответственно и задержки в CLKCTRL то же. А вот для Cyclone5 они уже начинают разбегаться заметнее. Думал дело в кривости новой мегафункции altera_pll вместо altpll. Проверил. Компилировал с altpll. Quartus успешно скомпилировал altpll для cyclone5, но slack-и от этого ничуть не выросли. Подскажите в чем я заблуждаюсь. Может в .sdc файле что не то сделал, но ведь в cyclone4 были те же .sdc Идеи уже почти кончились. Ниже привожу исходники, а также весь проект в аттаче. include "FPLL.inc"; SUBDESIGN main ( clk : input; -- 100Mhz core clock from external PLL chip reset : input; ina : input; outa : output; inb : input; outb : output; locked : output; ) VARIABLE inaL : dff; midaL : dff; outaL : dff; inbL : dff; midbL : dff; outbL : dff; FPLLM : FPLL; BEGIN FPLLM.refclk=clk; FPLLM.rst=!reset; -->FPLLM.outclk_0 -->FPLLM.locked locked=FPLLM.locked; inaL.clk=FPLLM.outclk_0; inaL=ina; midaL.clk=FPLLM.outclk_0; midaL=inaL; outaL.clk=FPLLM.outclk_0; outaL=midaL; outa=outaL; inbL.clk=FPLLM.outclk_0; inbL=inb; midbL.clk=FPLLM.outclk_0; midbL=inbL; outbL.clk=FPLLM.outclk_0; outbL=midbL; outb=outbL; END; main.sdc файл: set_time_format -unit ns -decimal_places 3 create_clock -name {clk} -period 10.000 -waveform { 0.000 5.000 } [get_ports {clk}] derive_pll_clocks -create_base_clocks derive_clock_uncertainty set_clock_groups -exclusive -group {clk FPLLM|fpll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk} # delay calculation: x=period-Tsu set_input_delay -clock "clk" -max 7ns [get_ports {ina}] set_input_delay -clock "clk" -max 7ns [get_ports {inb}] # delay calculation: x=Th set_input_delay -clock "clk" -min 0ns [get_ports {ina}] set_input_delay -clock "clk" -min 0ns [get_ports {inb}] и .qsf настройки: set_global_assignment -name FAMILY "Cyclone V" set_global_assignment -name DEVICE 5CGTFD5C5F23C7 set_global_assignment -name TOP_LEVEL_ENTITY main set_global_assignment -name ORIGINAL_QUARTUS_VERSION "13.0 SP1" set_global_assignment -name PROJECT_CREATION_TIME_DATE "14:54:42 FEBRUARY 13, 2014" set_global_assignment -name LAST_QUARTUS_VERSION 13.1 set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "ACTIVE SERIAL X1" set_global_assignment -name USE_CONFIGURATION_DEVICE ON set_global_assignment -name STRATIXII_CONFIGURATION_DEVICE EPCS64 set_global_assignment -name GENERATE_TTF_FILE ON set_global_assignment -name GENERATE_RBF_FILE ON set_global_assignment -name CRC_ERROR_OPEN_DRAIN OFF set_global_assignment -name ON_CHIP_BITSTREAM_DECOMPRESSION OFF set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "2.5 V" set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_50MHZ set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON set_global_assignment -name TIMEQUEST_DO_CCPP_REMOVAL ON set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR" set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)" set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL NORMAL set_location_assignment PIN_E10 -to clk set_location_assignment PIN_A5 -to ina set_location_assignment PIN_A12 -to inb set_global_assignment -name SDC_FILE main.sdc set_global_assignment -name AHDL_FILE main.tdf set_global_assignment -name QIP_FILE FPLL.qip set_global_assignment -name SIP_FILE FPLL.sip set_global_assignment -name OPTIMIZATION_TECHNIQUE SPEED set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING ON set_global_assignment -name FITTER_EFFORT "STANDARD FIT" set_instance_assignment -name FAST_INPUT_REGISTER ON -to ina set_instance_assignment -name FAST_INPUT_REGISTER ON -to inb set_instance_assignment -name PLL_FEEDBACK_CLOCK_SIGNAL "GLOBAL CLOCK" -to "*FPLL_0002*|altera_pll:altera_pll_i*|*outclk_wire[0]" set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top Test.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 21 февраля, 2014 Опубликовано 21 февраля, 2014 · Жалоба Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Konst_777 0 21 февраля, 2014 Опубликовано 21 февраля, 2014 · Жалоба ...Почему-то ожидал соизмеримых slack-ов, а получил печальную картину. Setup slack 0.042 ns, hold slack 0.4 ns.... Info (332146): Worst-case setup slack is 9.401 Info (332146): Worst-case hold slack is 0.227 Info (332146): Worst-case minimum pulse width slack is 1.250 Что я делаю не так ? :rolleyes: Test_5CGTFD5C5F23C7.7z Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlso 0 24 февраля, 2014 Опубликовано 24 февраля, 2014 · Жалоба Вы ничего не упомянули о величинах автоматически программируемых задержек в IOE. Чем они больше, тем меньше slack, так как задержки некалиброванные. Надо руками подкручивать фазу клока в PLL так, чтобы минимизировать задержки в IOE. Спасибо за совет. Попробовал. Подогнал так, чтобы обе задержки убрать до 0. Немножко улучшилось - суммарный slack увеличился примерно на 0.1ns. Но в целом картина всё равно заметно хуже, чем совсем без PLL (напрямую с GCLK). Info (332146): Worst-case setup slack is 9.401 Info (332146): Worst-case hold slack is 0.227 Info (332146): Worst-case minimum pulse width slack is 1.250 Что я делаю не так ? :rolleyes: В .sdc файле Вы не включили оба тактовых сигнала в одну группу. Поэтому TimeQuest совсем не стал анализировать путь от входного тактового сигнала до первого триггера. Он попросту игнорировал в sdc ограничения 7ns/0ns и посчитал просто по периоду 10ns. Поэтому Вы привели только setup и hold slack для среднего и выходного триггера. К тому же Вы привели самый быстрый случай FAST 1100mA 0C. Я же приводил для Slow 1100mV 85C. В вашем примере для Slow 1100mV 85C на внутреннем триггере получается чуть хуже, но меньше 1 ns. Если бы так или близко к этому было бы на входном триггере в IOE, то у меня вопрос бы не возник. В любом случае, большое спасибо за рабочий пример на verilog-е. Всё равно мне надо его осваивать потихоньку будет. Так что вопрос для меня пока остаётся открытым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tue 0 28 апреля, 2015 Опубликовано 28 апреля, 2015 · Жалоба Начал тоже более плотно общаться с Cyclone 5 и также недоумеваю насчет ужасных таймингов на IO. Вот моя тема http://electronix.ru/forum/index.php?showtopic=127523 (там еще какие-то проблемы с командой derive_pll_clocks). Но даже если без нее, задержки по сравнению с Cylone 4 просто огромные. Так и не пойму в чем дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться