M5AtomでXilinx FPGAの無線接続書き込みアダプタを作る
M5AtomでXilinx FPGAの無線接続書き込みアダプタを作る
この記事は M5Stack Advent Calendar 2020 の10日目の記事です。
昨日は @1stship さんの M5StackをSlackで遠隔制御する お話でした。
Webフロントエンドとかあまり良く分かってないので、Slackからの操作という形で丸投げできるんであれば便利そうなので、機会が合ったら試してみたいと思います。
今日は誰得なのかわからないですが、FPGA絡みのネタです。
発端
2週間ほど前に格安のPCI Express接続可能なFPGAボードで遊んでいたところ、その翌日に、Facebookで教えてもらった中華激安 Zynq XC7Z010 搭載 FPGAボードが届きました。
PCI Express接続可能なボードの方は、開発用のLinux PCの筐体内に入れたため、ケーブルの長さの問題から、手持ちのXilinx FPGA用JTAGアダプターも一緒に筐体に入れていました。
このため、手持ちでXilinx FPGAに書き込むためのJTAGアダプタが無く、中華激安Zynqボードで遊ぶことができない状況でした。
ここで、 Xilinx Virtual Cable (XVC)
というものの存在を思い出しました。
Xilinx Virtual Cableとは
Xilinx Virtual Cable (XVC)
とは、システム構成上、FPGAへの書き込み用のJTAG接続アダプタが利用できない環境で、仮想的なJTAG接続を実現するためのTCP上の通信プロトコルです。
通常のJTAGアダプタと同様に、XilinxのFPGA開発環境 (Vivadoなど) から接続して、FPGAへのビットストリームの書き込みや、ロジックアナライザ機能を使用できます。
実体としては、TCP上でJTAGの信号の入出力内容をやり取りしているだけですので、実はそのままJTAGの信号が出力できるハードウェアから出力して、その信号をFPGAのJTAGピンに接続すれば、通常のJTAGアダプタと同様に動かせます。
PCI ExpressのVendor Extension機能をつかってFPGA内部のJTAGコントローラにアクセスするためのLinux用ドライバとサーバー・プログラムのソースコードは GitHub上で公開 されています。
(AWS F1 インスタンスなどのクラウドサーバー上でFPGAボードを使うサービスで利用されています。)
Raspberry Pi 4向けの実装
さて、前述のような簡単な仕組みなので、
- TCP/IPで通信ができる
- GPIOを操作して信号の入出力ができる
ハードウェアがあれば、そのうえでXVCを実装してやることにより、そのハードウェアをJTAGアダプタとして使うことができます。
これら2つの制約を満たすハードウェアで、Linuxが動くものとして一番最初に思い浮かぶのは、 Raspberry Pi
です。
実際、検索すると、Raspberry Pi向けの XVCサーバーの実装 が公開されています。
公開されているコードは Raspberry Pi 3用だったので、手元の Raspberry Pi 4用にGPIOのレジスタのアドレスを変更したところ、無事中華Zynqボードに接続できました。
ESP32向けのXVC実装
ここまでで Raspberry Pi を使って激安Xilinx FPGAボードで遊べるようになったので、終わりでもよかったのですが、ふと
- TCP/IPで通信ができる
- GPIOを操作して信号の入出力ができる
だけで良ければ ESP32
でも実装できるのではないかと思いました。
実際、 ESP-IDF (およびIDFをベースにしているArduino core for the ESP32やPlatformIO) では、Linux上とほぼ同じように socket
をつかったTCP/IP通信処理をコンパイルして実行できます。
また、当然GPIOも digitalRead
や digitalWrite
、 ESP-IDFのGPIO APIを使えば操作できます。
というわけで、Raspberry Pi向けのXVCサーバーを M5Atom Lite
上のArduino向けに移植してみました。
上記プログラムをコンパイルして書き込んで、Xilinx FPGAボードに接続すると、Xilinxの開発環境 (Vivado) から認識してデザインを書き込むことができました。
M5Atomを使った感想
以上、あまりM5シリーズ自体は関係ない話になってますが、これをやる気になったのも M5Atom Lite
が手元にあったからということは言えます。
他のESP32評価ボードと違って、筐体に入っていてあのサイズというのがかなり便利です。入れ物、大事。
あと、メモリ使用量には注意する必要がありますが、基本的なsocketによるTCP/IP通信プログラムであれば、かなり簡単に移植できることが分かりました。
Raspberry Piでは大げさすぎる物を移植するのに M5Atom
系を積極的に使っていこうと思います。 (たぶん…)
あした
あしたは @Tony0999 さんによる 急な体調不良時に使えるかもしれないボタン
です。
M5StickCとか出てきてなんかしらのサービス連携とかしそうな予感がしますので、解説が楽しみです。
Discussion