Используйте dma Transfert с Cyclone V Avalon-MM для PCIe

Возможна ли передача DMA с IP-ядром "Cyclone V Avalon-MM для PCIe", предоставленным Altera в Qsys (квартал 14.0)?

Altera предоставляет ip-ядро под названием "Циклон V Avalon-MM DMA для PCIe" для передачи dma. Но это ip-ядро не поддерживает PCIe Gen1 с 1x полосой.

Демонстрационная версия (ep_g1x1) для "Cyclone V Avalon-MM для PCIe" включает в себя блок DMA, который подключен к шине TX Avalon мм ip-ядра PCIe.

Тогда мне интересно, возможно ли записать данные из этого блока DMA в корневой комплекс (хост)? Потому что я не могу найти, как это сделать.

2 ответа

Решение

Мне, наконец, удалось сделать запрос DMA с помощью "alclore core-ip" Cyclone V Avalon-MM для PCIe ". Тогда да, это возможно.

В моей системе Linux rootcomplex (RC) включен в i.MX6 с операционной системой Linux. Тогда большинство трюков действительно на стороне Linux.

Под драйвером Linux необходимо запросить PAGE с dma_alloc_coherent() вызов и адрес этой страницы должны быть записаны в регистр CRA с именами ADDR_MAP_LO0 и ADDR_MAP_HI0.

В моей системе страницы памяти имеют размер 4 КБ, затем мне пришлось настроить "параметры трансляции адресов" жесткого ip-устройства PCIe, чтобы страницы 4 КБ были согласованными.

После этого я просто подключил контроллер DMA, предоставленный Qsys, к подчиненному порту TX avalon-MM PCIe IP. Указание DMA записать данные на этот порт автоматически сгенерирует TLP из FPGA для записи на оперативную память i.MX6.

Исходя из моего краткого обзора материала, должна быть возможность выполнять чтение или запись DMA с RC на Cyclone V (EP) с использованием интересующего вас IP-ядра.

Я выполнял чтение и запись DMA на Stratix V, однако это было сделано не в Qsys, а только с использованием базового блока HIP PCIe (пользовательская логика кодирования и декодирования TLP). Этот блок, кажется, является оберткой вокруг их блока PCIe HIP, который также обрабатывает уровень транзакций для вас.

Первым шагом будет заставить ваш RC выдавать запросы чтения или записи PCIe DMA. В случае запроса на чтение вы захотите отправить запрос чтения из памяти с данными (CplD) длиной более 1 DWORD. Я бы посоветовал выделить весь BAR для отображения пространства памяти, из которого вы хотите DMA, на FPGA, чтобы упростить ориентацию вашего адреса.

На стороне FPGA, я бы предложил использовать Сигнал Tap и исследовать Rxm* сигналы интерфейса на ядре. Таким образом, вы можете увидеть точную синхронизацию запроса чтения DMA, который выходит из ядра. Я думаю, что RXMRead_<n>_o Сигнал будет высоким, указывая на начало запроса. В этот момент вам нужно будет декодировать и передать RxmAddress_<n>_o а также RXMBurstCount_<n>_o к некоторой клейкой логике, которая будет извлекать запрошенные данные из памяти FPGA. Как только вы будете готовы отправить данные, подтвердите RXMReadDataValid_<n>_i за каждое действительное слово отправляется.

Я предполагаю, что ядро ​​"Cyclone V Avalon-MM DMA для PCIe", на которое вы ссылались, заботится о той "клейкой" логике, которую я упомянул для вас, и позволяет вам напрямую подключаться к контроллеру SDRAM на вашей шине Qsys. Altera обычно не шифрует свой код мегафункции, поэтому, если ваша системная версия очень сильна, возможно, стоит поискать в их сгенерированных файлах и посмотреть, сможете ли вы каким-то образом повторно использовать этот бит кода.

Что касается основных настроек, единственное, на что я обратил внимание, - это то, что параметр Single DW Completer выключен. В противном случае ядро ​​прервет любые полученные запросы длиной более 1 DWORD.

Надеюсь, это помогло.

Другие вопросы по тегам