Это довольно сложный вопрос, так как они представляют собой много вариантов решения. Эта часть рассматривается в главе 2 ug871, но, к сожалению, она использует EDK вместо Vivado. Однако концепции Vivado HLS одинаковы. Вы также можете посмотреть xapp890.
В основном, Zynq использует порты AXI для подключения к PL. Порт AXI - это классический адрес + шина данных. Существует 2 типа AXI, стандартные и облегченные. Lite-версия не поддерживает пакет, фокусируется на использовании меньшей площади за счет производительности и обычно используется для интерфейса регистра. Стандартный AXI имеет очень высокие характеристики и поддерживает всплески, вы обычно используете его для подключения к памяти DDR.
В Zynq есть несколько портов AXI, как ведущий, так и подчиненный. Ведомые порты позволяют вашему IP читать/записывать в пространство памяти Zynq. Мастер-порты позволяют Zynq читать/записывать в пространство памяти ваших ядер. Несколько портов имеют разные характеристики, GP следует использовать для низкопроизводительных AXI-Lite, от HP до IP, которые нуждаются в более прямом доступе к памяти Zynq DDR.
Самый простой способ подключения вашего IP-адреса - использовать AXI-lite. В Vivado HLS определите регистр a по адресу 0, зарегистрируйте b по адресу 4 и зарегистрируйте c (ответ) по адресу d. Функция добавь будет выглядеть примерно так:
int add(int a, int b)
{
volatile int *my_ipaddr = MY_IP_BASEADDR; // Address is configured in Vivado block design
*(my_ipaddr+0) = a;
*(my_ipaddr+1) = b;
return *(my_ipaddr+2);
}
Как я не использую Vivado HLS, я не знаю, как это сделать. Но skimming через ug871 он охватывает интерфейс регистра AXI-Lite.
Третий тип AXI называется AXI-Stream. Это коммуникационная шина без адреса, только данные присутствуют с некоторыми флагами для синхронизации потока. Он обычно используется между ядрами, которые не заботятся о адресах или двигателе AXI-DMA. Основная проблема заключается в том, что вы не можете подключить AXI-Stream напрямую к Zynq, AFAIK.
Примером приложения является xapp890, хотя они используют ядро Video-DMA, поскольку это видеоприложение. Он обеспечивает более высокую производительность. В вашем примере у него будет входной ведомый AXI-Stream для получения a/b и выходного AXI-потока для возврата c. Вы соединили бы ядро с ядром AXI-DMA IP, и псевдо-код будет:
void add(int *ab, int *c, unsigned int length)
{
XAxi_Dma_Start_Transfer((void *)ab, length, CHANNEL_MM2S); // Not actual function, MM2S stands for memory to stream
XAxi_Dma_Start_Transfer((void *)c, length, CHANNEL_S2MM); // S2MM = stream to memory
while(XAxi_Dma_Transfer_Done == 0) {} // Wait end of transfer
}
Это много информации, но, надеюсь, это позволит вам понять заметки приложений.Подводя итог, ваш IP должен предоставить интерфейсы AXI (Lite, Standard of Stream) для обмена данными, которые вы подключаете к портам Zynq AXI. Кроме того, ваш IP-адрес также может иметь сигнал прерывания.
Как вы подключаете zynq 7020 через PCIe, тогда как у этого чипа нет PCIe? – Paebbels
Umm ... Извините ... но я не совсем понимаю, что вы имеете в виду? @Paebbels –
XillyBus - это IP-ядро PCI Express для FPGA, которое поставляется с драйвером PCIe DMA. Но у вашего Zynq 7020 FPGA нет интерфейса PCIe?!? – Paebbels