nice_vladi 1 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба Всем привет, Случился затык: пытаюсь захватить входные данные с АЦП (ДДР) по клоку, отдаваемому АЦП. И все, вроде бы, ничего, но плата разведена так, что разные каналы АЦП пририсованы к разным сторонам чипа. В результате получаю разводку, как на картинке. И развалившуюся времянку на полном чипе. Хочу объяснить квартусу, что второй (нижний на картинке) регистр надо поставить ближе к входному. Входной ДДР буфер задействован. Констрейны описаны (входной клок, внутренние частоты). Буду признателен за советы) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба Для квартуса не знаю, но у xilinx прописывается атрибут: Для верилог файла надо прописать до описания модуля: (* IOB = "TRUE" *) Module my_module( ... Подробно в Ug625, стр 126. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 12 minutes ago, Skryppy said: ... (* IOB = "TRUE" *) ... Входной буфер уже задействован. Но он тактируется от внешнего же клока. Проблема, что потом данные, щелкнутые во входном буфере квартус тащит через весь чип. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 0 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба Тогда можно посмотреть разводку и указать конкретное место для данного регистра. Для ucf файла, например в ise: Inst "my_module/reg_array[0].fde_used.u2" LOC = SLICE_X100Y245; или указать допустимую область на кристалле (Pblock). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 1 hour ago, nice_vladi said: Входной буфер уже задействован. Но он тактируется от внешнего же клока. Проблема, что потом данные, щелкнутые во входном буфере квартус тащит через весь чип. Просто добавить пару регистров и запретить их оптимизацию в память. Это для любых плис) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 55 minutes ago, des00 said: Просто добавить пару регистров и запретить их оптимизацию в память. Это для любых плис) Пробовал, но квартус их группирует с одного края кристалла, вместо того, что бы выстраивать цепочку от края для края. Директивы синтеза не спасли. Мб, что-то не так сделал, пробовал два-три регистра ставить - упрямо все в кучу скидывает) 2 hours ago, Skryppy said: Тогда можно посмотреть разводку и указать конкретное место для данного регистра. Для ucf файла, например в ise: Inst "my_module/reg_array[0].fde_used.u2" LOC = SLICE_X100Y245; или указать допустимую область на кристалле (Pblock). Не хочется настолько чёрную магию применять)) Чип всего на 60-70% заполнен, рассчитывал, что все прекрасно пролезет. Но - спасибо. Если не удастся уговорить квартус попробую ваш способ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 18 minutes ago, nice_vladi said: Пробовал, но квартус их группирует с одного края кристалла, вместо того, что бы выстраивать цепочку от края для края. Директивы синтеза не спасли. Мб, что-то не так сделал, пробовал два-три регистра ставить - упрямо все в кучу скидывает) не должен. у меня он регистровые слои располагает так, что бы тактовая выравнивалась. что-то тут не то Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 30 ноября, 2019 Опубликовано 30 ноября, 2019 · Жалоба 32 minutes ago, des00 said: не должен. у меня он регистровые слои располагает так, что бы тактовая выравнивалась. что-то тут не то Возможно. Завтра ещё перепроверю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 11 hours ago, nice_vladi said: Возможно. Завтра ещё перепроверю настройки синтеза проверьте, особенно в области реализации сдвиговых регистров и стратегий разводки. Вообще странное поведение, но, как вариант set_min_delay можно попробовать покрутить. ЗЫ. Ну и надо быть точно уверенным что проблема именно из-за этого пути, а не какой то многофазной синхронизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба В результате оптимизации модулей, колдовства с настройками синтеза и фиттера, удалось добиться приемлемых таймингов и работы схемы. Однако, квартус все равно не разложил регистры так, как полагается - в цепочку. На время забросил этот вопрос, но, чувствую, еще придется вернуться. Upd. Интересно, что квартус при агрессивном фиттере упрямо стягивает все регистры в одно место, тогда как при normal, хоть немного размазывает их по кристаллу - то, что мне нужно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 45 минут назад, nice_vladi сказал: В результате оптимизации модулей, колдовства с настройками синтеза и фиттера, удалось добиться приемлемых таймингов и работы схемы. Однако, квартус все равно не разложил регистры так, как полагается - в цепочку. На время забросил этот вопрос, но, чувствую, еще придется вернуться Попробуйте задействовать Logic Lock Region-ы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 19 часов назад, nice_vladi сказал: Upd. Интересно, что квартус при агрессивном фиттере упрямо стягивает все регистры в одно место, тогда как при normal, хоть немного размазывает их по кристаллу - то, что мне нужно) Приветствую. А регистры точно НЕ оптимизируются без явного запрета на это? И как осуществляется межклоковый переход между клоком АЦП и основным клоком? Ну и содержимое sdc файла в этой части не помешало бы увидеть. Для некоторых АЦП на просторах сети наблюдал примеры приема данных - так там для DDR режима использовались примитивы LVDS, что недопустимо. В итоге иначе описывались временные ограничения и потом разработчик не понимал, отчего от компиляции к компиляции разные результаты. За годы работы с квартусом такую картину наблюдаю в двух случаях - если неверные временные ограничения или если используются Logic Lock Region-ы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nice_vladi 1 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 2 hours ago, warrior-2001 said: Приветствую. А регистры точно НЕ оптимизируются без явного запрета на это? И как осуществляется межклоковый переход между клоком АЦП и основным клоком? Ну и содержимое sdc файла в этой части не помешало бы увидеть. Для некоторых АЦП на просторах сети наблюдал примеры приема данных - так там для DDR режима использовались примитивы LVDS, что недопустимо. В итоге иначе описывались временные ограничения и потом разработчик не понимал, отчего от компиляции к компиляции разные результаты. За годы работы с квартусом такую картину наблюдаю в двух случаях - если неверные временные ограничения или если используются Logic Lock Region-ы. Я думаю, что нет. Проверил отчеты квартуса - регистры не упомянуты как оптимизированные. В chip planner тоже они есть. CDC простой: по внешнему тригеру в АЦП посылаются 5 тактов частоты, АЦП отдает эхо: 5 тактов своей частоты + ДДР данные под этот клок. В ПЛИС ДДР данные принимаются на клоке АЦП, укладываются в сдвиговый регистр. По внешнему триггеру счетчик внутри ПЛИС сбрасывается, затем отсчитывает >>5 тактов (что бы ТОЧНО все данные из АЦП успели уложиться в сдвиговый регистр), и происходит перекладывание из сдвигового регистра, работающего на клоке АЦП на внутреннюю частоту. ДДР описаны корками Альтеры, все по канонам. Входные буферы задействованы корректно. Констрейны: Клок из ПЛИС на АЦП create_generated_clock -name adc_rd_clk[0] -source [get_pins {gen_adc_inst[0].adc__|clk_tx__|auto_generated|ddio_outa[0]|muxsel}] [get_ports {DCLK[0]}] Клок из АЦП в ПЛИС (эхо) create_clock -name adc_echo_clk[0] -period 120MHz [get_ports {DCO[0]}] Клоки exclusive. Дорожки на плате выровнены довольно точно (если не ошибаюсь, порядка 2 мм). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 2 часа назад, warrior-2001 сказал: так там для DDR режима использовались примитивы LVDS, что недопустимо. А есть ли какая информация от производителя что так делать нельзя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
warrior-2001 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 1 час назад, _sda сказал: А есть ли какая информация от производителя что так делать нельзя? Если посмотреть конкретный мануал на конкретный АЦП - то можно понять, что допустимо а что - нет. Разработчикам АЦП не принципиально, как именно вы принимаете его сигналы в ПЛИС. Времянка есть, допуски есть - принимайте. А в ПЛИС как делать прием - дело хозяйское. LTM9011-14 - выводы LVDS, однако в режиме DDR ставить необходимо на входе altddio. В противной случае невозможно пользоваться подстройкой данный по сигналу Frame (Fr) для корректной подстройки сигналов. Это один из самых противоречивых примеров в пользу DDR, однако качество работы блоков куда выше при использовании DDR режима. 1 час назад, nice_vladi сказал: Констрейны: Клок из ПЛИС на АЦП create_generated_clock -name adc_rd_clk[0] -source [get_pins {gen_adc_inst[0].adc__|clk_tx__|auto_generated|ddio_outa[0]|muxsel}] [get_ports {DCLK[0]}] Клок из АЦП в ПЛИС (эхо) create_clock -name adc_echo_clk[0] -period 120MHz [get_ports {DCO[0]}] Клоки exclusive. Дорожки на плате выровнены довольно точно (если не ошибаюсь, порядка 2 мм). А где: set_input_delay -clock ... Где set_false_path -setup -fall_from [get_clocks {clk_adc_a}] -rise_to [get_clocks {virt_clk_adc_a}] set_false_path -setup -rise_from [get_clocks {clk_adc_a}] -fall_to [get_clocks {virt_clk_adc_a}] set_false_path -hold -fall_from [get_clocks {clk_adc_a}] -rise_to [get_clocks {virt_clk_adc_a}] set_false_path -hold -rise_from [get_clocks {clk_adc_a}] -fall_to [get_clocks {virt_clk_adc_a}] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться