Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TimeQuest, кто ж тебя выдумал?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
ViKo
Возясь со своим реальным проектом, сделал простой учебный. Пытаюсь разобраться в констрейнах (хотя некогда считал себя достаточно грамотным в этой теме).
Вот SystemVerilog проект. Ниже - констрейны для него. Работаю в Quartus 13.1, ПЛИС EP3C5E144I7.
Код
module ClockDivider (
    (* chip_pin = "84" *)    input    ResetN,
    (* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn,
    (* chip_pin = "28" *)    output    ClkOut,
    (* chip_pin = "30" *)    input    ClkSel,
    (* chip_pin = "32" *)    input    DataIn,
    (* chip_pin = "33" *)    output    DataOut
);

    bit        ClkDiv;
    always_ff @(posedge ClkIn, negedge ResetN)
        if (!ResetN)    ClkDiv <= 0;
        else            ClkDiv <= !ClkDiv;

    always_comb
        if (!ClkSel)    ClkOut = ClkIn;
        else            ClkOut = ClkDiv;
    
    always_ff @(posedge ClkOut, negedge ResetN)
        if (!ResetN)    DataOut <= 0;
        else            DataOut <= DataIn;

endmodule : ClockDivider


Код
set_time_format -unit ns -decimal_places 3

create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn

create_clock -name clk_virt -period "100 MHz"

create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn

# derive_clocks

derive_clock_uncertainty

set_input_delay -clock clk_virt -min 0.0 ClkSel
set_input_delay -clock clk_virt -max 1.0 ClkSel

set_input_delay -clock clk_virt -min 0.0 ResetN
set_input_delay -clock clk_virt -max 1.0 ResetN

set_input_delay -clock clk_virt -min 0.0 DataIn
set_input_delay -clock clk_virt -max 1.0 DataIn

set_output_delay -clock clk_virt -min -2.0 ClkOut
set_output_delay -clock clk_virt -max -1.0 ClkOut

set_output_delay -clock clk_virt -min -2.0 DataOut
set_output_delay -clock clk_virt -max -1.0 DataOut

Вопросы.
Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере?
Почему для выходных сигналов пришлось сделать отрицательную задержку, иначе ограничения не выполнялись?
Когда смотрел в TimeQuest временнЫе пути, Launch Clock запускался по срезу. Прикладываю картину ниже.
Правильные ли вообще эти констрейны?
Любые советы почитаю с интересом. (К сожалению, ответить смогу только завтра, ибо предстоит культурное мероприятие).

Вот картина-отчет. Как ее интерпретировать?

Нужно ли описывать сигнал после мультиплексора как тактовый? Пишут, вроде, нужно. А что же TimeQuest не ругается?
Flip-fl0p
А разве не надо писать констрейн между вашим клоком и виртуальным ?
Код
set_clock_groups -exclusive -group ?

И ещё немаловажный вопрос :применил ли Quartus для выходных сигналов fast output registers ? На сколько мне известно без этих регистров не работает специальный блок, регулирующий задержки.
ViKo
Виртуальные такты - всегда снаружи ПЛИС. Ничего больше не надо.
По второму вопросу уже не скажу. Для данных - мог бы.

Вот для тактов в мультиплексоре группа нужна, думаю.
Alexey_Rostov
Цитата(ViKo @ Jan 7 2018, 14:06) *
Вопросы.
Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере?


Получаемую тактовую частоту вы уже описали с помощью create_generated_clock

Задержка в триггере учитывается при расчете максимально возможной частоты проекта.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла

В данном случае это время Tq clk
ViKo
Видимо, Tclk-q?
Эти времена понятны. Но разве я их описывал? Задал такты после триггера, совпадающие по фронтам с входными. А реально это не так.
krux
текст, помеченный тегами [ b ] [ /b ] - моя писанина.
Код
module ClockDivider (  [b] // Блин эти аттрибуты бы вывести нахрен в топ-левел. и в топ-левел должны остаться только связи между модулями. никакой логики, а то это какой-то базар-вокзал.[/b]
                                 [b] // хуже того, заранее становится проблемой, к чему конкретно привяжутся констрейны. как обычно беда в названиях и их поиске и назначении констрейнов[/b]
                                [b] // на соответствующие физические ячейки квартусом. всё не найденное будет проигнорировано.[/b]
    (* chip_pin = "84" *)    input    ResetN,
    (* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn,                              [b] // вот это я так понимаю фигня из соседней темы[/b]
    (* chip_pin = "28" *)    output    ClkOut,
    (* chip_pin = "30" *)    input    ClkSel,
    (* chip_pin = "32" *)    input    DataIn,
    (* chip_pin = "33" *)    output    DataOut
);

    bit        ClkDiv;
    always_ff @(posedge ClkIn, negedge ResetN)
        if (!ResetN)    ClkDiv <= 0;
        else            ClkDiv <= !ClkDiv;                      [b]// тут видно что ClkDiv тикает от ClkIn. ок. заделили пополам. ставим себе пометку - на температуре поплывёт.[/b]

    always_comb
        if (!ClkSel)    ClkOut = ClkIn;                         [b]// тут видна достаточно конкретная жопа в случае с насасыванием со входа ClkSel "иголок" и прочего мусора[/b]
        else            ClkOut = ClkDiv;                         [b]// если нужно стабильное поведение, ClkSel должен быть предварительно прорегистрен, хотя бы через double-flop[/b]
                                                                            [b]// далее, тут же видна жопа с моментом переключения из одного состояния в другое. следующим блокам просто необходим сигнал сброса при таком переключении[/b]
                                                                             [b]// если всё же необходимо изменять частоту без сброса, есть специальные техники glitch-free clock switching[/b]
    
    always_ff @(posedge ClkOut, negedge ResetN)
        if (!ResetN)    DataOut <= 0;
        else            DataOut <= DataIn;                   [b]// тут видно что DataOut тикает вместе с DataIn по ClkOut. в принципе тоже ок, но будет нормально работать только [/b]
                                                                          [b]// при отсутствии "иголок" и glitch-free переключениях частоты при помощи ClkSel)[/b]

endmodule : ClockDivider


Код
set_time_format -unit ns -decimal_places 3

create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn  [b]# OK. здесь квартус действительно увидит что 100 МГц действительно зашло на вход ClkIn.[/b]

create_clock -name clk_virt -period "100 MHz"                                     [b]# OK. создали "нечто" никуда не назначенное.[/b]

create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn [b]# OK. тактовую создали, название дали, источник показали. куда она дальше расходится будет - квартус не поймёт. нужна будет ещё одна подсказка.[/b]

# derive_clocks

derive_clock_uncertainty [b]# приняли значения по умолчанию из шаблона конкретной модели ПЛИС. ОК.[/b]

set_input_delay -clock clk_virt -min 0.0 ClkSel [b]# не понятно что имелось ввиду # здесь фактически указано, что снаружи ПЛИС задержка от 0 до 1 нс[/b]
set_input_delay -clock clk_virt -max 1.0 ClkSel [b]# поэтому нужно скорректировать её на внутренней логике от пинов  до входов always_ff и always_comb где-то внутри по ресурсам ПЛИС[/b]
                                                                      [b]# но поскольку clk_virt ни к чему не привязан, квартус ничего не понимает[/b]

set_input_delay -clock clk_virt -min 0.0 ResetN [b]# аналогично не понятно что имелось ввиду[/b]
set_input_delay -clock clk_virt -max 1.0 ResetN

set_input_delay -clock clk_virt -min 0.0 DataIn [b]# аналогично не понятно что имелось ввиду[/b]
set_input_delay -clock clk_virt -max 1.0 DataIn

set_output_delay -clock clk_virt -min -2.0 ClkOut [b]# аналогично не понятно что имелось ввиду[/b]
set_output_delay -clock clk_virt -max -1.0 ClkOut

set_output_delay -clock clk_virt -min -2.0 DataOut [b]# аналогично не понятно что имелось ввиду[/b]
set_output_delay -clock clk_virt -max -1.0 DataOut


с учетом вышесказанного - "более-менее" это хозяйство будет работать на частоте не выше 5...10 МГц.
Для 100/50 придётся переделывать.
на ClkOut констрейн не назначился - квартус его не нашел, возможно, из-за больших/маленьких букв, возможно из-за того что всё это в топ-модуле (или нет? отсюда не видно) поэтому на DataOut будет фигня от сборки к сборке.
Flip-fl0p
Вообще, если я не ошибаюсь то для мультиплексирования клоков если уж без него никак не обойтись то надо применять специальный модуль, генерируемый мегавиззардом ALTCLKCTRL.
Но там есть засада, что какие-то входы можно подключить только к PLL.
ViKo
krux, по делу есть чего сказать?
Это и есть top.
Несложно создать проект из предложенного, чтобы понять, что все работает. Тем более, написал же, это учебный нестандартный проект. Интересуюсь, какие констрейны задать, чтобы правильно описать. К самому исходнику любые претензии не имеют смысла.
Flip-fl0p
А можно уточняющий вопрос ?
Задача учебного проекта - научиться правильно констрейнить выходные сигналы с учётом мультиплексирвания клоков ?
По умолчанию считать, что проект не имеет глитчей ?
Shivers
Пример плохой, потому что мультиплексор клоков в нем описывать не требуется. И виртуальный клок не нужен - все порты достаточно относительно ClkIn констрейнить (кроме DataOut, если он синхронен ClkOut).
p.s.
Соврал. Нужен констрейнт -генерейтед клок на выходе триггера-делителя, иначе через него latency считаться не будет
krux
ViKo
по делу - выкинуть и переписать.

но для начала понять, сможете ли использовать CLKCTRL. т.е. сможете ли кинуть внешнюю (с пина на пин) петлю.
дальше законстрейнить этот входной CLKCTRL под две тактовые.
дальше по обстоятельствам

зы. я в одном своем проекте делал переключение 2,5/25/125 МГц при помощи glitch-free схемы, работало нормально. проблемы были с hold-ами на низких температурах, решилось небольшим пайплайном.
ViKo
Жажду увидеть правильные констрейны. Выкинуть любой дурак умеет, а переписать - не любой.
Какой-такой CLKCTRL?

Цитата(Flip-fl0p @ Jan 7 2018, 21:28) *
А можно уточняющий вопрос ?
Задача учебного проекта - научиться правильно констрейнить выходные сигналы с учётом мультиплексирвания клоков ?
По умолчанию считать, что проект не имеет глитчей ?

Да, пишем констрейны для проекта. А именно - ripple clock, multiplexed clock, source-synchronised project.
krux
я понял в чем проблема, в вашем чипе CLKCTRL так как я думал, работать не будет:
https://www.altera.com/content/dam/altera-w...3_ciii51006.pdf
слегка противный осадочек, когда понимаешь, что -1 поколение назад не всё было так прекрасно.

тогда надо делать glitch-free clock switching, с выводом результата опять-таки на внешний пин, и закольцовыванием его снаружи. и констрейнить закольцованный входящий клок одновременно по всем правилам (сколько вариантов частот - столько и констрейнов).
выводить можно куда угодно, заводить как обычно на GCLK

заодно если при переключениях будут ошибки - сможете осциллом найти, ибо сигналтапом это нереально.
ViKo
Насчет виртуальных тактов. Уже выбросил, заменил на те же входные ClkIn. TimeQuest съел.
Однако сейчас вычитал в Timing Analizer Cookbook.
Цитата
All input and output delays should reference a virtual clock. With that virtual clock, the Timing Analyzer
can derive and apply the correct clock uncertainty values when you use the derive_clock_uncertainty
command. If the input and output delays reference base clocks or PLL clocks rather than virtual clocks, the
intra- and inter-clock transfer clock uncertainties, determined by derive_clock_uncertainty , are
incorrectly applied to the I/O ports. Also, with virtual clocks, additional external clock uncertainties can
be applied independent of the clock uncertainties determined by derive_clock_uncertainty.

Так что, ребята, виртуальные такты нужны.
P.S. Проверил. С виртуальными тактами резервы времени меньше (более отрицательные, когда не укладываются, а именно -2.351 vs -2.332 ns).

Насчет групп тактов для мультиплексора. Задал
set_clock_groups -exclusive -group {clk_in} -group {clk_div}
Теперь диапазон рабочих задержек другой, более широкий. Положительные числа работают (не всякие).

Однако, так и не понял, почему при анализе используется срез Launch Clock clk_in.
Также нигде не увидел объяснения, почему для триггера можно задать делитель на 2 без учета задержек в нем. Не укладывается в голове.

Продолжаю копаться.
Flip-fl0p
Цитата(ViKo @ Jan 8 2018, 16:03) *
Однако, так и не понял, почему при анализе используется срез Launch Clock clk_in.

Кстати вопрос интересный. У меня ситуация аналогичная !
wolfman
А если взять другую версию Квартуса?
_Anatoliy
.
ViKo
Цитата(wolfman @ Jan 9 2018, 10:36) *
А если взять другую версию Квартуса?

Я весь проект, фактически, показал. В нем два файла: .sv и .sdc. Каждый может испытать на своем Квартусе.
Вот картину из RTL Viewer показываю, чтобы интереснее было.
warrior-2001
На клоковый вход блока DataOut подан не клок! А некий меандр с выхода мультиплексора.
Как-то так.
ViKo
Код
set_time_format -unit ns -decimal_places 3

# create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn
create_clock -name clk_in -period "100 MHz" [get_ports ClkIn]

create_clock -name clk_virt -period "100 MHz"

# create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn
create_generated_clock -name clk_div -divide_by 2 -source [get_ports ClkIn] \
    [get_registers ClkDiv]

set_clock_groups -exclusive -group {clk_in} -group {clk_div}

derive_clock_uncertainty

# set_input_delay -clock clk_virt -min 0.0 ClkSel
# set_input_delay -clock clk_virt -max 1.0 ClkSel

# set_input_delay -clock clk_virt -min 0.0 ResetN
# set_input_delay -clock clk_virt -max 1.0 ResetN

# set_input_delay -clock clk_virt -min 0.0 DataIn
# set_input_delay -clock clk_virt -max 1.0 DataIn

set_input_delay -clock clk_virt -min 0.0 [all_inputs]
# max -> iExt
set_input_delay -clock clk_virt -max 0.4 [all_inputs]

set_output_delay -clock clk_virt -min 0.0 ClkOut
# max -> -oExt
set_output_delay -clock clk_virt -max 0.8 ClkOut

set_output_delay -clock clk_virt -min 0.0 DataOut
set_output_delay -clock clk_virt -max 1.2 DataOut

# set_output_delay -clock clk_virt -min 0.0 [all_outputs]
# set_output_delay -clock clk_virt -max 1.0 [all_outputs]

set_min_delay -from ClkIn -to ClkOut 0.6
set_max_delay -from ClkIn -to ClkOut 8.0
set_min_delay -from ClkSel -to ClkOut 1.0
set_max_delay -from ClkSel -to ClkOut 8.0

С таким файлом укладывается. Такие дробные и разные числа задал только для того, чтобы легче находились на графиках.
Нужно запомнить, увеличение set_input_delay уменьшает резервы времени внутри ПЛИС (к Launch clock добавляется iExt). Аналогично, увеличение set_output_delay тоже уменьшает резервы внутри ПЛИС (от Latch clock отнимается время oExt).
В-общем, за ~7нс сигналы добираются с одного края ПЛИС на другой.

Цитата(warrior-2001 @ Jan 9 2018, 15:36) *
На клоковый вход блока DataOut подан не клок! А некий меандр с выхода мультиплексора.
Как-то так.

Вам на третью страницу: https://www.altera.com/en_US/pdfs/literatur...st_cookbook.pdf
и на седьмую.
Картину из первого сообщения комментировать не смогу. Будем считать, неправильно задал некие ограничения.
Flip-fl0p
Я как понял ваших данных работает на частоте clk_div и защелкивает данные DataOut.
У меня вопрос. А зачем Вам виртуальный клок, если у Вас есть клок относительно которого вы задаете констрейны для данных ?

ViKo
Цитата(Flip-fl0p @ Jan 9 2018, 16:03) *
Я как понял ваших данных работает на частоте clk_div и защелкивает данные DataOut.
У меня вопрос. А зачем Вам виртуальный клок, если у Вас есть клок относительно которого вы задаете констрейны для данных ?

А я же цитату привел, и цифрами подкрепил.
Я еще и такт наружу вывел.
В самом проекте не ищите смысла. Только в ограничениях для него.
Flip-fl0p
Цитата(ViKo @ Jan 9 2018, 16:05) *
А я же цитату привел, и цифрами подкрепил.
Я еще и такт наружу вывел.
В самом проекте не ищите смысла. Только в ограничениях для него.

Я просто прочитал то, на что Вы указали, и нигде не увидел того, что нужно констрейнить относительно виртуального клока.
Также сейчас перед глазами пример из "TimeQuest для чайников" - вывод пилы на синхронный параллельный ЦАП. Там так же нет никаких виртуальных клоков.
Вот я и пытаюсь понять где я перестал понимать biggrin.gif
ViKo
Цитата(Flip-fl0p @ Jan 9 2018, 16:15) *
Я просто прочитал то, на что Вы указали, и нигде не увидел того, что нужно констрейнить относительно виртуального клока.
Также сейчас перед глазами пример из "TimeQuest для чайников" - вывод пилы на синхронный параллельный ЦАП. Там так же нет никаких виртуальных клоков.
Вот я и пытаюсь понять где я перестал понимать biggrin.gif

Выше. Сообщение 14. Документ все тот же - Cookbook. Там правильные примеры.
ПЛИСка всегда с внешними устройствами работает. Если не использовать виртуальные такты, то не учтется неопределенность такта, относительно которого данные поступают на или из ПЛИС.
Разница, как видите, небольшая, около 20 ps. Можно забить.
warrior-2001
Цитата(ViKo @ Jan 9 2018, 15:42) *
Вам на третью страницу: https://www.altera.com/en_US/pdfs/literatur...st_cookbook.pdf
и на седьмую.

Никогда не порождал клоки таким образом и не планирую!
Если так породить сигнал и потом объявить его клоком - не везде получится такой клок использовать и не представляю как его можно завести на клоковое дерево ПЛИС.
Тоесть с точки зрения описания констрейнтов все корректно, но чтобы выход регистра использовать как клок для другого регистра - бррррр...
ViKo
Цитата(warrior-2001 @ Jan 10 2018, 12:23) *
Никогда не порождал клоки таким образом и не планирую!
Если так породить сигнал и потом объявить его клоком - не везде получится такой клок использовать и не представляю как его можно завести на клоковое дерево ПЛИС.
Тоесть с точки зрения описания констрейнтов все корректно, но чтобы выход регистра использовать как клок для другого регистра - бррррр...

Не зарекайтесь!
Сам заведется. Но можно и помочь, если химер боитесь.
andrew_b
Цитата(warrior-2001 @ Jan 10 2018, 12:23) *
Никогда не порождал клоки таким образом и не планирую!
не так страшен чёрт, как его малютка.
Цитата
Если так породить сигнал и потом объявить его клоком - не везде получится такой клок использовать и не представляю как его можно завести на клоковое дерево ПЛИС.
Инстанцировать глобальный буфер.
Flip-fl0p
Меня вот один вопрос мучает. А как Timequest понимает, что виртуальный клок - это клок, который мы выдаем с порта ПЛИС ?
ViKo
Цитата(Flip-fl0p @ Jan 10 2018, 13:19) *
Меня вот один вопрос мучает. А как Timequest понимает, что виртуальный клок - это клок, который мы выдаем с порта ПЛИС ?

Мы не выдаем виртуальный такт с порта или на порт. Он существует за пределами ПЛИС (виртуально). На порт или из порта идет реальный тактовый сигнал. А временные сдвиги между ними определяются по описанию create_clock, и далее по задержкам.
ViKo
В результате изучения литературы сделал следующие выводы.

set_input_delay задает задержку сигнала относительно виртуального такта,
совпадающего с реальным тактом на входе в ПЛИС. Для внешнего устройства это
будет launch такт. Положительная величина означает, сигнал приходит после такта.

set_output_delay задает задержку сигнала относительно виртуального такта,
совпадающего с реальным тактом на входе в ПЛИС. Для внешнего устройства это
будет latch такт. Положительная величина означает, сигнал выходит до такта.

Вот, картинкой подкреплю. Соответствует рисункам 13 и 12 из Cookbook. Слева - для выхода, справа - для входа.
Нажмите для просмотра прикрепленного файла
Shivers
Виртуальный клок нужен чтобы достроить граф STA на интерфейсах: по входу он создает входную арку, а по выходу - выходную. При этом можно варьировать тип арки, к примеру - выбирать фронт (rise или fall), выбирать тип проверки для этой арки (setup или hold). Но поскольку арка должна иметь два конца (иначе путь будет unconstrained), то виртуальный клок должен быть синхронен принимающему клоку (по входу) и/или запускающему (по выходу). Виртуальных клоков можно создавать сколько угодно. Но и в схеме может быть много асинхронных клоков, и тогда надо следить - какой виртуальный клок синхронен какому внутреннему клоку. Соответственно, при создании виртуальных клоков потребуется задавать дополнительные фалзпасы.

Требование алтеры констрейнить интерфейсы виртуальным клоком выглядит странно. Если констрейнить синхронный вход не относительно собственного клока, а относительно виртуального, то действительно - тайминг будет отличаться на величину uncertainty и drive adjustment клокового пина (поскольку к виртуальному клоку эти твики не применяются). Но эту разницу в тайминге куда проще упрятать в величину задержки констрейнта, чем плодить виртуальные клоки. Обычно виртуальный клок используется, чтобы констрейнить асинхронные входы, чтобы они хоть как то контролировались тулом. Либо для каких то тонких моментов вроде DDR, где констрейнить интерфейс надо по обоим фронтам клока, и может оказаться проще задать два виртуальных клока со сдвигом фазы 50%, и написать констрейнт относительно переднего фронта каждого из них. Т.е. виртуальный клок - вещь специфическая, почти как кунгфу (применяется при необходимости). Но, альтере виднее, конечно. Возможно, у них тул так специфически работает, что необходимо заводить виртуальную копию каждому интерфейсному клоку.
_Anatoliy
Цитата(ViKo @ Jan 10 2018, 16:20) *
Вот, картинкой подкреплю. Соответствует рисункам 13 и 12 из Cookbook. Слева - для выхода, справа - для входа.

Здесь похожая арифметика. Смотрели?
Timing_Constraints
ViKo
Цитата(_Anatoliy @ Jan 11 2018, 09:15) *
Здесь похожая арифметика. Смотрели?
Timing_Constraints

Да, смотрел, спасибо. Хороший документ.
И этот тоже покажем для коллекции.
http://www.alterawiki.com/wiki/TimeQuest_User_Guide
Жаль, на дописал его Райан Сковиль.

Цитата(Shivers @ Jan 11 2018, 08:30) *
Возможно, у них тул так специфически работает, что необходимо заводить виртуальную копию каждому интерфейсному клоку.

Это несложно. rolleyes.gif Все задержки снаружи ПЛИС описывать виртуальными тактами.
Я описываю задержки в АЦП и в дорожках на плате, подключенных к ПЛИС. И т.п. Все, как в учебниках.
dima32rus
Цитата(ViKo @ Jan 11 2018, 10:45) *
и в дорожках на плате, подключенных к ПЛИС

Не поделитесь методикой?
ViKo
Цитата(dima32rus @ Jan 11 2018, 12:45) *
Не поделитесь методикой?

Все согласно сказанному выше. Проверил только что. Вот фрагменты из sdc файла.
Там некоторые данные и такты инверсные используются. Так LVDS развелись.
И еще длина дорожек (задержка) разные в разных цепях шины. Это уже разводчики постарались. Убил бы сейчас.
CODE
# Задержка распространения рассчитана на калькуляторе Saturn PCB
# Microstrip, W = 0.250 mm, H = 0.345 mm, FR-4 STD, 0.18 + 0.18 µm (Zo = 77 Ohm)
# было Tpd = 0.00563
# Saturn PCB V6.88, Conductor Impedance, Tpd (ns/mm)
# Microstrip, W = 0,25 mm, H = 0,34 mm, FR-4 STD, 0,18 um + 0,35 um (Zo = 75.5 Ohms)
set Tpd 0.00584

set ADC1clk_min [expr 53.453 * $Tpd]
set ADC1clk_max [expr 55.604 * $Tpd]
set ADC2clk_min [expr 50.640 * $Tpd]
set ADC2clk_max [expr 54.596 * $Tpd]

# Задержки преобразования в АЦП (1.9 valid,min | 2.8 pd,typ | 3.8 pd,max)
# Окно верных данных с АЦП
set ADCtco_min 3.8
set ADCtco_max [expr 1.9 + 4.0]

# Задержки данных из АЦП по плате
set ADC1dat_min [expr 15.893 * $Tpd]
set ADC1dat_max [expr 42.767 * $Tpd]
set ADC2dat_min [expr 15.325 * $Tpd]
set ADC2dat_max [expr 34.516 * $Tpd]

# Задержки тактов для ПЛИС
set PLDclk_min [expr 14.693 * $Tpd]
set PLDclk_max [expr 15.099 * $Tpd]

# Входные такты (сдвинуты на полпериода, потому что инверсные)
create_clock -name plc -period "250 MHz" -waveform {2.0 4.0} [get_ports {PLC_N}]

# Внешние виртуальные такты для тактирования сигналов с АЦП
create_clock -name clka -period "250 MHz"

# Канал 1
set_input_delay \
-clock clka -min \
[expr $ADC1clk_min + $ADCtco_min + $ADC1dat_min - $PLDclk_max] \
{S1D_N[*] S1D_P}
set_input_delay \
-clock clka -max \
[expr $ADC1clk_max + $ADCtco_max + $ADC1dat_max - $PLDclk_min] \
{S1D_N[*] S1D_P}

# Канал 2
set_input_delay \
-clock clka -min \
[expr $ADC2clk_min + $ADCtco_min + $ADC2dat_min - $PLDclk_max] \
{S2D_P[*] S2D_N[*]}
set_input_delay \
-clock clka -max \
[expr $ADC2clk_max + $ADCtco_max + $ADC2dat_max - $PLDclk_min] \
{S2D_P[*] S2D_N[*]}
dima32rus
Цитата(ViKo @ Jan 11 2018, 13:02) *
# Задержки данных из АЦП по плате
set ADC1dat_min [expr 15.893 * $Tpd]
set ADC1dat_max [expr 42.767 * $Tpd]

Простите за любопытство, а что есть эти магические цифры: 15.893, 42.767
_Anatoliy
Цитата(dima32rus @ Jan 11 2018, 13:45) *
Простите за любопытство, а что есть эти магические цифры: 15.893, 42.767

Длина дорожки умноженная на удельную задержку Tpd (ns/mm)
ViKo
Цитата(_Anatoliy @ Jan 11 2018, 13:52) *
Длина дорожки умноженная на удельную задержку Tpd (ns/mm)

Да. Так развели плату. Погонную задержку в Saturn PCB прикинул.
dima32rus
Цитата(_Anatoliy @ Jan 11 2018, 13:52) *
Длина дорожки умноженная на удельную задержку Tpd (ns/mm)

ADC1dat_min и ADC1dat_max - так это разные дорожки? Мне показалось, что одна и та же, просто рассчитывается мин. и макс. задержка. Если первая цифра - это длина, а Tpd - погонная задержка, тогда не понятно было, как длина одной и той же дорожки может быть разной... Названия сбили с толку.
ViKo
Цитата(dima32rus @ Jan 11 2018, 14:50) *
ADC1dat_min и ADC1dat_max - так это разные дорожки? Мне показалось, что одна и та же, просто рассчитывается мин. и макс. задержка. Если первая цифра - это длина, а Tpd - погонная задержка, тогда не понятно было, как длина одной и той же дорожки может быть разной... Названия сбили с толку.

Во-первых, это дифференциальные сигналы, длина дорожек + и - могут отличаться.
Во-вторых, с АЦП идет шина данных.
В данном случае описана самая короткая и самая длинная дорожки в шине.
dima32rus
Цитата(ViKo @ Jan 11 2018, 14:55) *
Во-первых, это дифференциальные сигналы, длина дорожек + и - могут отличаться.
Во-вторых, с АЦП идет шина данных.
В данном случае описана самая короткая и самая длинная дорожки в шине.

Да, теперь понятно, спасибо
Flip-fl0p
Вот наткнулся на интересную штуку по констрейнам: http://www.in2p3.fr/actions/formation/Nume...A_TimeQuest.pdf
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.