2015-05-11 52 views
4

我正在學習vivadoHLS,並且教程u871介紹瞭如何使用HLS並優化我的C/C++代碼。但我想知道如何將它們加載到我的主板zynq 7020中,讓它在板上運行。如何在zynq 7020上使用C/C++實現FPGA協處理?

我想要實現的是:主機(CPU板上)調用PL(FPGA)進行計算,並將參數發送到PL,然後PL將結果發送回CPU。

例如,在C的函數:加載(INT *一個,INT * B),這將分別添加[i]和B [i]和返回的數組INT *結果。,通過HLS,我可以展開for循環,然後計算會更快。 CPU將a和b的地址發送給PL,PL進行計算,並將結果地址發送回CPU。

在本教程中,它僅介紹如何使用HLS,不說明如何與PL和CPU進行通信,或者如何將其加載到板上,以便它可以在板上運行。

請推薦一個教程或告訴我在哪裏學習它,非常感謝!

+1

如何通過PCIe連接zynq 7020而該芯片沒有PCIe? – Paebbels

+0

嗯......對不起......但我不明白你的意思?@Paebbels –

+0

XillyBus是一個PCI Express IP核,用於FPGA,帶有PCIe DMA驅動程序。但是您的Zynq 7020 FPGA沒有PCIe接口?!? – Paebbels

回答

4

這是一個相當複雜的主題,因爲它們對解決方案有很多變種。該部分由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也可以有一箇中斷信號。

0

正如喬納森認爲的那樣,這是相當複雜的課題。你可以自己完成PL和CPU/RAM之間的所有通信工作(並且不要忘記驅動程序開發),但你也可以嘗試使用一些現有的工具。例如,我們嘗試了RSoC Framework,但可能存在更多這樣的「框架」。