Jump to content

    
Sign in to follow this  
en-valb

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

Recommended Posts

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

Пытаюсь въехать во временной анализ. Проект разрастается, времянка начинает нагибаться, а понимание в этом вопросе пока рассеяное. Хочу обконстрейнить 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
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
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this