Перейти к содержанию
    

Как указать Quartus распологать регистры как можно ближе к входному буферу

Всем привет,

Случился затык: пытаюсь захватить входные данные с АЦП (ДДР) по клоку, отдаваемому АЦП. И все, вроде бы, ничего, но плата разведена так, что разные каналы АЦП пририсованы к разным сторонам чипа. В результате получаю разводку, как на картинке. И развалившуюся времянку на полном чипе.

Хочу объяснить квартусу, что второй (нижний на картинке) регистр надо поставить ближе к входному. Входной ДДР буфер задействован. Констрейны описаны (входной клок, внутренние частоты).

Буду признателен за советы)

 

Screenshot_2019-11-30_19-18-52.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для квартуса не знаю, но у xilinx прописывается атрибут:

Для верилог файла надо прописать до описания модуля:

(* IOB = "TRUE" *)

Module  my_module( ...

Подробно в Ug625, стр 126.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, Skryppy said:

...

(* IOB = "TRUE" *)

...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда можно посмотреть разводку и указать конкретное место для данного регистра. Для ucf файла, например в ise:

Inst "my_module/reg_array[0].fde_used.u2" LOC = SLICE_X100Y245;

или указать допустимую область на кристалле (Pblock).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, nice_vladi said:

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

Просто добавить пару регистров и запретить их оптимизацию в память. Это для любых плис) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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% заполнен, рассчитывал, что все прекрасно пролезет.

Но - спасибо. Если не удастся уговорить квартус попробую ваш способ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, nice_vladi said:

Пробовал, но квартус их группирует с одного края кристалла, вместо того, что бы выстраивать цепочку от края для края.

Директивы синтеза не спасли. Мб, что-то не так сделал, пробовал два-три регистра ставить - упрямо все в кучу скидывает)

не должен. у меня он регистровые слои располагает так, что бы тактовая выравнивалась. что-то тут не то

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, des00 said:

не должен. у меня он регистровые слои располагает так, что бы тактовая выравнивалась. что-то тут не то

Возможно. Завтра ещё перепроверю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, nice_vladi said:

Возможно. Завтра ещё перепроверю

настройки синтеза проверьте, особенно в области реализации сдвиговых регистров и стратегий разводки. Вообще странное поведение, но, как вариант set_min_delay можно попробовать покрутить. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Upd.

Интересно, что квартус при агрессивном фиттере упрямо стягивает все регистры в одно место, тогда как при normal, хоть немного размазывает их по кристаллу - то, что мне нужно)

Screenshot_2019-12-01_16-41-38.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 минут назад, nice_vladi сказал:

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

Попробуйте задействовать Logic Lock Region-ы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, nice_vladi сказал:

 

Upd.

Интересно, что квартус при агрессивном фиттере упрямо стягивает все регистры в одно место, тогда как при normal, хоть немного размазывает их по кристаллу - то, что мне нужно)

Приветствую.

А регистры точно НЕ оптимизируются без явного запрета на это? И как осуществляется межклоковый переход между клоком АЦП и основным клоком? Ну и содержимое sdc файла в этой части не помешало бы увидеть. Для некоторых АЦП на просторах сети наблюдал примеры приема данных - так там для DDR режима использовались примитивы LVDS, что недопустимо. В итоге иначе описывались временные ограничения и потом разработчик не понимал, отчего от компиляции к компиляции разные результаты. За годы работы с квартусом такую картину наблюдаю в двух случаях - если неверные временные ограничения или если используются Logic Lock Region-ы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 мм).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, warrior-2001 сказал:

так там для DDR режима использовались примитивы LVDS, что недопустимо.

А есть ли какая информация от производителя что так делать нельзя?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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}]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...