PCI Express* 用のインテル® Stratix® 10 HタイルおよびLタイル Avalon® メモリー・マップド・ハードIPユーザーガイド

ID 683667
日付 6/03/2020
Public
ドキュメント目次

8.2. 書き込みDMAの例

この例では、3つのデータブロックをAvalon-MM空間からPCIeアドレス空間 (システムメモリー) に移動させます。

注: 17.1リリース以降、インテルQuartus Primeプロ・エディション開発ソフトウェアは、パラメーター・エディターを使用して指定したパラメーターのデザイン例を動的に生成します。したがって、インテルQuartus Primeプロ・エディションのインストール・ディレクトリーは、インテルStratix 10デバイスのスタティック・デザイン例を提供しなくなりました。スタティック・デザイン例は、 インテル® Arria® 10および インテル® Cyclone® 10デバイスを含む、以前のデバイスファミリーで使用可能です。
図 63. インテルStratix 10 Gen3 x8 Avalon-MM DMA統合のプラットフォーム・デザイナー

次の図は、PCIeおよび-MMアドレス空間のデータブロックの位置とサイズ、およびディスクリプター・テーブルのフォーマットを示しています。この例では、RD_TABLE_SIZE の値は127です。

図 64. 書き込みDMAを使用してAvalon-MMアドレス空間からPCIeシステムメモリーに転送するデータブロック

ディスクリプター・テーブルには、128のエントリーが含まれています。ステータステーブルは、メモリー内の可変数のディスクリプターの前にあります。ReadおよびWrite StatusとDescriptor Tableは、それぞれ Read Descriptor Base Register および Write Descriptor Base Register で指定されたアドレスにあります。

図 65.  PCIe* システムメモリー内のディスクリプター・テーブル
  1. ソフトウェアは、ホストメモリー内のWrite Descriptor StatusテーブルおよびWrite Descriptor Controllerテーブルのメモリーを割り当てます。メモリー割り当てには、次の計算が必要です。
    1. 書き込みステータステーブルの各エントリーは4バイトです。128の書き込みエントリーには、512バイトのメモリーが必要です。
    2. 各ディスクリプターは32バイトです。3つのディスクリプターには、96バイトのメモリーが必要です。
      注: 起こり得るオーバーフロー状態を回避するには、ディスクリプターの初期数ではなく、RD_TABLE_SIZE によってサポートされるディスクリプターの数に必要なメモリーを割り当てます。
    ソフトウェアがステータステーブルおよびディスクリプター・テーブルに割り当てる必要のあるメモリーの合計は、608バイトです。Write Descriptor Controller Statusテーブルは、Read Descriptor Controller Statusテーブルに続きます。Read Statusテーブルのエントリーには、512バイトのメモリーが必要です。したがって、Write Descriptor Statusテーブルは0xF000_0200から始まります。
  2. 図 64 に示すアドレスからのオフセット0x200から始まるWrite Descriptor Controllerテーブルをプログラムします。3つのデータブロックには、3つのディスクリプターが必要です。
  3. ディスクリプター・テーブルの開始アドレスを使用して、Write Descriptor Controllerの Write Status and Descriptor Base レジスターをプログラムします。
  4. オンチップ書き込みディスクリプター・テーブルFIFOの開始アドレスで、Write Descriptor Controllerの Write Descriptor FIFO Base を、プログラムします。これは、プラットフォーム・デザイナーwr_dts_slave ポートのベースアドレスです。この例では、アドレスは0x0100_0200です。
    図 66. オンチップ書き込みFIFOのアドレス
  5. 各ディスクリプターのステータス更新を取得するには、Write Descriptor Controllerレジスター WR_CONTROL を0x1でプログラムします。この手順はオプションです。
  6. Write Descriptor Controllerレジスター WR_DMA_LAST_PTR に値3をプログラムします。このレジスターに書き込むと、Write Descriptor Controllerディスクリプター・テーブルのフェッチプロセスがトリガーされます。したがって、このレジスターへの書き込みは、DMA転送をセットアップする最後の手順である必要があります。
  7. ホストはMSI割り込みを待ちます。Write Descriptor Controllerは、最後のディスクリプターの完了後、MSIをホストに送信します。Write Descriptor Controllerは、Update も書き込みます。
  8. 移動させる追加のデータブロックがある場合は、次の手順を実行して、追加の転送を設定します。
    1. メモリーアドレス0xF000_0200 + (<前の最後のディスクリプター・ポインター> * 0x20) から始まるディスクリプター・テーブルをプログラムします。この場合、ディスクリプター・ポインターは3でした。
    2. Write Descriptor Controllerレジスター WR_DMA_LAST_PTR を、previous_value (3 in this case) + number of new descriptors でプログラムします。このレジスターに書き込むと、Write Descriptor Controllerディスクリプター・テーブルのフェッチプロセスがトリガーされます。したがって、このレジスターへの書き込みは、DMA転送をセットアップする最後の手順である必要があります。
      注: WR_DMA_LAST_PTRWR_TABLE_SIZE に近づいたら、必ず WR_TABLE_SIZE と等しい値で WR_DMA_LAST_PTR をプログラムしてください。そうすることで、最小のオフセット (この例では0xF000_0200) で最初のディスクリプターへのロールオーバーが確実に行われます。WR_DMA_LAST_PTR レジスターのプログラミングの詳細は、Write DMA Descriptor Controllerレジスター の項の WR_DMA_LAST_PTR の説明を参照してください。