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

Переход с AXI в обычный параллельный интерфейс

Народ!

 

Вводные данные:

- проект на Xilinx UltraScale+ (боард VCU118);

- часть содержимого пишется на HLS, часть на VeryLog.

 

Имеется следующая проблема:

- в проекте реализована связь с SDRAM DDR4 с использованием интерфейса AXI (на самом деле пока не реализована, но IP такой функции в Vivado есть);

- после того, как мы получили данные с DDR4 нам нужно передать их в память BRAM с обычным внешним интерфейсом (адрес, данные, запись, клок);

- сразу скажу использовать в памяти, на которую надо передать данные, интерфейс AXI невозможно, по ряду причин.

 

Пролистал библиотеку IP с AXI - нужного перехода не нашел. Что делать? Есть ли какие мысли?

Как вообще данные, живущие в Xilinx на AXI переходят в обычные?

Одно решение вроде как есть - использовать в интерфейсе c DDR4 не AXI, а параллельный интерфейс, но в будущем в проект будет добавлен PCI-e, а он только на AXI и работает, так что эту проблему все равно решать надо.

 

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


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

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

...

Пролистал библиотеку IP с AXI - нужного перехода не нашел. Что делать? Есть ли какие мысли?

Наверно быстро листали - не увидели AXI BRAM Controller.

 

Как вообще данные, живущие в Xilinx на AXI переходят в обычные?
Да по разному - зависит от того как Вы эти данные получаете и что с ними делать собираетесь.

Вообще свой контролер чтения/записи на AXI не сложен (с некоторыми ограничениями) и легко пишется под свои хотелки.

 

Удачи! Rob.

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


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

Наверно быстро листали - не увидели AXI BRAM Controller.

 

Я же написал, что использовать AXI BRAM controller не могу.

Дело в том, что этих самых контроллеров на блоках BRAM в проекте очень много (около 200) и Vivado HLS не смог мне оттранслировать программу с памятью с интерфейсом AXI при таком их количестве.

Изменено пользователем videoscan

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


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

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

Я же написал, что использовать AXI BRAM controller не могу.

Дело в том, что этих самых BRAM в проекте очень много (около 200) и Vivado HLS не смог мне оттранслировать программу с памятью с интерфейсом AXI.

И что же у Вас торчит из HLS модуля ? На сколько я понял (после отпуска моя подсистема телепатии еще не протрезвела :) )

... память BRAM с обычным внешним интерфейсом (адрес, данные, запись, клок);
Так ведь? Ну и кто мешает прикрутить сюда выход блока AXI BRAМ снаружи HLS модуля? Естественно с доп дешифрацией адресов. Или использовать AXI Data Mover в обвязке простенькой FSM и счетчика слов на stream выходе как addr для BRAM. Или тот же AXI DMA ..., или ... и.т.д. и.т.п.

 

Удачи! Rob

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


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

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

И что же у Вас торчит из HLS модуля ? На сколько я понял (после отпуска моя подсистема телепатии еще не протрезвела :) )

ap_memory торчит. Сама память объявляется в внешнем VeryLog.

 

Так ведь? Ну и кто мешает прикрутить сюда выход блока AXI BRAМ снаружи HLS модуля? Естественно с доп дешифрацией адресов.

С этим пока не разобрался.

Думал, может есть какой ip, который это делает или я что-то совсем не понимаю.

 

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


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

А можно всё же узнать что за задача. Тогда будет проще предложить как её решать.

 

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


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

ap_memory торчит. Сама память объявляется в внешнем Verilog.

так поменяйте в HLS интерфейс на m_axi.

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


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

А можно всё же узнать что за задача. Тогда будет проще предложить как её решать.

Имеется 6 буферов памяти 256*256 слов по 2 байта. Каждый из этих буферов делится директивой ARRAY_PARTITION на 32 куска (с опцией cyclic).

В эту память нужно очень быстро принимать данные из DDR4.

Обработка данных производится на модуле, написанном на HLS.

Память организована с внешним интерфейсом ap_memory.

На уровне ощущений мне кажется, что использование AXI в интерфейсе памяти затормозит работу вычислителя (а это для нас критично). Однако мы попробовали.

При попытке организовать интерфейс этой памяти как AXI (директивами INTERFACE с опцией s_axi) Synthesis делается очень долго (реально я не дождался его конца, ждал 4 часа).

С использованием ap_memory Synthesis проекта делается за 2-5 минут.

 

 

Вот и получается, что нам нужно прочесть данные с DDR4 (они идут на AXI) и записать их в память (ap_memory).

Изменено пользователем videoscan

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


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

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

 

Имеется 6 буферов памяти 256*256 слов по 2 байта. Каждый из этих буферов делится директивой ARRAY_PARTITION на 32 куска (с опцией cyclic).

В эту память нужно очень быстро принимать данные из DDR4.

Получается из HLS модуля торчит 6 * 32 ap_memoty интерфейсов 2Kx16 каждый

которые цепляются к одному из портов BRAM объявленых снаружи HLS?

 

Вот и получается, что нам нужно прочесть данные с DDR4 (они идут на AXI) и записать их в память (ap_memory).
Цепляем wr_data всех вторых портов BRAM параллельно к выходу например AXI Data Mover (если не хочется свою реализацию AXI read делать). Все адреса BRAM параллельно на младшие биты счетчика, старшими битами этого счетчика выбираем wr_en требуемой BRAM, счетчик считает принятые слова на выходе Data Mover. FSM программируем Data Mover на чтение 128K байт - по окончанию запускаем Ваш HSL модуль. И всех делов то. :)

А если еще сделать BRAM разной ширины по портам (со стороны DDR шире) то можно с экономить время на загрузку данных.

 

Удачи! Rob.

 

 

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


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

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

 

Получается из HLS модуля торчит 6 * 32 ap_memoty интерфейсов 2Kx16 каждый

которые цепляются к одному из портов BRAM объявленых снаружи HLS?

Получается из HLS модуля торчит 6 * 32 ap_memoty интерфейсов 2Kx16 каждый

из которых цепляется к своему модулю BRAM объявленному снаружи HLS.

 

 

Цепляем wr_data всех вторых портов BRAM параллельно к выходу например AXI Data Mover (если не хочется свою реализацию AXI read делать). Все адреса BRAM параллельно на младшие биты счетчика, старшими битами этого счетчика выбираем wr_en требуемой BRAM, счетчик считает принятые слова на выходе Data Mover. FSM программируем Data Mover на чтение 128K байт - по окончанию запускаем Ваш HSL модуль. И всех делов то. :)

А если еще сделать BRAM разной ширины по портам (со стороны DDR шире) то можно с экономить время на загрузку данных.

 

Удачи! Rob.

Пошли разбираться. Спасибо!

Изменено пользователем videoscan

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


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

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

Наверно быстро листали - не увидели AXI BRAM Controller.

 

Вы совершенно правы! Этот AXI BRAM Controller решает нашу проблему. Спасибо!

Прошу прощения за дальнейший поток сознания.

 

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


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

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

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

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

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

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

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

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

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

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