Jump to content

    

TimeQuest + NIOS II+ SDRAM как обконстрейнить?

Коллеги, добрый день!

Пытаюсь въехать во временной анализ. Проект разрастается, времянка начинает нагибаться, а понимание в этом вопросе пока рассеяное. Хочу обконстрейнить NIOS II + SDRAM, но пока нет понимания с чего начать, точнее  из TimeQuest сделал create_clock, create_generated_clock, set_clock_uncertainty, а дальше вроде необходимо задать set_input_delay и set_output_delay. Если для выводов подключенных к UART и к PIO вроде как понятно, а вот для SDRAM не очень, так-как есть две тактовые частоты, clk0 и clk1. clk0 тактирует всю систему и SDRAM контроллер, а clk1 это clk0 сдвинутый по фазе на -60 deg для тактирования микросхемы SDRAM. Несколько раз перечитывал статью Шехалева Дениса, но пока нет очень понял как тут быть, считать эти клоки асинхронными? Сигналы по DQ идущие из контроллера в микросхему выставляются по clk0, а из микросхемы в контроллер выставляются по clk1, это путает и я не могу понять как тут быть? Если для выходов контроллера применяем set_output_delay, для входов контроллера set_input_delay, то для inout и set_input_delay и set_output_delay? Проект во вложении. Буду очень благодарен за помощь!!!

test_sdram.qar

Edited by en-valb

Share this post


Link to post
Share on other sites
36 minutes ago, en-valb said:

clk1 это clk0 сдвинутый по фазе на -60 deg для тактирования микросхемы SDRAM.... считать эти клоки асинхронными?

Прописать правильно clk1. -60 градусов пересчитать в наносекунды.

Если же генерируется внутренним pll - то create_generated_clock сам это сделает.

Share this post


Link to post
Share on other sites

derive_pll_clocks и derive_clock_uncertainty для начала.

А то уж очень ваш test_sdram.out.sdc забит лишним текстом. И убрать все в разделах Create Generated Clock и Set Clock Uncertainty.

Тогда и смотреть дальше, какие именно пути падают.

Тайминги на память есть. Из документации посмотреть, как они выглядят - открыть TimeQuest  и указать необходимые параметры. Это самый действенный способ понять всё самому.

 

Share this post


Link to post
Share on other sites
1 hour ago, Yuri124 said:

Если же генерируется внутренним pll - то create_generated_clock сам это сделает.

Да у меня внутренний PLL.

 

Edited by en-valb

Share this post


Link to post
Share on other sites
1 hour ago, en-valb said:

у меня внутренний PLL

тогда - добавьте derive_pll_clocks, как уже подсказали постом выше, 

это я его с create_generated_clock перепутал.

Share this post


Link to post
Share on other sites

 

4 minutes ago, Yuri124 said:

тогда - добавьте derive_pll_clocks, как уже подсказали постом выше, 

да, сделал так.

Share this post


Link to post
Share on other sites
2 hours ago, warrior-2001 said:

Тайминги на память есть. Из документации посмотреть, как они выглядят - открыть TimeQuest  и указать необходимые параметры. Это самый действенный способ понять всё самому.

 

Сделал, получил кучу слаков, я так понимаю по диаграмме на втором рисунке, я сдвинул clk1 на -60 deg т.е. на - 1,6666 нс относительно периода 10 нс. Там как раз между Launch и Latch 8.334 нс получилось (10 - 1,666 = 8.334), учитывая, что данные приходят на 4,122 нс позже чем необходимо, то надо сдвинуть Latch на 4,122 - 1,666 = 2,456 нс примерно на +90 deg?  Или тут как то учесть в констрейнах сдвиг фазы надо? И еще я не уверен, что правильно указал set_input_delay. SDRAM использую MT48LC16M16A2P-6AIT ф.Micron, ссылка на pdf. Обновленный sdc тоже в приложении.

 

 image.thumb.png.25d9a0776ed311d113dc04d0f22544c1.png

image.thumb.png.49de1fe6a95172e81f6967d8265e66ba.png

 

 

test_sdram.out.sdc

Edited by en-valb

Share this post


Link to post
Share on other sites

а эти клоки в разные группы не надо разнести?

Share this post


Link to post
Share on other sites
16 minutes ago, new123 said:

в разные группы

Так один же зависит от другого. Вернее - из одного через PLL порождается другой.

Share this post


Link to post
Share on other sites
28 minutes ago, Yuri124 said:

Так один же зависит от другого. Вернее - из одного через PLL порождается другой.

ой да, я в sdc файле про другие клоки подумал.

у Дениса кстати в статье clk0 и clk1 в одну группу объединен. Я бы вообще со статьи весь sdc содрал и свои значения прописал

Edited by new123

Share this post


Link to post
Share on other sites

Добавил в sdc 

set_clock_groups -exclusive -group [get_clocks {inst3|altpll|sd1|pll7|clk[0]}] -group [get_clocks {inst3|altpll|sd1|pll7|clk[1]}] 

Остался один слак по пути от выхода pll|clk[1] до порта SDRAM_CLK  

image.thumb.png.0e58bb2b5bb145c1d1ffb667150f5034.png

задержка на IO буфере 2,809 нс 

image.thumb.png.73d71551a80b84dfe44c62c50bf990bc.png

image.thumb.png.5489d26340f3ea84892798b4e0a842f6.png

Получается, что SDRAM_CLK и так в худшем случае при температуре кристалла +100 С сдвинут на -2,273 нс + -2,809 нс = -5,082 нс (-183 deg)???

test_sdram.out.sdc

Share this post


Link to post
Share on other sites

Нашел откуда этот слак, я случайно сделал это...

set_output_delay -add_delay -rise -max -clock [get_clocks {inst3|altpll|sd1|pll7|clk[1]}]  1.500 [get_ports {SDRAM_CLK}]
set_output_delay -add_delay -rise -min -clock [get_clocks {inst3|altpll|sd1|pll7|clk[1]}]  0.800 [get_ports {SDRAM_CLK}]

Убрал эти строки из файла и :)

image.thumb.png.b4bd41113a0141cae173ecc77cabdce0.png

Share this post


Link to post
Share on other sites
1 hour ago, en-valb said:

Добавил в sdc 


set_clock_groups -exclusive -group [get_clocks {inst3|altpll|sd1|pll7|clk[0]}] -group [get_clocks {inst3|altpll|sd1|pll7|clk[1]}] 

Остался один слак по пути от выхода pll|clk[1] до порта SDRAM_CLK  

Этим Вы добились, что клоки якобы стали независимыми и якобы стартуют одновременно с времени 0 нс. Но так ли это на самом деле?

Ведь задача - не просто убрать красные строки (слэки) из отчета Квартуса, а правильно описать в проекте временнЫе соотношения сигналов, которые будут (должны быть!) в реальности (на плате и с выбранными комплектующими) - чтобы эта жменька комплектухи  - да еще с учетом расстояний между ними на плате! - заработала. А затем выбором дизайна проекта (добавлением /убавлением задержек, сдвигом фаз частот, др. методами) добиться, чтобы проект заработал - т.е. чтобы выполнялись временнЫе соотношения для микросхем.

Edited by Yuri124

Share this post


Link to post
Share on other sites
55 minutes ago, Yuri124 said:

Этим Вы добились, что клоки якобы стали независимыми и якобы стартуют одновременно с времени 0 нс. Но так ли это на самом деле?

 

Да я это понял, пытаюсь рассуждать: 

SDRAM контроллер выставляет очередные данные на шине DQ по фронту clk0. По thold выходных регистров ПЛИС они защелкиваются на ее выходных пинах SDRAM_DQ[15..0]. Требования по tsetup микросхемы памяти по документации 1,5 нс.  Так-как clk1 сдвинут относительно clk0 на -60 deg или тоже самое, что он сдвинут на +300 deg = 8,334 нс (clk0 и clk1 = 10 нс) то в моем случае это и есть tsetup и он с большим запасом. Через 8,334 нс пришедший фронт клока clk1 начнет защелкивать выставленные данные в регистры внешней SDRAM'ки и защелкнуться они по thold = +0,8 нс, т.е. через 8,334 + 0,8 = 9,134 нс они будут уже сохранены в памяти. И цикл записи очередных данных начнется через примерно 1 нс. 
От сюда вопросы:
Когда я добавил команду set_clock_groups -exclusive -group [get_clocks {inst3|altpll|sd1|pll7|clk[0]}] -group [get_clocks {inst3|altpll|sd1|pll7|clk[1]}] я сказал TimeQuest, что сигналы clk0 и clk1 синхронны и синфазны?
В результате он начал все анализировать от clk1, но ведь это не правильно?
TimeQuest до этого брал в качестве Launch clk0 а в качестве Latch clk1 и это было верно?
Нужна ли все таки команда set_clock_groups или нет и правильно ли я ее понимаю?

Edited by en-valb

Share this post


Link to post
Share on other sites
29 minutes ago, en-valb said:

set_clock_groups -exclusive -group -group

Эта команда описывает группы клоков, которые независимы друг от друга полностью. Есс-но - и не синфазны.

Но программа рассчитывает времянку так, как если бы в начальный момент эти клоки стартовали бы одновременно. На диаграмме - появляется их кажущаяся синфазность.

И считает времянку один раз, а не перебирает все возможные (как если бы это на самом деле были несинфазные частоты) взаимоположения клоков.

 

Эта команда не только не нужна, но даже и вредна.

Edited by Yuri124

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this