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

Возможна ли передача DMA с IP-ядром «Циклон В Авалон-ММ для PCIe» предоставлено altera в Qsys (quartus 14.0)?

Altera предоставляет IP-ядро с именем «Cyclone V Avalon-MM DMA for PCIe» сделать DMA Transfert. Но это ip-ядро не поддерживает PCIe Gen1 с полосой 1x.

Демонстрационный (ep_g1x1) проект «Циклон В Авалон-ММ для PCIe» включает в себя блок DMA, подключенный к шине Avalon-mm TX ip-ядра PCIe.

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


person FabienM    schedule 11.02.2015    source источник


Ответы (2)


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

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

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

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

person pwolfsberger    schedule 16.02.2015

Наконец-то мне удалось сделать запрос DMA с помощью «Cyclone V Avalon-MM for PCIe» с альтерой core-ip. Тогда да, это возможно.

В моей системе 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.

person FabienM    schedule 04.06.2015
comment
Я также работаю над Cycleon V Avalon-MM на интерфейсе PCIe для системы Linux X86. Я получил один виртуальный адрес в качестве возвращаемого значения API dma_alloc_coherent(), а также получил один dma_handle, который является физическим адресом DMA. Не могли бы вы предоставить мне расчет для настройки регистра CRA с именами ADDR_MAP_LO0 и ADDR_MAP_HI0? У меня размер страницы 4K, и я использую 32-битную ОС Linux. - person Ritesh Prajapati; 17.08.2015
comment
@RiteshPrajapati: вычислений нет, вам просто нужно записать значение указателя dma_handle в регистр CRA: iowrite32(dma_handle, &bar0[ADDR_MAP_LO]); - person FabienM; 14.09.2015