en-valb 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 (изменено) · Жалоба Коллеги, добрый день! Пытаюсь въехать во временной анализ. Проект разрастается, времянка начинает нагибаться, а понимание в этом вопросе пока рассеяное. Хочу обконстрейнить 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 Изменено 22 апреля, 2019 пользователем en-valb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 36 minutes ago, en-valb said: clk1 это clk0 сдвинутый по фазе на -60 deg для тактирования микросхемы SDRAM.... считать эти клоки асинхронными? Прописать правильно clk1. -60 градусов пересчитать в наносекунды. Если же генерируется внутренним pll - то create_generated_clock сам это сделает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба derive_pll_clocks и derive_clock_uncertainty для начала. А то уж очень ваш test_sdram.out.sdc забит лишним текстом. И убрать все в разделах Create Generated Clock и Set Clock Uncertainty. Тогда и смотреть дальше, какие именно пути падают. Тайминги на память есть. Из документации посмотреть, как они выглядят - открыть TimeQuest и указать необходимые параметры. Это самый действенный способ понять всё самому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 (изменено) · Жалоба 1 hour ago, Yuri124 said: Если же генерируется внутренним pll - то create_generated_clock сам это сделает. Да у меня внутренний PLL. Изменено 22 апреля, 2019 пользователем en-valb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 1 hour ago, en-valb said: у меня внутренний PLL тогда - добавьте derive_pll_clocks, как уже подсказали постом выше, это я его с create_generated_clock перепутал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 4 minutes ago, Yuri124 said: тогда - добавьте derive_pll_clocks, как уже подсказали постом выше, да, сделал так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 (изменено) · Жалоба 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 тоже в приложении. test_sdram.out.sdc Изменено 22 апреля, 2019 пользователем en-valb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба а эти клоки в разные группы не надо разнести? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 22 апреля, 2019 Опубликовано 22 апреля, 2019 · Жалоба 16 minutes ago, new123 said: в разные группы Так один же зависит от другого. Вернее - из одного через PLL порождается другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 22 апреля, 2019 Опубликовано 22 апреля, 2019 (изменено) · Жалоба 28 minutes ago, Yuri124 said: Так один же зависит от другого. Вернее - из одного через PLL порождается другой. ой да, я в sdc файле про другие клоки подумал. у Дениса кстати в статье clk0 и clk1 в одну группу объединен. Я бы вообще со статьи весь sdc содрал и свои значения прописал Изменено 22 апреля, 2019 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба Добавил в 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 задержка на IO буфере 2,809 нс Получается, что SDRAM_CLK и так в худшем случае при температуре кристалла +100 С сдвинут на -2,273 нс + -2,809 нс = -5,082 нс (-183 deg)??? test_sdram.out.sdc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба Нашел откуда этот слак, я случайно сделал это... 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}] Убрал эти строки из файла и :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 23 апреля, 2019 Опубликовано 23 апреля, 2019 (изменено) · Жалоба 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 нс. Но так ли это на самом деле? Ведь задача - не просто убрать красные строки (слэки) из отчета Квартуса, а правильно описать в проекте временнЫе соотношения сигналов, которые будут (должны быть!) в реальности (на плате и с выбранными комплектующими) - чтобы эта жменька комплектухи - да еще с учетом расстояний между ними на плате! - заработала. А затем выбором дизайна проекта (добавлением /убавлением задержек, сдвигом фаз частот, др. методами) добиться, чтобы проект заработал - т.е. чтобы выполнялись временнЫе соотношения для микросхем. Изменено 23 апреля, 2019 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
en-valb 0 23 апреля, 2019 Опубликовано 23 апреля, 2019 (изменено) · Жалоба 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 или нет и правильно ли я ее понимаю? Изменено 23 апреля, 2019 пользователем en-valb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 23 апреля, 2019 Опубликовано 23 апреля, 2019 (изменено) · Жалоба 29 minutes ago, en-valb said: set_clock_groups -exclusive -group -group Эта команда описывает группы клоков, которые независимы друг от друга полностью. Есс-но - и не синфазны. Но программа рассчитывает времянку так, как если бы в начальный момент эти клоки стартовали бы одновременно. На диаграмме - появляется их кажущаяся синфазность. И считает времянку один раз, а не перебирает все возможные (как если бы это на самом деле были несинфазные частоты) взаимоположения клоков. Эта команда не только не нужна, но даже и вредна. Изменено 23 апреля, 2019 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться