Jump to content

    

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

Всем привет,

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

(* IOB = "TRUE" *)

Module  my_module( ...

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

Share this post


Link to post
Share on other sites
12 minutes ago, Skryppy said:

...

(* IOB = "TRUE" *)

...

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites
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% заполнен, рассчитывал, что все прекрасно пролезет.

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

Share this post


Link to post
Share on other sites
18 minutes ago, nice_vladi said:

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

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

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

Share this post


Link to post
Share on other sites
32 minutes ago, des00 said:

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

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

Share this post


Link to post
Share on other sites
11 hours ago, nice_vladi said:

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

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

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

Share this post


Link to post
Share on other sites

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

 

Upd.

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

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

Share this post


Link to post
Share on other sites
45 минут назад, nice_vladi сказал:

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

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

Share this post


Link to post
Share on other sites
19 часов назад, nice_vladi сказал:

 

Upd.

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

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

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

Share this post


Link to post
Share on other sites
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 мм).

 

Share this post


Link to post
Share on other sites
2 часа назад, warrior-2001 сказал:

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

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

Share this post


Link to post
Share on other sites
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}]

 

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