💨

M5AtomでXilinx FPGAの無線接続書き込みアダプタを作る

2020/12/09に公開

M5AtomでXilinx FPGAの無線接続書き込みアダプタを作る

この記事は M5Stack Advent Calendar 2020 の10日目の記事です。

昨日は @1stship さんの M5StackをSlackで遠隔制御する お話でした。

Webフロントエンドとかあまり良く分かってないので、Slackからの操作という形で丸投げできるんであれば便利そうなので、機会が合ったら試してみたいと思います。

今日は誰得なのかわからないですが、FPGA絡みのネタです。

発端

中華激安XC7Z010ボード

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ボードに接続できました。

Raspberry Pi 4を接続

ESP32向けのXVC実装

ここまでで Raspberry Pi を使って激安Xilinx FPGAボードで遊べるようになったので、終わりでもよかったのですが、ふと

  • TCP/IPで通信ができる
  • GPIOを操作して信号の入出力ができる

だけで良ければ ESP32 でも実装できるのではないかと思いました。

実際、 ESP-IDF (およびIDFをベースにしているArduino core for the ESP32やPlatformIO) では、Linux上とほぼ同じように socket をつかったTCP/IP通信処理をコンパイルして実行できます。
また、当然GPIOも digitalReaddigitalWrite、 ESP-IDFのGPIO APIを使えば操作できます。

というわけで、Raspberry Pi向けのXVCサーバーを M5Atom Lite 上のArduino向けに移植してみました。

https://github.com/ciniml/xvc-esp32

上記プログラムをコンパイルして書き込んで、Xilinx FPGAボードに接続すると、Xilinxの開発環境 (Vivado) から認識してデザインを書き込むことができました。

M5AtomでXVC

ILA波形

M5Atomを使った感想

以上、あまりM5シリーズ自体は関係ない話になってますが、これをやる気になったのも M5Atom Lite が手元にあったからということは言えます。

他のESP32評価ボードと違って、筐体に入っていてあのサイズというのがかなり便利です。入れ物、大事。

あと、メモリ使用量には注意する必要がありますが、基本的なsocketによるTCP/IP通信プログラムであれば、かなり簡単に移植できることが分かりました。

Raspberry Piでは大げさすぎる物を移植するのに M5Atom 系を積極的に使っていこうと思います。 (たぶん…)

あした

あしたは @Tony0999 さんによる 急な体調不良時に使えるかもしれないボタン です。

M5StickCとか出てきてなんかしらのサービス連携とかしそうな予感がしますので、解説が楽しみです。

Discussion