2015-06-02 31 views
5

Zynq'in AXI-Stream arabiriminde C ile yazılmış yazılım uygulamamdan bazı verileri göndermenin bir yolunu arıyorum.Zynq'de AXI-Stream'e yazılım aracından nasıl veri gönderilir?

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

gibi bir şey ben Kol kısmında Linux kullanıyorum ve şimdi programlanabilir mantık kısmına bağlamayı istiyorum.

+0

'a bağlayabilirsiniz. Zynq donanımında AXI-Stream arabirimleri yoktur. Bu sizin PL'lere eklediğiniz anlamına gelir ve bağlantınızda daha fazla ayrıntıya gerek kalmadan size yardımcı olmayacaktır. –

cevap

5

Bir zynq cihazında Cortex-A9 işlemci ve FPGA arasındaki iletişim AXI protokolü kullanılarak yapılır.

  1. Genel Amaçlı AXI portları: 2x Usta ve 2x Slave port (FPGA CPU'SU) (FPGA gelen CPU'ya) FPGA ve CPU (Zynq TRM) arasında iletişim kurmak için kullanılabilecek bağlantı noktalarının üç tipi vardır. Bu portlar, işlem sisteminin merkezi ara bağlantısına bağlanır ve DDR bellek veya çip üzeri bellek (OCM) üzerinden veri aktarmak için kullanılabilir.
  2. Yüksek Performanslı AXI portları: doğrudan bağlı yüksek yayılımlı portu (CPU FPGA itibaren) Köle port: (FPGA gelen CPU'ya) 4x Köle portu DDR veya OCM'de
  3. ACP (Hızlandırıcı koherensinin Bağlantı Noktası) yüksek bandwidith erişimi sağlamak Snoop kontrol ünitesine (SCU). SCU önbellek tutarlılığını korur (önbellek boşluğu/geçersiz kılma gerekliliklerini ortadan kaldırır).

Sorunuzda, sizin durumunuzda CPU'nun iletişimin Master olduğunu anlarım. General-Purpose axi ana portlarını kullanmanız gerekecektir. AXI4 akış arabirimini AXI ara bağlantısına bağlayamazsınız. AXI4 Streaming - AXI dönüşümü yapmanız gerekir. Performans gereksinimlerinize bağlı olarak bir AXI DMA ip çekirdeği (AXI DMA IP core) iyi bir çözüm olabilir.

"Open (/ dev /)" yazılımını kullanarak yazılım bakış açısından iletişim kurmak istiyorsanız, bir Linux aygıt sürücüsüne ihtiyacınız olacaktır. DMA çekirdek kullanıyorsanız iletişim genellikle bu gibi görünecektir:

  • Başlat DMA çekirdek
  • DMA çekirdek alıp bunu

    1. Belirli bir bellek adresinden veri getirmek için DMA çekirdeğini yapılandıracak veri ve IP bloğunuzun AXI4 akış arabirimine besle
    2. IP bloğunuz veri üzerinde bir miktar işlem yapar ve belleğe geri gönderir (DMA kullanarak) veya başka bir şey yapar (harici arabirime gönderilir ...)

    DMA çekirdeğinizin kayıt seti bellek eşlemeli olacak ve kendi Linux aygıt sürücüsü ile erişilebilir olacaktır. Hata ayıklama amacıyla, kayıtlara erişmek ve donanımınızın işlemlerini hızlı bir şekilde doğrulamak için mmap kullanmanızı öneririm. Linux çekirdeği aygıt sürücüsüne gittiğinizde bu kitabı okumanızı öneririm: Linux Device Drivers 3the edition

  • 0

    Doğru bir şekilde anlarsam, DMA motorunu kullanarak PS'den PL'ye DMA verilerini kullanarak veriyi almak istersiniz. Bu durumda, Linux'ta AXI DMA motor sürücüsünü kullanacak veya DMA motorunu kullanıcı alanından yapılandıracak bir sürücü yazmanız gerekecektir.

    Bu sizin için mi arıyorsunuz?

    1

    Verimli veri aktarımı için en iyi seçim, DMA özellikli PS-PL iletişimini kullanmaktır. AXI CDMA gibi PL içinde bir DMA kontrolörü uyguladıktan sonra, bunu bir AXI4-Stream IP'ye ve ardından istediğiniz IP çekirdeğine bağlayabilirsiniz. Genel bir çerçeve kurmayacaksanız, mmap() sistem çağrısı kullanarak DDR belleğin DMA etkin bölümüne erişebilirsiniz. Burada, kullanıcı alanından bir geri döngü uygulandığı IP çekirdeğine veri aktarmak için bir şablon var. https://github.com/h-nasiri/Zynq-Linux-DMA Zynq AXI CDMA

    AXI CDMA DDR sistem belleği okuma/yazma erişimi için işleme sistemi, HP köle portunu kullanır. Ayrıca, DMA çekirdeğini başlatmak ve daha sonra veri aktarımını yapmak için mmap() kullanan Linux işletim sistemi tabanlı bir uygulama yazılımı da vardır. AXI4-Stream ara bağlantısını kolayca AXI CDMA'ya ekleyebilir ve