インテル® FPGA プログラマブル・アクセラレーション・カード N3000 の工場出荷時のイメージで複数の DMA ハンドルが同時に開かれると、Poll (interrupt) タイムアウトエラーが発生する場合があります。
タイムアウト・エラーは、1 つの割り込みを共有する 4 つの DMA ブロックを持つファクトリー・イメージ・デザインが原因です。
アプリケーションで複数のオープン DMA ハンドルが必要な場合は、以下のように AFU RTL デザインとソフトウェア・コードをカスタマイズします。
1. RTL デザイン:
デフォルトの afu.sv ファイルの 257 行目dma_irqは、avmm_ccip_host_wrモジュールの irq[0] に送信されます。
.irq ({3'b000、dma_irq})
デザインをカスタマイズして、DMA ブロックから各 irq を異なるビットにマッピングします。
2. ソフトウェアコード:
fpga_dma.c ファイルの 701 ~702 行目では、FPGARegisterEvent 関数は 0 を固定ベクトル ID として使用します。
res = fpgaRegisterEvent (dma_h->fpga_h、FPGA_EVENT_INTERRUPT、dma_h->eh、0 /*ベクトル id */);
RTL デザイン内の irq ビットにマップされる dma ハンドルに、異なる ID を登録します。
例えば、2 つの DMA ハンドルを組み合わせて DDRA と DDRB にアクセスするには、RTL コードをカスタマイズして、DDRA のafu_dma_0_instで dma_irqを irq[0] にマッピングし、DDRB のafu_dma_1_instで dma_irqを irq[1] にマッピングします。ソフトウェア コードでは、DMA ハンドル 0 のベクトル ID 0 を使用して DDRA にアクセスし、DMA ハンドル 1 のベクトル ID 1 を使用して、FPGARegisterEvent 関数で DDRB にアクセスします。