這是一個相當複雜的主題,因爲它們對解決方案有很多變種。該部分由ug871的第2章介紹,但不幸的是它使用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中,定義地址0的寄存器a,地址4的寄存器b和地址d的寄存器c(答案)。功能添加看起來像這樣:
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,我不知道該怎麼做。但通過ug871瀏覽它涵蓋了AXI-Lite寄存器接口。
第三種AXI稱爲AXI-Stream。它是一個沒有地址的通信總線,只有數據與一些標誌同步流。它通常用於不真正關心地址或AXI-DMA引擎的內核之間。主要問題是您無法直接將AXI-Stream連接到Zynq,AFAIK。
示例應用程序是xapp890,儘管它們使用Video-DMA核心,因爲它是一個視頻應用程序。它提供了更高性能的解決方案。在你的例子中,它將有一個輸入從AXI-Stream接收a/b,並且輸出主AXI-Stream返回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(精簡版,流標準)接口來交換您連接到Zynq AXI端口的數據。另外,你的IP也可以有一箇中斷信號。
如何通過PCIe連接zynq 7020而該芯片沒有PCIe? – Paebbels
嗯......對不起......但我不明白你的意思?@Paebbels –
XillyBus是一個PCI Express IP核,用於FPGA,帶有PCIe DMA驅動程序。但是您的Zynq 7020 FPGA沒有PCIe接口?!? – Paebbels