2018年03月13日

最近の lattice FPGA

以前 QFN32 の MachXO2 について記事を書いたが、久しぶりに製品をみたら、いろいろと興味深いものが出ている。

    ピン数が多い FPGA は、BGA が主流で もはや 電子工作で扱える感じではなくなっている。QFP はまだあるが、沢山の線を使うということは、たいへんな配線をしてなにかデバイスをつなぐということであり、予算と気合いがいる。QFN は配線が結構難しく、はんだづけも厳しいのだが、それゆえに電子工作としては楽しいと思っていて興味があるのだ。

MachXO2 1200HC 4SG32C(QFN32) - 509円(mouser)

QFN32 パッケージの MachXO2 に 1200HC が追加されていた。256 では出来ることが限られていたが、これだとマイクロコントローラが入る。しかも、256 と比べてそう高くない。

ICE40 LP384 SG32 - 195円(mouser)

もうひとつ QFN32 のチップが出ていた。384 だからたいしたことは出来ないが、お安い。ただし、多電源だったりして MachXO2 のように お手軽な感じではないようだ。

ICE40 UP5K (QFN48) - 876円(mouser)
ICE40 LP1K (QFN48) - 462円(mouser)

UP5K は、1Mbit - 128KB の RAM がある。それとは別に 120kbit の RAM(EBR) も。LUT 規模も 5K だからそこそこ。 さらに DSP ブロック(16x16乗算器 or ACC)が8つ。多電源ではあるが、規模が大きいし、これなら許容できる。
LP1K は、安い。UP5K 用の基板を作る場合 LP1K でお試ししてみるのも良いかも知れない。(LUT 1100, EBR 64kbit,DSP 2)

    DSP は、16x16乗算器 または 32bit アキュームレータの機能があるそうだ。メモリもあって演算が出来るわけだから、なにか面白いものが作れそうではある。が、私はあまり知識がない。とりあえず MIPS 32bit プロセッサを作ってみたい程度。あるいは、相互に高速通信が出来るようにして、多数つなげる。。。みたいな何か。

    LP1K も MachXO2 1200HC とあまり変わらないから、自作 AVR いけると思ったが厳しい。せっかく乗算器があるんだから、 と思ったが使いこなせてようやくシュリンクできる気もする。

また、これらを載せた小型ボード TinyFPGA というものもある。
type A は、MachXO2 で部品がほとんどない。type B は、iCE40 LP8K だが、なにやら部品が沢山。三端子レギュレータが2つに、SPI FLASH 。あと書き込むための USB とコントローラ(おそらく PIC)。
iCE40 をシンプルに使えないか?

電源としてコア電圧が 1.2V -- MachXO2 はレギュレータ内蔵でシンプルに使えるが、iCE40 にはない。次に I/O 用。 (3.3V 系まで)。さらに 内蔵 FLASH 用に 2.5V 。

1.2V はしかたがないにしても 2.5V が余計なのだ。調べると 2.5V が必要なのは、内蔵 FLASH 書き込み時だけで、それ以外では 3.3V を供給して良い。

1) いっそのこと SPI FLASH でコンフィグすることにすれば、3.3V に統一できる。type B に SPI FLASH が載っているのは、たぶんそういう理由。さらに言うと、論理合成は Diamond ではなく、ICEcube2 という別ツールで行うのだが、内蔵 FLASH への書き込みは、Diamond で行う -- 煩雑なのである。

2) I/O 電圧を 2.85V に統一してしまう。内蔵 FLASH は、3.0V 以下なら書き込みできる。3.3V 系と言っても、ほとんどのデバイスは 2.7V で動作する。統一できれば、面倒はなくなる。

3) 内蔵 FLASH 書き込み時だけ I/O 電圧を下げる。サブボードにして、書き込み時にデバイスを接続しないのであれば、これでも良い。

とにかく、I/O 電圧を 外部入力にして、レギュレータ1つだけで済ますことはできそうだ。

コンフィグについて

iCE40 は、3通りのコンフィグが可能。
 1) 内蔵 FLASH
 2) SPI master (SPI FLASH)
 3) SPI slave (RAM only)

内蔵 FLASH は、SPI slave で書き込む。SPI で直接コンフィグもできる。SPI ポートは SPI FLASH と兼用で(工夫がいるが)パラレルに接続できる。5K のコンフィグは 100KB 程度。出力ファイルは bin, nvcm(内蔵 FLASH), hex(SPI FLASH)。

SPI FLASH には、4つまでのコンフィグを格納でき、ブート時に選択が可能。

    書き換え用の コンフィグを作れば、シリアル や I2C での コンフィグというのも可能性が出てくる。

    LP1K, UP5K では、ダメかも。


こういうことを考えると、SPI ポートには コネクタと SPI FLASH を付けるようにしたい。

    SPI slave
     CRESET_B を L にする。SPI_SS を L にする。CRESET_B を H にする。
     これで、SPI slave に入り、内蔵 FLASH の書き込みや RAM への書き込みができる。
     ただし、SPI FLASH と競合するので SPI FLASH を disable にしないといけない
    通常ブート
     上記が成り立たなければ、通常ブートするが、内蔵 FLASH 優先 である。
    SPI FLASH 書き込み
     CRESET_B を L にしたまま、SPI FLASH 書き込みを行う。

    もうひとつ注意点。SPI_SO は 常に出力で、SPI_SI は常に入力。master/slave で TDI/TDO の接続が逆になる。

ピンアサインについて

QFN48 は、39 I/O となっているが、SPI ポートは含まれない。それとは別にコンフィグ選択端子が2つ。
贅沢に使えば、33 I/O である。
iCE40-UP5K-pinout.png
電源

    PAD GND
    #5,#30 VCC (1.2V)
    #29 VCC_PLL (1.2V 要フィルタ)

    #33 VCCIO_0
    #22 VCCIO_1
    #1 VCCIO_2
    #24 VPP_2V5 (内蔵 FLASH 用)

コンフィグ

    #7 CDONE (INITN)
    #8 CRESET_B (TRST)

    #14 SPI_SO (出力) (TDI :slave)
    #17 SPI_SI (入力) (TDO :slave)
    #15 SPI_SCK (TCK)
    #16 SPI_SS (ispEN)
    不明 CBSEL0
    不明 CBSEL1

ユーザ I/O

    クロック入力
    #35 GBIN0 PLL
    #37 GBIN1
    #20 GBIN3
    #44 GBIN6

    I3C
    #23,#25

    LED
    #39,#40,#41

    I/O はプルアップだけ可能(24KΩ)。また 8mA シンク・ソース。
    I3C のファンクションブロックがあるが、詳細は未調査 、LED は、大電流シンク可能。

    IceStorm project

    要調査。ドキュメントやツールがある。

サブボードの検討

以前 QFN32 用にボードを作ったが、QFN48用のボードも検討したい。サイズ的には 5cm x 2.5cm ぐらいを考えたい。33 I/O だが、いくつか LED や 水晶用に使って、全部は出力しない。16 pin x2 で済ませられればと思っている。チップのサイズは、7mm 四方 余裕がある。



基板の設計
ice40qfn-brd1.png

32ピン 600mil DIP サイズで設計してみた。全ピンを使うのは無理だった。引き出すこと自体が難しいところが数か所あり 5ピンNC。SPI FLASH を付けるのがデフォルトで 4ピン使用。LED 1つ と 水晶発振用に 2 ピン。あと FPGA または SPI FLASH をディスエーブルするための端子。CR は裏面にまわさざるを得なかった。外部に引き出す配線の都合でどうしてもそうなる。32 ピン用のスルーホールは、0.8φ -- 細ピンヘッダか、基板用リードフレームを使う。これもまぁやむを得ないところがある。
Lattice 仕様の JTAG コネクタも付けたが、SPI FLASH 用。

    SPI FLASH に書き込むときは、CRESET_B を L にジャンパして書き込む。内蔵 FLASH に書き込む場合は、TDI/TDO をクロス接続し、SPI FLASH の /HOLD を L にジャンパして書き込む。

iCE40 は、内蔵オシレータがある。たぶん RC で精度が悪いが、10kHZ と 48MHz 。水晶発振用の回路はインバータ1つだが、うまくいくかは分からない。→ 以前書いた記事

SPI FLASH は W25Q32 (W25Q32BV) が安い。aliexpress だと 5 個 $1.30 とか。4MB だから相当にオーバースペック。そうなるとストレージとして利用したくなるわけで、専用で良いだろう。ちなみに W25Q64 (W25Q64FV) は倍ぐらい。bit 単価が安いのは、この2種類のようだ。

レギュレータは、MCP1700 か XC6206 の 1.2V を予定。最大 200mA だとかで 十分なのか?不安がある。
いっそのこと、DC/DC コンにすれば、1A 以上でも安心なのだが。

基板の設計2

基板を眺めているうちに、SPI FLASH なしの場合、あまり良い出来ではないなと思うようになった。TDI/TDO を入れ替えて、電圧を下げて、ジャンパをセットしないとけなくて煩雑である。なしの基板も作ればよいと思い、ちょっと SPI FLASH と 下 8ピン分を削ってみた。JTAG コネクタは入らないので 2x3ピンコネクタ に変更。最初のやつは、これに合わせてピン配置を少々変更。#12 に GND を持ってきて、もとの#12 からは下にずらす。

    IceStorm project
    どうやら、コンフィグファイルの解析プロジクトのようだ。ツールには、プログラマもある。
     ・https://github.com/davidcarne/iceBurn
     ・https://github.com/reactive-systems/icedude/

    SPI FLASH を使うと決めてしまえば、あまり関係ないような気も。。。

    icehat
     ・3.3V 300ma regulator for FPGA I/O (MCP1802)
     ・1.2V 300ma regulator for FPGA core (MCP1802)
     ・A simple userspace library and command-line application is provided to download the bitstream.
     ・Ultra Plus FPGAs are now supported by the Icestorm toolchain.

    Raspi 用のボードで、SPI FLASH は付いていない。VPP_2V5 は、ダイオードで Vf 電圧降下させている。また、bitstream を 内蔵 FLASH に書き込むことが出来ている。また、config 後は、Raspi と SPI で通信が出来る。

icehat を見つけ、調査した。内蔵 FLASH に書き込むツールがオープンソースである。VPP_2V5 がダイオードでいけるのであれば、内蔵 FLASH で良いように思う。こうすることで、SBC の SPI で config 後 そのまま通信も出来るのであるから、便利そうにも思えてくる。

やはり、こちらをメインにした方が良さそうな感じである。

基板の設計3
iCEDIP-01t.png

最終的にこんな風に面付けして発注することに。
右から iCEDIP24, iCEDIP32, iCE testbrd 。右下は結線チェック用 LEDボード。

icedip_00t.png

iCE testbrd は、冶具のつもりで作った。ピンヘッダを付ける前に書き込みできるかどうかチェックする目的。ドリルを 1.1 φにしたので、テストプローブが付けられる。競合するので、iCEDIP24・iCEDIP32 それぞれ別に組まないといけない。それだけではつまらないので、電源とか評価用回路も少し追加している。

電源回路は、SY8008C とかを使用。5V 入力、 出力を スイッチで 2.5V か 3.3V のどちらかに切り替え可能。コネクタは micro USB で、USB IP を組めるように USB 用配線だけ付けた。2.5V が使えるのであれば LVDS 差動I/O も試してみたい。一応 OUT 2組 IN 2組 をコネクタに出力してみた。ボードを相互に接続したいところだが、最初はループバックを考えている。また 2.5V のときに、3.3V 系の ボードと接続できるように、SPI に抵抗を入れるようにしている。回路のテストをする場合は、テストプローブじゃなくてちゃんと組む。

結線チェック用 LEDボードは、ブレッドボード用。6 個を光らせて簡易テストができるようにした。
P75-LM2.jpg
micro USB は、ZX62Bで、上下が逆の ZX62R 用ではない。中華で買えるのが、ZX62B 互換っぽいので 採用。またテストプローブは、 P75-LM2 とか、1.02 φのものを使用する。全ピンに使うつもりはなく、ISP 以外は、電源ピンと 支える分だけ付ける。固定するためのものは考えていない。輪ゴムで良いのではないかと。

P75-LM2 は、16.5mm 長。普通のピンフレーム+ピンヘッダで 基板間 11mm ぐらいだから、少々長い。不安定にならないよう、取り付け方は考えないといけない。

elecrow は、注文方法が変わった。10cm x 10cm 10 枚までなら $4.9 だが、面積によって送料が変わる。しっかりサイズを計算すると 少々安くなる。上記のボードは 44mm x 83mm ちょうど。10 枚なら $7.14 、5 枚 $5.70 。あんまり変わらないように思えるが、10cm x 10cm 10 枚 とか適当に入力すると $11.46 にもなってしまう。

これで発注して良いものか? ミスのチェックとは別に、懸案事項がある。

    内蔵デバイスは SPI x2 (LeftSide, RightSide) I2C x2 (LeftSide, RightSide)である。SPI FLASH を接続しているのは、RightSide ということも分かった。I2C の1つは配線できなかった。あとのものも潰してしまっていたりすると残念である。

    差動用 IOB ペアは、クロックに制限がある。testbrd では 5 ペア 配線 したが、もう十分である。あとは、ペアを割り当てないように出来ないか?

3/13 まぁいいか、とりあえず発注してみよう。ポイントが溜まっていて $1.97 割引になった。結果 1100 円ぐらい。労力と比べればわずかな価格である。
 ・icedip-01.zip
 ・ icedip-01-out.zip

icedip.png

3/19 発送の連絡があった。


付録

スペック
UP5K LUT 5280 EBR 4kbit x 30 PLL 1 DSP 8 I2C 2 SPI 2 SPRAM 256Kbit x 4
LP1K LUT 1100 EBR 4kbit x 16 PLL 1 DSP 8 I2C 1 SPI 1(right side only)

16bit addr 100 MHz
SPMEM 70MHz
EBR 疑似デュアルポート 150 MHz
DSP 16x16, 8x8 50 MHz
SPI ファンクションブロック 45 MHz
PLL in 10 〜 133 MHz OUT 16 〜 275 MHz
内蔵オシレータ精度 ±10%
SPI FLASH 接続回路:
iCE40-config.png
(iCE40 ユーザガイドより抜粋)
iCE40-PLL.png

自作ボード(iCEDIP32) ピンアサイン

    1 37_G1_45A (D6)
    2 43_49A (D1)
    3 44_G6_3B (D2)
    4 45_5B (D3)
    5 46_0A
    6 47_2A (D3)
    7 48_4A (D2)
    8 2_6A
    9 3_9B (D0)
    10 4_8A (D0)
    11 9_16B
    12 GND
    13 10_18A
    14 11_20A
    15 12_22A
    16 13_24A (D4)


    17 CRESET (J2#1)
    18 GND (J2#1)
    19 FLASH_HOLD (J2#3)

    20 28_41A
    21 18_31B
    22 19_29B
    23 20_G3_25B
    24 21_23B (D4)
    25 25_36B
    26 26_39A
    27 31_42B (D5)
    28 32_43A (D5)
    29 34_44B (D6)
    30 35_G0_46B
    31 36_48B (D1)
    32 3V3

    番号 SG48ピン番号_IOB番号 (クロック入力 3本 Gx )
    I/Oペアが 7組ある。D0 〜 D6 として記載。I/Oペアは差動入出力に使える代わりに、違うクロックで動作させられない。

JTAG

    1 ispEN SPI_SS (/CS #1)
    2 TDI SPI_SO (DI #5)
    3 SPI_SI (DO #2)
    4 SPI_SCK (CLK #6)
    5 GND GND
    6 SPI_VCC 3V3
    7 TRST CRESET_B
    8 INITN CDONE

    番号 - lattice JTAG 信号名 - iCE40 信号線 - SPI FLASH 信号線

J1 (水晶発振子、セラミック発振子)

    1 38_50B
    2 GND
    3 42_51A

LED

    49_RGB0

自作ボードその2 (iCEDIP24)  ピンアサイン
ISP 6 ピン

    1 RST (TRST)
    2 SO (TDO)
    3 SI (TDI)
    4 SCK (TCK)
    5 GND
    6 SS (ispEN)



SY8008C とかと書いたが、ピン互換のものが多数ある。ちょっとまとめ。


    EN 1 5 FB
    GND 2
    SW 3 4 VIN

    ピン配置はこう。FB 電圧 0.6V のもの。
     型番 出力 SW周波数 マーク 参考価格(aliexpress)
     SY8089A 2A 1MHz KVxxx 10個$1.5
     SY8009A 1.5A 1.5MHz ADxxx
     SY8008C 1.2A 1.5MHz ACxxx 10個$1.2
     SY8008B 1A 1.5MHz ABxxx

     NCP1529 1A 1.7MHz DXJAYW 10個$1.1
     MT3410L 1.3A 1.5MHz 10個 AS11 10個$0.9 (〜 6V)

    MT3410L が 特にお安い。また、ちょっとだけ入力電圧が高くできる。(普通は 5.5V)



FTDI FT2232H との接続について記載しておく。

lattice の 公式開発ボードには、どれもこれも FT2232H が搭載されていて、回路図も手に入る。レベル変換が入っているものもあるが、接続は以下の通り。iCE40 は JTAG とは接続が違うので要注意。

デフォルトのモードが シリアルだと、ADBUS2 が 出力で TDO とぶつかる。面倒だが、FT_PROG を使用してモードを MPSSE に変更しておかないといけない。 また、ispEN(SS), CRESET_B は FPGA 側でのプルアップが必要。

    TXD (O) ADBUS0 - TCK XO2 iCE40 (I)
    RXD (I) ADBUS1 - TDI XO2 iCE40 (I)
    RTS (O) ADBUS2 - TDO XO2 iCE40 (O)
    CTS (I) ADBUS3 - TMS XO2 (I)
    DTR (O) ADBUS4 - ispEN iCE40 (I)
    DSR (I) ADBUS5
    DCD (I) ADBUS6 - CDONE
    RI (I) ADBUS7 - CRESRT_B iCE40 (I)

XO2 と iCE40 では使用するピンが違った。

    1 RST (TRST) 7
    2 SO (TDO) 2
    3 SI (TDI) 1
    4 SCK (TCK) 0
    5 GND
    6 SS (ispEN) 4

どうやら FT232HL でも 使えるようだ。

CJMCU-FT232HL.jpg
CJMCU FT232H がお安くお手軽そうである。たぶん Adafruit のクローン。といっても、リファレンスの UM232HL と大して違わないと思う。 SBC -- Linux で開発するつもりではあるのだが、PC でお手軽にできるのであれば、手段を持っていても良いだろう。

    他に lattice 公式ケーブルに HW-USBN-2A というのがある。これは、EzUSB FX2LP -- CY7C68013A を採用したもので、今もサポートされている。詳しいことは分からないのであるが、少し情報が。
     ・https://github.com/mithro/ixo-usb-jtag
    今更という気もするが、$3.59 と格安のものもある。自分でプログラムすることで、SDIO などに対応できるかも知れないので、興味が少しあるのであった。

    やはり、FT232H の方がはるかに有用である。JTAG で使うならば、ピンアサインが決まっているし、Xilinx 他でも使えるはず。さらに BitBang も使えるし、自分でプログラムするならそれで良いではないかとも。

ついでなので、レベル変換について

FT232H は、3.3V I/O しかサポートしていない。FPGA によっては 2.5V だとか低い電圧でしか JTAG が使えない場合がある。TXS0108E のモジュールが安く買えるようなので、使うと良いのではないかと思う。2.5V なら抵抗だけで済ませられるようにも思うが、それ以下だとこういうのが必要になってくる。

4bit で十分という気もする。TRST , ispEN などは、オープンコレクタで十分。Lattice のプログラマ・アプも 論理を逆にできるし対応している。かえって高価になるかもだが、TXB0104 のチップも モジュールもある。

    これらの IC の使い方を 簡単に考えていたのだが、難しいかも。PORTA と PORTB があって、電圧は PORTA < PORTB でないといけない。PORTA は基本 HOST 側で PORTB には OE 端子があり HiZ に出来る。

    PORTB は、1.65v 〜 5.5v の幅広い電圧に対応できる。... ということは、PORTA は 1.2V でないといけない。そうするためには、まず 3.3v → 1.2v のレベル変換をしないといけない。そうするために もう1つ使えば良いのかどうか? だいたい PORTA が 1.2V のときは 20Mbps まで、2つ対抗で使えば 10Mbps に落ちる。

    いっそのこと オープンドレインの SN74LVC1G07 を使うとか。 入力範囲が 1.65 〜 5.5V で、出力側も 〜 5.5V まで OK 。ただ消費電力が・・・高速に動作させる前提ならば、プルアップ抵抗は低い抵抗値にしないといけない。

    ・・・・

    基本的には、5V 対応の低速版と 1.8V みたいな低電圧高速版の2つあれば良いのでは? 低速版では別に MPSSE である必要もないが、ソフトが MPSSE にしか対応していない場合もあるし、安く作れるなら別に良いのではと思う。

    そう決めてしまうと、オープンドレインの SN74LVC1G07 が使い勝手が良さそうな感じ。プルアップ抵抗値をあまり低くしたくないので低速と割り切るが、低電圧もいけて便利だろう。低速ならデジトラでも良いのだが、反転をソフトがサポートしてないと、めんどくさい場合がある。一応電流も 24mA まで流せてデジトラ的な使い方もできる。ちょっとストックしておくのも悪くなさそうな気がしてきた。

      勘違いしてたかも。そんなに遅いこともないようだ。入力容量が 5pF なら 1KΩプルアップの立ち上がりは 5ns ぐらいで、それなりに高速。ただし、ケーブルで引き出すと話が変わるので、バッファがもう一段必要。

      level_shifter.png
      こういうので良い? 全部外部の電源で動作させるから、1G など使わず 14pin のタイプが良さそう。

    schmitt_vco.png
    シュミットトリガ入力インバータの SN74LVC1G14 も別にストックしたい。遅延用として考えてみたが、RC発振器として あるいは、VCO として 便利そうな感じである。

    他だと、SN74LVC1G125 あたり? トライステートバッファ。出力を低電圧にするには良いだろうが入力のほうが... FPGA に限った話だと差動入力で 低電圧を受けることはできるだろう。あるいは、高速オペアンプで増幅するとか。

    なお、SN74LVC1GXX には、SOT23 サイズの DBV パッケージ と SC70 サイズの DCK パッケージがある。間違えてはいけない。

    TXB0104 などはどうか? 双方向が出来るから、便利なのは便利なのだろう。低電圧高速用途には向かなさそうで、ストックしたいというところまで行かない。使えるケースというのが明確になったら考えてみよう。

    ・・・・

    深みに嵌まりそうなので、これぐらいにしておこう。
posted by すz at 21:24| Comment(0) | TrackBack(0) | MachXO2
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/182626785
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック