|
Алтера: описание внешнего такта, TimeQuest, Как корректно описать такт в SDC? |
|
|
|
Jan 23 2010, 13:10
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056

|
Нужна помощ с описанием внешнего такта в SDC языке для TimeQuest (Altera) У меня PLL генерирует 200MHz и 50MHz такты. Этот 200MHz идёт сразу на внешний чип, каторый делит этот такт на два, и через кокое то время (скажем, 3nS) посупает опять на FPGA. И потом этот сигнал пользуется как такт в внутренних цепях. Нарисовал картинку чтоб было бы ясно.  Написал так: Код create_generated_clock -source <..PLL> -name MHz50 create_clock -period 10.000 -name MHz100 [get_ports {Clk2}] Но как правильно описать эту задержку (фазу)?
|
|
|
|
|
Jan 23 2010, 13:47
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056

|
Цитата(des333 @ Jan 23 2010, 16:22)  Я не специалист по TQ, но, на мой взгляд, Вам следует описать MHz100 как generated_clock от MHz200 с указанием сдвига фазы. Да, пробовал. Но тогда Quartus ругается(warning), что не может найти как этот клок был сгенерирован. В резултате, это описание игнориуруется
|
|
|
|
|
Jan 23 2010, 15:34
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(des333 @ Jan 23 2010, 07:22)  Я не специалист по TQ, но, на мой взгляд, Вам следует описать MHz100 как generated_clock от MHz200 с указанием сдвига фазы. create_generated_clock не может использоваться без указания физического источника этого клока, т.е. в данном случае вариант отпадает. Цитата(solidreg @ Jan 23 2010, 07:10)  Но как правильно описать эту задержку (фазу)? Описывается стандартно через create_clock. У вас есть передача данных их домена 100МГц в домен 50МГц? Если нет, то задержка не важна. Если есть то это сложнее, я вижу единственную возможность это задать сдвиг по фазе между клоками с помошью ключа waveform. Но тут есть тонкий момент, у вашего делителя скоре всего нормируются максимальные и минимальные параметры задержки, и как вы будете учитывать их при анализе мне не совсем понятно. Может быть гуру объяснят. Еще мне не понятно, зачем делить клок на внешнем устройстве, если есть PLL. Или почему бы не сгенерировать 50МГц со 100МГц получаемых с внешнего делителя.
--------------------
|
|
|
|
|
Jan 23 2010, 15:47
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056

|
Цитата(des00 @ Jan 23 2010, 19:34)  Еще мне не понятно, зачем делить клок на внешнем устройстве, если есть PLL. Или почему бы не сгенерировать 50МГц со 100МГц получаемых с внешнего делителя. Это упрощенное обяснение проекта. Внешная микросчема не всегда этот сигнал выдаёт. Но когда работает - 100MHz там есть. Да, передача данных там есть от обеих доменов. Потому мне и надо описать их корректно. Задержка там фиксированна, окола 3-5nS. Спасибо за идею о сдвиг. Может быть поможет.
|
|
|
|
|
Jan 23 2010, 15:53
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата Задержка там фиксированна, окола 3-5nS. Она то фиксирована, но вам надо рассмотреть крайние варианты, что бы быть уверенным в работоспособности. А то на одной плате может работать, а на другой нет. Как тут быть не совсем понятно. Цитата Да, передача данных там есть от обеих доменов. Потому мне и надо описать их корректно. я бы рассмотрел внимательно передачу данных и рассмотрел вариант использования фифо %)
--------------------
|
|
|
|
|
Jan 23 2010, 18:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(des00 @ Jan 23 2010, 20:40)  200 выходит, делится на внешнем устройстве и 100 заходит в плис. Вот эти 100 с помощью генерайтед клоков описать нельзя %) Хм... А так разве нельзя? Код module count(
input clk50_i, output clk50_o, input clk100_i, output clk100_o );
assign clk50_o = clk50_i; assign clk100_o = clk100_i;
endmodule Код create_clock -period 20.000 -name clk50i [get_ports {clk50_i}] create_generated_clock -name clk50o -source [get_ports {clk50_i}] -divide_by 1 -multiply_by 1 [get_ports {clk50_o}]
create_generated_clock -name clk100i -source [get_ports {clk50_o}] -divide_by 2 -multiply_by 1 [get_ports {clk100_i}] create_generated_clock -name clk100o -source [get_ports {clk100_i}] -divide_by 1 -multiply_by 1 [get_ports {clk100_o}] Квартус ругается: Цитата Warning: No paths exist between clock target "clk100_i" of clock "clk100i" and its clock source. Assuming zero source clock latency. Смотрим справку: Цитата ACTION:Check the value of the -source option to specify a valid clock source in the combinational fan-in of the generated clock target. If the generated clock is assigned to an input port to model a feedback clock, then the -source should be an output port with a clock assigned to it. If no paths are expected between the clock source and clock target (e.g., to model a feedback clock), use the set_clock_latency SDC command to specify any source latency. Добавляем в .sdc строку: Код set_clock_latency -source 3 [get_clocks {clk100i}] И все в порядке.
Сообщение отредактировал des333 - Jan 23 2010, 18:49
--------------------
|
|
|
|
|
Jan 23 2010, 19:11
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(des00 @ Jan 23 2010, 20:40)  200 выходит, делится на внешнем устройстве и 100 заходит в плис. Вот эти 100 с помощью генерайтед клоков описать нельзя %) Это Вас кто-то наобманул  верилог: Код module time_test (input master_clk, output out_clk, input ret_clk, input d, output reg o );
assign out_clk = !master_clk;
always @(posedge ret_clk) o <= d; endmodule SDC: Код create_clock -name mclk -period "100 MHz" master_clk create_generated_clock -name gclk -source master_clk -invert out_clk create_generated_clock -name rclk -source out_clk -divide_by 2 -offset 4 ret_clk set_clock_uncertainty -to [get_clocks rclk] 1 первый - описывает входной клок. Второй - описывает генерейтед клок на выходном пине с учетом всех задержек. Третий - описывает генерейтед клок, пришедший снаружи, сделанный из второго, деленный напополам и смещенный на 4 наны. ну и uncertainty на +-1 нану, так как там ведь 3..5, а не 4. А варнинг... Ну и что, что варнинг... Забить на него следует. Warning: No paths exist between clock target "ret_clk" of clock "rclk" and its clock source. Assuming zero source clock latency.И правильно говорит варнинг. Внутри путей нет, и считает latency за ноль, о чем на всякий пожарный и сообщает, мало ли, человек ошибся, случайно не ту ноду указал... Но мы-то знаем, что ту ноду, и что не ноль там, а 3..5, и это описали через -offset и через uncertainty. Можно и без оффсета, через дополнительный set_clock_latency. Ну и еще set_load не помешал бы, чтобы задать емкость нагрузки на выходной пин клока. Но я что-то не уверен в наличии такой команды в таймквесте
|
|
|
|
|
Jan 23 2010, 19:38
|
Участник

Группа: Свой
Сообщений: 74
Регистрация: 24-10-05
Пользователь №: 10 056

|
Цитата(SM @ Jan 23 2010, 23:11)  SDC: Код create_clock -name mclk -period "100 MHz" master_clk create_generated_clock -name gclk -source master_clk -invert out_clk create_generated_clock -name rclk -source out_clk -divide_by 2 -offset 4 ret_clk set_clock_uncertainty -to [get_clocks rclk] 1 первый - описывает входной клок. Второй - описывает генерейтед клок на выходном пине с учетом всех задержек. Третий - описывает генерейтед клок, пришедший снаружи, сделанный из второго, деленный напополам и смещенный на 4 наны. ну и uncertainty на +-1 нану, так как там ведь 3..5, а не 4. А варнинг... Ну и что, что варнинг... Забить на него следует. Warning: No paths exist between clock target "ret_clk" of clock "rclk" and its clock source. Assuming zero source clock latency.И правильно говорит варнинг. Внутри путей нет, и считает latency за ноль, о чем на всякий пожарный и сообщает, мало ли, человек ошибся, случайно не ту ноду указал... Но мы-то знаем, что ту ноду, и что не ноль там, а 3..5, и это описали через -offset и через uncertainty. Можно и без оффсета, через дополнительный set_clock_latency. Ну и еще set_load не помешал бы, чтобы задать емкость нагрузки на выходной пин клока. Но я что-то не уверен в наличии такой команды в таймквесте Wow! Вот это решение! Очень спасибо. А то так и было - на одной плате работает, а на другой нет.
|
|
|
|
|
Jan 24 2010, 05:29
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(des333 @ Jan 23 2010, 12:49)  А так разве нельзя? Цитата(SM @ Jan 23 2010, 13:11)  Это Вас кто-то наобманул  теперь вижу что можно, как всегда невнимательно читал даташит %) UPD 2 SM и des333, надеюсь вы не возражаете если этот пример я сохраню для всех %) Кстати по тому примеру что там выложен. Если сделать посмотреть анализ времянок и пути клока в 200МГц Цитата report_path -from [get_ports {iclk200MHz}] -to [get_ports {oclk200MHz}] -npaths 1 Info: Path #1: Delay is 4.770 то возникает вопрос, откуда кварутс насчитал 6нс между клоками, тогда как должно быть 7.7...9.7 нс ?
UPD2 Поковырялся. 6 нс это период 100МГц 10нс минус смещение 4 нс. uncertanty учитывается при расчете Data Required и для клоков не рассматривается. А где учтена задержка по сигналу 200МГц... Странно. UPD3. Сделал так Код lcell lcell1 (iclk200MHz, oclk200MHz); задержка выросла Цитата Info: Path #1: Delay is 6.240 но анализ того самого пути изменился на 0.03нс и то за счет того что Clock Delay по clk50MHz выросла, ИМХО это подтверждение того, что задержка clk200MHz не учитывается %)
--------------------
|
|
|
|
|
Jan 24 2010, 07:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Если добавить строчку: Код set_clock_latency -source 0 [get_clocks {clk100MHz}] то задержка lcell начнет учитываться.
--------------------
|
|
|
|
|
Jan 24 2010, 07:35
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(des333 @ Jan 24 2010, 01:22)  Если добавить строчку: Код set_clock_latency -source 0 [get_clocks {clk100MHz}] то задержка lcell начнет учитываться. Точно, занятно. Значит таймквест, утвержая Цитата Warning: No paths exist between clock target "iclk100MHz" of clock "clk100MHz" and its clock source. Assuming zero source clock latency. нагло врет в текстовой форме %)
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|