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

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

8.1. 読み出しDMAの例

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

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

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

図 60. 読み出しDMAを使用してPCIeからAvalon-MMアドレス空間に転送するデータブロック

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

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