2015-02-11 21 views
0

Возможно ли сделать передачи DMA с ядром IP «Cyclone V Avalon-MM for PCIe», предоставленным altera в Qsys (quartus 14.0)?Использовать dma transfert с Cyclone V Avalon-MM для PCIe

Altera предоставляет ip-core с именем «Cyclone V Avalon-MM DMA for PCIe», чтобы сделать dma transfert. Но это ip-ядро не поддерживает PCIe Gen1 с 1x полосой.

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

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

ответ

0

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

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

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

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

После этого я просто подключил контроллер DMA, поставляемый Qsys, на ведомом порту AVA-LON TX-PCI PCI. Сообщая, что DMA для записи данных на этом порту автоматически генерирует TLP из FPGA для записи на RAM i.MX6.

+0

Я также работаю над Cycleon V Avalon-MM на интерфейсе PCIe для системы Linux X86. Я получил один виртуальный адрес в качестве возвращаемого значения dma_alloc_coherent() api, а также получил один dma_handle, который является физическим адресом DMA. Не могли бы вы предоставить мне расчет для настройки регистра CRA с именем ADDR_MAP_LO0 и ADDR_MAP_HI0? У меня размер страницы 4K, и я использую 32-битную ОС Linux. –

+0

@RiteshPrajapati: вычислений нет, вам просто нужно написать значение указателя dma_handle в регистре CRA: iowrite32 (dma_handle, & bar0 [ADDR_MAP_LO]); – FabienM

1

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

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

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

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

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

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

Надейтесь, который помог несколько.