個人情報保護方針 お支払いについて お問い合わせ

Raspberry Pi/Rock ComputeModuleにアルテラ製FPGAをPCIe接続


かなり前に入手した旧アルテラ製(Terasic製)のCycloneIV GX Starter KitをRock CM3に接続してみました。RaspberryPiCM4/RockCM3はPCIe Gen2x1(5Gbps)を搭載していることが通常のRaspberryPIとの大きな差になっていて、PCIeスロットを有するキャリアボードを使用することでPCIe接続のFPGAボードを使用することができます。



PCIeのIntel製FPGAを搭載したFPGAボードとなるとGen2x8やGen3等で、Stratix等の大きなFPGAを搭載したものがほとんどで、どれも高価です。Raspberry Piで使用できるのはGen2 x1までなので、そんな大規模なFPGAボードを接続しても意味がありませんが、小規模なFPGAボードはあまりないようです。

残念ながらCycloneIV GX Starter Kitは現在生産終了で入手できませんが、以前納入した実績のあるAltera Cyclone IV GX FPGA Development Kit $1295Cyclone V GT FPGA Development Kit $1299Intel Cyclone 10 GX FPGA Development Kit $1200は入手可能なようです。CycloneIVGXがPCIeGen1のみ対応なのに比べてCyclone10がGen2対応であることや、CycloneIVがかなり古いデバイスであること、旧アルテラ時代の製品はQuartus18.1までしかサポートされていないことを考えるとIntelFPGAでPCIeをする場合にはCycloneV/Cyclone10が良いと思われます。(AMD/ザイリンクスという選択肢もあります。こちらも追って検証していきます)。なお、x4のボードはより長いカードが挿入できるスロットアダプタを使用することでx1として使用することができます。

今回はまずアルテラ製のFPGAがRaspberry Pi/Rock ComputeModuleからアクセスできることを確認するのを目標にします。ボードが古いので、参考程度にはなるかと思いますが、FPGAデザインおよびLinuxドライバの作成方法に関しては基本的にCyclone10/Vとほぼ同一と考えてよいと思います。



まず、Quartus18.1でプロジェクトをコンパイルします。以前使用していたPCIeの速度評価用のデザインです。メモリに転送するのではなくDMA転送したものを64bitのAvalon-STバスでループバックするものです。メモリの帯域によらずPCIeの速度が測定できます。また、書込み専用時にはループバックせず破棄、読み込み専用時にはダミーデータの生成も行います。Cyclone IV GXデバイスのサポートはQuartus 18.1までになっていて、これ以降のQuartusではコンパイルできません。



コンパイルが通ってbitファイルが生成されたら、jicファイルに変換します。CycloneIV GX Starter KitはEPCS128デバイスまたはパラレルフラッシュからコンフィギュレーションできるようになっていて初期値はパラレルフラッシュにDIPSWが設定されています。パラレルフラッシュにはNiosCPUのプログラムやデータを置くと便利なので、DIPSWを変更してEPCSコンフィグROMにデータを書きます。EPCSデバイスは直接10ピンのJTAG端子に接続されていません。そのため、FPGAにECPSにコンフィギュレーションをするためのダウンローダーを書込み、そこから書き込むことになります。jicとはJTAG Indirect Configurationのことで間接的に書き込みます。具体的にはQuartusのFileメニューからConvert Programming Filesを選択し、



上記画面のようにConfiguration deviceにEPCS128を選択、Flash Loaderに使用しているFPGA(今回はEP4CGXC15)指定し、コンパイルしたsofを追加して Gererateボタンを押すだけです。



次にToolsメニューのProgrammerを起動します。



FPGAボードをキャリアボードのPCIeスロットに挿入するか、付属のACアダプタから電源を供給します。USBブラスターケーブルをUSBに接続し、作成したjicファイルを追加して、Program/Configureにチェックを入れてStartボタンを押します。一旦電源を切って再度電源を投入します。



RaspberryPiOSまたはUbuntuが起動すると、lspciコマンドでアルテラのPCIデバイスが確認できます。lspciコマンドで確認できるのはベンダーID、プロダクトID,ボードの種別とBAR空間の数と大きさまでです。



ドライバをコンパイルして、insmod(loadスクリプト)でドライバを組み込むと/dev/以下に /dev/civgx0デバイスが見えるようになります。簡単な読み書きテストをしています。RaspberryuPi CM4/Rock CM3ではGen2x1接続で230MB/sほどが出るそうですが、このデザインはGen1x1で70MB/s程度のようです。今回はまず接続できることを確認するのが目的なので速度チューニングなどは行いません。以前Kernel2.6用にLinuxドライバを作成してからいくつか変更が必要だったのでメモしておきます。

  • Kernel2.6/3時代の使われなくなった定義の削除と必須になったライセンス定義の追加
  • DMA可能なメモリの確保と使用方法の変更(Kernel 5.18以前と以降で異なる)
  • マルチスレッドCPUへの対応(単純な割り込み禁止からSpinlockへの変更)

RaspberryPiもマルチコアになって、ドライバもマルチCPUを考慮したコーディングが必要になっているようです。旧Xilnxは古くからXDMAドライバを提供し、更新していますが、旧アルテラのCycloneGXデバイス用のLinuxドライバはおそらく公式には提供されておらず、資料もとても少ないです。このあたりがIntel/アルテラのPCIeボードを使う上で敷居を上げている気がします。GroveDesignServiceではオリジナルのFPGAデザインに対応したLinuxドライバも作成できます。今回使用したFPGAデザインやドライバは公開していませんが、Intex/アルテラ製PCIeボードを検討していて、事前に試してみたいという要望があれば、評価用のセットをお貸しすることも検討しますので、お気軽にお問合せください。

アクセスカウンター アクセスカウンター