2015-05-11 5 views
4

Я изучаю vivadoHLS, а в учебнике u871 рассказывается о том, как использовать HLS и оптимизировать код C/C++. Но я хочу знать, как загрузить их в мою плату zynq 7020, пусть это будет работать на борту.как реализовать сопроцессор FPGA с C/C++ на zynq 7020?

Что я хочу реализовать: хост (CPU на плате) вызывает PL (FPGA) для вычисления и отправки параметров в PL, тогда PL отправляет результат в CPU.

Например, функция в C: добавить (интермедиат * а, Int * б), что добавит [I] и B [I], соответственно, и возвращает массив INT * результат., через HLS я могу развернуть цикл for, тогда он будет быстрее вычисляться. CPU отправляет адрес a и b в PL, PL вычисляет и отправляет адрес результата обратно в CPU.

В учебнике описывается, как использовать HLS, не объясняет, как передавать PL и CPU, или как загрузить его на борт, чтобы он мог работать на плате.

Пожалуйста, порекомендуйте учебник или скажите, где его изучить, спасибо много!

+1

Как вы подключаете zynq 7020 через PCIe, тогда как у этого чипа нет PCIe? – Paebbels

+0

Umm ... Извините ... но я не совсем понимаю, что вы имеете в виду? @Paebbels –

+0

XillyBus - это IP-ядро PCI Express для FPGA, которое поставляется с драйвером PCIe DMA. Но у вашего Zynq 7020 FPGA нет интерфейса PCIe?!? – Paebbels

ответ

4

Это довольно сложный вопрос, так как они представляют собой много вариантов решения. Эта часть рассматривается в главе 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-адрес также может иметь сигнал прерывания.

0

Как Джонатан вычислил, это довольно сложный вопрос. Вы можете делать все материалы связи между PL и CPU/RAM собственными (и не забывайте о разработке драйверов), но вы также можете попробовать использовать некоторые существующие инструменты. Например, мы пробовали RSoC Framework, но, возможно, существуют такие «рамки».