ずいぶん前に、iCEstickという評価キットを入手しました。Lattice社製のiCE40というFPGAが搭載されている、USBポート直結で使える小型のFPGA評価キットです。何に使おうかとずっと悩んでいたのですが、3.3VのUSBシリアルが必要になったときに、iCEstickを思い出しました。Raspberry PIなどの小型コンピュータでは、ピン・ヘッダにターミナル用のUARTが接続できます。しかし、このピン・ヘッダにPC用のUSBシリアル・ケーブルは直接接続できません。一般的には、FTDIのICなどを使ってレベルを変換してから接続する必要があります。今回はICEstickをFTDI-USBシリアル変換ケーブル(アダプタ)として代用しました。
iCEstick Evaluation Kitについて
IrDAトランシーバーと、Pmodコネクタが搭載されているのが特徴です。また、USBとiCE40HX1Kの間にはFTDI 2232Hが接続されています。これを使えば、USBシリアルとして動作させることができます。
全体の接続
iCEstickとRaspberry PIの接続は次のとおりです。接続は、TX,RX,GNDの3本です。Raspberry PI側GPIOのTXとRXは専用ピンです。iCEstick側Pmodの接続端子は、FPGAの設定次第です。この例ではPmodの1番ピンをTX、2番ピンをRXとしています。
iCEcube2をつかったbitstreamの作成
HDLファイル
iCEstickに搭載されているFTDIのTXとRXを、Pmodコネクタから出力します。一言でいえば、FPGAをバイパスしているだけです。それだけでは寂しいので、デバッグ用としてサンプリングしたシリアル信号をLEDに出力しています(機能的には不要)。
module uart_ice ( input clk_in, input i_tx_pc, output o_rx_pc, output o_tx_pm, input i_rx_pm, output [4:0] led ); reg r_tx; reg r_rx; assign o_tx_pm = i_tx_pc; assign o_rx_pc = i_rx_pm; always @ (posedge clk_in) begin r_tx <= i_tx_pc; r_rx <= i_rx_pm; end assign led = {3'b0,r_rx,r_tx}; endmodule
iCEcube2でbitstream作成
iCE40の開発ツールは、Lattice Diamondではなく、iCEcube2です。Lattice Diamondに比べると、GUIが非常にシンプルです。論理合成にSymplifyが使われている点は、Lattice Diamondと同じです。
iCEcube2の使い方やプロジェクト・データの作成方法は、”iCEstick Evaluation Kit User’s Guide”というpdfとサンプル見れば一応なんとかなります。というよりも、それ以外に情報があまり見当たりません。基本的には、次の順番で処理を実行すると、FPGAに書き込むbitstreamデータが生成されます。
- Synthesis Tool->Run Synplify Pro Synthesis
- P&R Flow->Import P&R Input Files
- P&R Flow->Run Placer
- P&R Flow->Run Router
- P&R Flow->Generate Bitmap
FPGAのリソース使用率は次のとおりです。バイパスしているだけなので、FPGAのリソースはほとんど使っていません。
Final Design Statistics Number of LUTs : 0 Number of DFFs : 0 Number of DFFs packed to IO : 2 Number of Carrys : 0 Number of RAMs : 0 Number of ROMs : 0 Number of IOs : 9 Number of GBIOs : 1 Number of GBs : 0 Number of WarmBoot : 0 Number of PLLs : 0 Device Utilization Summary LogicCells : 0/1280 PLBs : 0/160 BRAMs : 0/16 IOs and GBIOs : 10/96 PLLs : 0/1
ピンアサインについて
“iCEstick Evaluation Kit User’s Guide”というpdfに記載されているボードの回路図を見ると、Pmodのピンアサインがわかります。実際に使用した設定は次のとおりです。
set_io clk_in 21 set_io i_tx_pc 9 set_io o_rx_pc 8 set_io o_tx_pm 78 set_io i_rx_pm 79 set_io led[0] 99 set_io led[1] 98 set_io led[2] 97 set_io led[3] 96 set_io led[4] 95
bitstreamの書き込み
bitstreamのプログラムはDiamond Programmerで行います。Diamond Programmerは、(iCEcube2ではなく)Lattice Diamondに含まれています。iCECube2ではiCE40HX1Kをプログラムできないようです。Diamond Programmerの具体的な設定方法は、”iCEstick Evaluation Kit User’s Guide”に詳しく手順が記載されています。
動作確認
Raspberry PIのGPIOとiCEstickのPmodをワイヤーで接続します。
Tera Termなどのターミナル・ソフトを起動します。iCEstickは、”USB Serial Port”として認識されるので、ボーレート115200で接続します。この状態でRaspberry PIに電源を投入すると、起動ログが表示されます。
まとめ
USBシリアルとして、問題なく動作しました(正確にはiCE40をバイパスしてFTDIを使っているだけですが。。)