Из моего краткого обезжиренного материала, должна быть возможность выдавать 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.
Надейтесь, который помог несколько.
Я также работаю над Cycleon V Avalon-MM на интерфейсе PCIe для системы Linux X86. Я получил один виртуальный адрес в качестве возвращаемого значения dma_alloc_coherent() api, а также получил один dma_handle, который является физическим адресом DMA. Не могли бы вы предоставить мне расчет для настройки регистра CRA с именем ADDR_MAP_LO0 и ADDR_MAP_HI0? У меня размер страницы 4K, и я использую 32-битную ОС Linux. –
@RiteshPrajapati: вычислений нет, вам просто нужно написать значение указателя dma_handle в регистре CRA: iowrite32 (dma_handle, & bar0 [ADDR_MAP_LO]); – FabienM