2015-06-02 20 views
5

Sto cercando un modo per inviare alcuni dati dalla mia app software scritta in C all'interfaccia AXI-Stream di Zynq. Qualcosa di simileCome inviare dati a AXI-Stream in Zynq dallo strumento software?

open(/dev/axistream); 
send_data(data); 

Sto lavorando con Linux da parte del braccio e ora voglio collegarlo alla parte logica programmabile.

+0

L'hardware Zynq non ha interfacce AXI-Stream. Questo significa che il tuo è stato aggiunto al PL, e senza ulteriori dettagli sulla tua connettività non sarà possibile aiutarti. –

risposta

5

Su una comunicazione dispositivo zynq tra il processore Cortex-A9 e FPGA viene fatto utilizzando il protocollo AXI. Ci sono tre tipi di porte che possono essere utilizzati per la comunicazione tra FPGA e CPU (Zynq TRM):

  1. General Purpose porte AXI: 2x Master (da CPU a FPGA) e la porta 2x Slave (da FPGA per CPU). queste porte sono collegate all'interconnessione centrale del sistema di elaborazione e possono essere utilizzate per trasferire dati da/a memoria DDR o memoria on-chip (OCM).
  2. High Performance porte AXI: porta 4x Slave (da FPGA per CPU) fornire un accesso ad alta bandwidith a DDR o OCM
  3. ACP (Acceleratore Coerenza Porta): porta Slave (da FPGA per CPU) porta ad alta troughput collegato direttamente all'unità di controllo snoop (SCU). La SCU mantiene la coerenza della cache (ommette la necessità di svuotare/invalidare la cache).

Dalla tua domanda, vorrei capire che nel tuo caso la CPU è il Maestro della comunicazione. Sarà necessario utilizzare le porte master axi General-Purpose. Non è possibile collegare un'interfaccia di streaming AXI4 all'interconnessione AXI. Dovrai convertire AXI4 Streaming in AXI. A seconda delle prestazioni, è necessario un core IP AXI DMA (AXI DMA IP core).

Se si desidera comunicare dal punto di vista del software utilizzando "open (/ dev /)" è necessario un driver di periferica Linux. Se si utilizza il nucleo DMA vostra comunicazione in genere simile a questa:

  1. potrete configurare il nucleo DMA per recuperare i dati da un certo indirizzo di memoria
  2. Avviare il nucleo DMA
  3. il nucleo DMA preleverà i dati e alimentali all'interfaccia di streaming AXI4 del tuo blocco IP
  4. Il tuo blocco IP eseguirà qualche operazione sui dati e li rimetterà in memoria (usando DMA) o eseguirà qualcos'altro (invia all'interfaccia esterna, ...)

Il set di registri del core DMA sarà mappato in memoria e accessibile tramite il proprio driver di periferica linux. Per motivi di debug, suggerirei di utilizzare mmap per accedere ai registri e convalidare rapidamente le operazioni dell'hardware. Una volta che si utilizza il driver di periferica del kernel linux, suggerisco di leggere questo libro: Linux Device Drivers 3the edition

0

Se ho capito bene, si vogliono i dati DMA da PS a PL usando il motore DMA. In tal caso, è necessario scrivere un driver in Linux che utilizzi il driver del motore AXI DMA o configurare il motore DMA dallo spazio utente.

È quello che stai cercando?

1

La scelta migliore per il trasferimento efficiente dei dati sta utilizzando la comunicazione PS-PL abilitata DMA. Dopo aver implementato un controller DMA all'interno di PL, come AXI CDMA, è possibile collegarlo a un AXI4-Stream IP quindi al core IP desiderato. Se non si intende configurare un framework generale, è possibile accedere alla parte DDR della memoria DDR utilizzando la chiamata di sistema mmap(). Ecco un modello per trasferire i dati dallo spazio utente al core IP in cui è implementato un loop-back. https://github.com/h-nasiri/Zynq-Linux-DMA Zynq AXI CDMA

L'AXI CDMA utilizza sistema di elaborazione HP porta slave per ottenere lettura/scrittura della memoria di sistema DDR. Esiste anche un software applicativo basato su SO Linux che utilizza mmap() per inizializzare il core DMA e quindi effettuare il trasferimento dei dati. È possibile aggiungere facilmente un'interconnessione AXI4-Stream a AXI CDMA e connettere