FPGA また始めました

Xilinx Spartan-3 Logo

少し前から随所で FPGA の活用が盛り上がってる (特にサーバサイドで) という話を耳にするようになり、 自分も HDL でまたなんか書きたい熱が高まってきていたのですが、 先日ようやく、大昔に買った Xilinx FPGA の評価キットを家の中から発掘してきました。

出てきたブツはこれです。

かつて自分の Trac サイトで公開していた VHDL のコードも発掘してきて github.com に移しました。 Spartan-3 Starter Board に OpenCores の Plasma MIPS コア に 8 色フレームバッファ出力とシリアルポートの回路を載せて、 リモートデバッグのスタブを書いて GDB プレゼンとかやったなあ。 9 年くらい前 のことですが。

当時使っていた Xilinx の開発ツール ISE は バージョンアップを重ねた後 2013 年で開発終了になってましたが、 最終版の ISE 14.7 WebPACK ライセンスを Ubuntu 14.10 64bit のデスクトップにインストールして、 かつての VHDL のデザインを論理合成してみました。

論理合成とビットストリーム生成までは昔の Makefile がそのまま動いて 拍子抜けするほど簡単でしたが、 FPGA デバイスへのビットストリームの書き込みは予想通り一筋縄ではいかず、 これだけに丸一日を費やすことになってしまいました。

まず書き込みに必要な JTAG ケーブルはパラレルポート接続のものしかなく、 これが使える PC は自宅にはもはやありませんので、 USB 接続回路が内蔵されている (EZ-USB FX2LP マイコンが載っている) Spartan-3E Starter Board に書き込む方針でした。

謎のプロプラエタリドライバを使うことを強制されていきなり詰むことを危惧していましたが、 最近の Linux 向け EDA はしっかり libusb ベースになってるようで、 その心配はありませんでした。 /usr/share にファームウェアの .hex ファイルを置かないと動かないこと、 LD_LIBRARY_PATH に入ってる libstdc++.so.6 が古すぎて Chrome や Firefox がろくに起動できないことに悪態をつきつつセットアップを完了させ、 ISE の JTAG ツール iMPACT を起動しますが、これがどうやってもデバイスを認識しません。

AutoDetecting cable. Please wait.
*** WARNING ***: When port is set to auto detect mode, cable speed is set to
default 6 MHz regardless of explicit arguments supplied for setting the baud
rates
Connecting to cable (Usb Port - USB21).
Checking cable driver.
File version of /opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/xusbdfwu.hex = 1030.
File version of /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex = 1030.
 Using libusb.
 Kernel release = 3.13.0-40-generic.
 Max current requested during enumeration is 74 mA.
Type = 0x0004.
 Cable Type = 3, Revision = 0.
 Setting cable speed to 6 MHz.
control tranfer failed.
write cmdbuffer failed 20000020.
Error reading reference voltage level.
Cable connection failed.

検索すると こういう Linux 用独自ドライバ を公開してくれている人もいて試してみたのですがだめ。 最後の手段で VirtualBox の Windows 7 に ISE 14.7 Lab Tools (iMPACT など書き込みツールのみの配布物) をインストールして試しますがやっぱりうまくいきませんでした。

症状はどちらの OS でもだいたい同じで、 USB でコントロールのトランザクションがタイムアウトしてしまいます。 さらに検索しても、 ケーブルが壊れてるんではといったような役に立たない情報しか得られません。

[767848.345263] usb 2-1.6: new high-speed USB device number 34 using ehci-pci
[767848.437989] usb 2-1.6: New USB device found, idVendor=03fd, idProduct=0008
[767848.437993] usb 2-1.6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[767848.437996] usb 2-1.6: Product: XILINX    
[767848.437998] usb 2-1.6: Manufacturer: XILINX 
[767854.468345] usb 2-1.6: usbfs: USBDEVFS_CONTROL failed cmd _impact rqt 192 rq 176 len 1 ret -110

一日中試行錯誤して悩んだ末、だめもとで Ubuntu に ISE 11.1 Programming Tools をインストールして iMPACT を起動してみたところ…

AutoDetecting cable. Please wait.
PROGRESS_START - Starting Operation.
Reusing A0010001 key.
Reusing 24010001 key.
Connecting to cable (Usb Port - USB21).
Checking cable driver.
File version of /opt/Xilinx/11.1/ProgrammingTools/bin/lin64/xusbdfwu.hex = 1030.
File version of /etc/hotplug/usb/xusbdfwu.fw/xusbdfwu.hex = 1030.
 Using libusb.
 Max current requested during enumeration is 74 mA.
Type = 0x0004.
 Cable Type = 3, Revision = 0.
 Setting cable speed to 6 MHz.
Cable connection established.
Firmware version = 1028.
File version of /opt/Xilinx/11.1/ProgrammingTools/data/xusb_xlp.hex = 1303.
Firmware hex file version = 1303.
Downloading /opt/Xilinx/11.1/ProgrammingTools/data/xusb_xlp.hex.
Downloaded firmware version = 1303.
PLD file version = 0012h.
 PLD version = 0006h.
WARNING:iMPACT - Platform Cable USB firmware must be updated. This operation may   take up to 10 seconds. Please
    do not stop the process or disconnect the cable prior to completion. The   cable STATUS LED will be RED for the duration
    of the update process.
Updating the cable firmware...
PROGRESS_START - Starting Operation.
Firmware update completed successfully.
PROGRESS_END - End Operation.
Elapsed time =     22 sec.
Attempting to identify devices in the boundary-scan chain configuration...

基板上の赤色 LED を光らせてなにやら書き込んだ後、 iMPACT が JTAG チェーン上の FPGA デバイスをばっちり認識するようになりました! この後は ISE 14.7 の iMPACT でもうまくいくようになりました。

ISE 14.7 iMPACT with S3EBOARD

どうやら基板上の EZ-USB か PLD のファームウェアが古かったのが原因だったようですが、 最新 ISE ではそれを更新できないというのは困ったものです。 古い Spartan-3E Starter Board や USB JTAG ケーブルがうまく動かなくて困っている人は 一度古い ISE の Programming Tools の iMPACT を起動してみるといいかもしれません。

Spartan-3 Starter Board と Spartan-3E Starter Board はクロックが同じ 50MHz だったので、 9 年前の Spartan-3 用の VGA の模様を書く回路UCF ファイルのピン配置を変更するだけで Spartan-3E でもそのまま動かせました。 ディスプレイ (ASUS PB278Q) にアナログ VGA 入力があってよかった…。

ということで、今回めでたく Spartan-3E Starter Board が再び使えるようになったのですが、 いかんせん Spartan-3E では古すぎるので、 新しい FPGA の評価キットを買いたいと思っています。 いま買うならどれがおすすめなんでしょう?

Xilinx や Altera の純正キットはちょっと値段がお高いので、 今のところは秋月電子通商で Digilent の USB JTAG ケーブルZYBO あたりを買って試そうかなと思っております。

2015/03/03 06:51:03 JST