ずいぶん前に、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を使っているだけですが。。)








