VivadoにおけるPCIe DMAのデバック　その１

# はじめに
PCでDMAをちょっと確認しようと思ったけど、評価ボードがやたら高額で、個人レベルでは少々二の足を踏むものばかり。
エンジニアのスキル向上を狙うなら、例えば高校生でもPCIのデバイスドライバをゴリゴリ書けるエンジニアが育つ子ことができる環境がないとだめですよね・・・。

そんなことを考えていたら、たまたま見つけたこちら・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/c8fa4713-9f7b-464f-af9c-d389429f3860.png)

とあるところで一万円以下で購入できます。
※ご存じない方は、画像で検索してみてください。

こちらのPCIeカード、x1ではありますが、Artix7 75Tを載せています。
残念ならが、DDRは載っていませんので、PCIeのDMA動作確認では、内部BRAMを使用することになります。
 
外部ポートとしてFTDIのFT601を搭載していますが、今回は使用しません。
というか、PCIeカードの状態なので、使用方法はかなり限定的です。

# まずはvivadoでプロジェクトを作成
## 構成
　・ vivado 2023.1.1
　・ LEDx2をAXI-Liteで読み取れるように
　・ BRAMでDMA用の空間を生成（64KB）
 BAR0
　・LEDアクセス
　・TEST用BRAM空間
 BAR1
　・64KB BRAM(DMA)
 BAR2
  ・64KB BRAM(バイパス)
※BAR1と2の接続先は同一メモリ。

プロジェクト自体はこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/7af0d938-f9a4-4364-a1ab-664f47c88215.png)

これを合成しbitファイルを生成してPCIeのFPGAに書き込み、デバック用PCを再起動した後、PCIのツール等で確認するとVendorがXilinxとして意図したものが出来上がっているのがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/122c18e1-fbaa-4969-80c5-7d5c3bb1373e.png)

https://adaptivesupport.amd.com/s/article/65444?language=en_US

なお、このドライバを使用すると、以下のメッセージで阻止されます。
![bf0ec62c-de00-4420-99a9-b1fba92ddb39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/7c970ea6-e33c-4bf6-be7e-a88975c069ac.png)

ドライバに関しては、AMD(Xilinx)謹製とJungo windriver、あとは自作のざっくり３パターンがあります。
自作はハードモードすぎるので、AMD(Xilinx)謹製とJungo windriverの２つを比較してみました。

# XDMA 向けドライバ開発手段の比較

## 比較対象
| 区分 | 概要 |
|------|------|
| AMD(Xilinx) 謹製ドライバ | Xilinx が提供していた Windows/Linux 用 XDMA カーネルドライバ。2024年以降は一般公開終了、要申請・認証。 |
| Jungo WinDriver | ユーザーモードドライバ開発フレームワーク。PCIe BARアクセス・DMA・割り込み対応。Windows/Linux両対応。 |
| 自作ドライバ | WDK（Windows）や Linux カーネル開発により、BARアクセス/DMA制御を1から実装。高度な柔軟性があるが工数大。 |

---

## 多面的比較表

| 観点 | AMD(Xilinx) 謹製ドライバ | Jungo WinDriver | 自作ドライバ |
|------|----------------------------|------------------|----------------|
| **対応OS** | Windows / Linux（Linux推奨） | Windows / Linux | 任意（構築次第） |
| **配布状態** | ❌ 一般公開終了<br>🔒 AMDポータル経由で申請・認証要 | ✅ ダウンロード可（評価版あり） | ✅ 自由（オープン or クローズ） |
| **開発難易度** | ◯ 中程度<br>（ソースあり、ビルドが必要） | ◎ 低<br>（GUI + Cコード自動生成） | ❌ 高<br>（PCIe/DMA/割り込み制御含む） |
| **BARアクセス制御** | ◎ 完全対応 | ◎ 対応（ユーザーモードで直接制御） | ◎ 制御可能（実装次第） |
| **DMA制御** | ◎ 完全対応 | ◯ 手動でレジスタ制御必要 | ◯ 実装可能だが複雑 |
| **割り込み処理** | ◎ 実装済（例: MSI） | ◯ 自作可（WinDriverサンプルあり） | ◯ 実装必要 |
| **性能（転送速度）** | ◎ 高速（実績あり） | ◯ 満足レベル（用途により十分） | ◯ 実装と最適化次第 |
| **カーネルコード必要性** | ✅ 必要（特にWindows） | ❌ 不要（ユーザーモード） | ✅ 必要（WDK/カーネル開発） |
| **商用利用ライセンス** | 無償（Vivadoに含まれる）※要許諾 | 有償（開発＋デプロイごと） | 自由（但し保守責任は自社） |
| **デバッグ性** | △ カーネルレベルは危険（BSODリスク） | ◎ ユーザーモードで安定デバッグ | △ カーネルでの経験必須 |
| **保守・更新性** | ❌ 不透明（既に一般公開停止） | ◎ 継続サポートあり | △ 自力での保守が必要 |
| **初期導入コスト** | 低（Vivadoとセット） | 中〜高（開発＋配布ライセンス）ただし、評価版でお試しOK | 低（人件費除く） |
| **学習コスト** | 中 | 低（GUI中心） | 高（PCIe・DMA・OS依存API） |
| **将来性** | ❌ 一般公開終了 | ◎ 現行製品・今後も更新あり | ◯ 自己依存・自由度高 |

---

## 推奨用途別まとめ

| 用途 | 推奨ドライバ |
|------|----------------|
| 高速転送／量産・製品用途（Linux可） | ✅ AMD(Xilinx) 謹製ドライバ（Linux） |
| プロトタイプ・GUI付きツール・開発効率重視 | ✅ Jungo WinDriver |
| 完全カスタム要件／リアルタイム制御／独自規格 | ✅ 自作ドライバ |

---

## 備考
- Jungo WinDriver は Windows ドライバ署名不要で動作可能（ユーザーモード）
- 自作ドライバは Linux/RTOSでも移植性が高いが、**PCIeスペックの深い知識が要求される**。



https://www.xlsoft.com/jp/index.html

一応AMDのXDMAドライバサイトへのアクセスをリクエストしていますが、(太客じゃないのでｗ)却下される可能性もあり、かといって自作は自分的にはハードすぎるので、とりあえずJungo WinDriver(ver.16.40 X64)を使用します。


# デバック用PCでのXDMAの認識確認

まずはWinDriverをインストールしてINFを作成し、ドライバを認識させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/a339917c-3b46-412e-81e8-7a675cab9836.png)



## DriverWizardから制御してみる
### AXI-Liteに入れた読み出し専用レジスタの読み出し。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/8ffb0095-fb54-4686-a83f-f36437e2a871.png)

### AXI-LiteにあるLED制御レジスタの書き込み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/4d75b91d-50de-4cd6-b848-8e221b54284e.png)

# その１のまとめ
ソフトを入れただけで簡易的ではありますが、XDMAにアクセスできるようになるのはとても魅力的ですね。
また、限定的ではありますが、評価ライセンスでもカーネルモードでのドライバ作成ができるっぽいようです。
興味がある方はお試しください。

その２に続きます・・・