2011年06月29日

MachXO 2280 Breakout ボード

デジキーで 2700円 と安価に購入できる FPGA ボード について。



簡単な説明

    FPGAは、Lattice 社の MachXO 2280 。-- MachXO2 が出ているから、最新のチップというわけではない。といっても 発表は最近で 2011/4 。価格は $29.9 ということになっている。

    このボードには、FT2232H が載っていて、非常に安易に使える。USB に接続するだけだ。Lattice 社の合成ツール Diamond (最新は v1.2)でもサポートしていて、ビルドしてから、2オペレーションで書き込みが可能。

      (1) Tools→Programmer を選ぶと ダイアログが出る。
      (2) (一回設定した後は) Download ボタンを押す。

    FPGA に接続されているデバイスは、(JTAG 以外には) LED x 8 のみ。

規模は小さめで、特にブロック RAM が少ないのが苦しいが、気軽に使えるのが気に入ったので、rtavr の最初のリファレンスボードとして使うことにした。

こうなるとは、当初は思ってもみなかった。

合成ツールは Diamond を使用している。Xilinx から入ったのだが、使いやすい印象。メジャーどころの Altera や より 合成ツールの サイズが小さい -- それでも大きいが -- というのは、試用するの場合の利点。

    rtavr を動かす本命は依然として 自作の Artemis ボードのつもり。だが、Artemis ボードを使う前にツールの開発が必要なのだ。ツールの開発を 『MachXO 2280 Breakout ボード』をつかってやることにした。そして、ツールが動けば勢いで rtavr も 先にテストしてしまうだろう。

  • 自作ボードでしか rtavr を動かせないというのでは、都合が悪い。完成しても誰も試そうとはしないかも知れない。またバグが報告されても、共通のボードでないと確認できないかも知れない。そういう意味でリファレンスボードはあった方が良いのだ。

  • ツールでは、FT2232H を Bitbang モードで使う。こうすることで Artimis ボード の AE-UM232R とコードを共通化することができる。(ちなみに ツールは開発中だが、JTAG が使える所までは出来ている。)

  • 『MachXO2 Pico dev kit』(LCMXO2-1200ZE-P-EVN) も デジキーで買えるようになった。... が、4787 円と思ったより高い。このボードに興味がないわけではないが、今は組み込まれているデバイスを動かすような ことの優先度は低いし、リファレンスボードとしては使わないことにした。


入手先や資料について


コネクタの アサイン図:

MachXO 2280 Breakout Board Evaluation Kit(LCMXO2280C-B-EVN)

          TOP View

J10 J6 J5
(1) (2) (1) (2) (1) (2)
PB9B(P8 ) PB2A(P2) Lattice VCCIO GND PT2C(B2) PT9A(D8)
PB9A(P7 ) PB2B(P3) VCCIO GND PT2D(B3) PT9B(E8)
PB10E(N8 ) PB2C(N5) VCCIO GND PT3A(A2) PT9C(E9)
PB10C(P9 ) PB2D(N6) VCCIO GND PT3B(A3) PT10A(A10)
PB10D(P10) PB3A(T2) VCCIO GND PT3C(D3) PT10C(C9)
PB10A(M10) PB3B(T3) VCCIO GND PT3D(D4) PT10D(C10)
PB11C(R9 ) PB3C(R4) VCCIO GND PT4A(C4) PT10E(D9)
PB11D(R10) PB3D(R5) VCCIO GND PT4B(C5) PT10F(D10)
PB12A(T10) PB4A(P5) -- -- PT5A(D6) PT11A(B9)
PB12B(T11) PB4B(P6) -- -- PT5B(D5) PT11B(B10)
PB12C(N10) PB4C(T5) -- PT15A(E10) PT5C(B4) PT12A(A11)
PB12D(N11) PB4D(T4) -- PT15B(E11) PT5D(B5) PT12B(A12)
PB13A(R11) PB5A(R6) -- PT15C(B13) PT6E(E7) PT12C(B11)
PB13B(R12) PB5B(T6) -- PT15D(C13) PT6F(E6) PT12D(B12)
PB13C(P11) PB6A(T8) PT7C(A6) PT16A(B14) PT6C(A5) PT13C(C11)
PB13D(P12) PB6B(T7) PT7D(A7) PT16B(C14) PT6D(A4) PT13D(C12)
PB14A(T13) PB7C(M7) PT8C(B8) PT16C(A15) PT6A(C6) PT14A(A13)
PB14B(T12) PB7D(M8) PT8D(C8) PT16D(B15) PT6B(C7) PT14B(A14)
PB14C(R13) PB8C(R7) FTDI -- GND PT7A(B6) PT14C(D11)
-- PB8D(R8) Chip -- GND PT7B(B7) PT14D(D12)
(39) (40) (39) (40) (39) (40)
  (LED)
[D5] [D1]
PB15D(P14) PB16D(P16)
[D6] [D2]
PB15B(T15) PB16C(P15)
[D7] [D3]
PB15A(T14) PB16B(R16)
[D8] [D4]
PB14D(R14) PB16A(R15)

TP0 - TP10 : VCC10 (3V3)

J1 -- JTAG J9

(1) 3V3 (25) PD14D(R14) [D8]
(2) NC (27) PB15A(T14) [D7]
(3) NC (29) PB15B(T15) [D6]
(4) TCK --- R3 --- FT2232H ADBUS0 (31) PB15D(P14) [D5]
(5) TDI --- R4 --- FT2232H ADBUS1 (33) PB16A(R15) [D4]
(6) TDO --- R7 --- FT2232H ADBUS2 (35) PB16B(R16) [D3]
(7) TMS --- R9 --- FT2232H ADBUS3 (37) PB16C(P15) [D2]
(8) GND (39) PB16D(P16) [D1]

(R3,R4,R7,R9 = 70 ohm)


    20x2 の コネクタが 8 つ付けられるが、普通の使用方法で それを全部使うのはあまり考えられない。そこで、写真右サイドの 4 列(J6,J5)と 左サイド中央側の 2 列(J10)を 普段は使うようにしようと思う。そう考えて ピンアサイン図を作成した。

  • Lattice Diamond でのピンのアサインには、() 内の ピン番号を使用する。

  • 2x20 ピンソケット(低メス) を J10, J6,J5 に付けようと思う。

  • 実験用には、 C基板(旧: FR-4) を使うつもり。必要な信号の分だけ ピンヘッダを下向きに付ける。
    (注意) ピンヘッダを付け過ぎると 抜き差しが非常に難しくなるので注意

  • C基板(新: CEM-3) は穴が少ないので、横向き にしか付けられない。C基板(旧) だと 縦向きも可能。

  • J9 で基板をカットすると JTAG ケーブル として使えるかも知れないので、できるだけ J9 は使わないようにしようと思う。-- ちなみにカットしてしまうと、FPGA は再config できなくなる。FPGA を壊してしまったり、二度と使うつもりがない場合にしか カットするつもりはない。

  • ちなみに 上下のコネクタは、GND が多く 3V3電源 がない。信号線を引き出すような目的に合うと思う。実際に使う予定は今のところないが、拡張ボードを 作って 直付しようかと目論んではいる。

  • LED の信号は J9 (25) - (39) にも出ている。(位置は、左サイド 最外側の 下 8 pin)
    基板をカット する場合は、J9 の右側が良さそう。
    ここに ロジアナを接続すれば、波形を見ることが出来る。目測できないような信号でも LED に出力する意味はありそう。

      ロジアナで使うようにするには、JTAG の 8pin と LED の 8pin に 1列の ピンヘッダを付けるのが良さそう。


    いろいろ書いたのだが、とりあえずやりたいのは、水晶発振の実験ぐらい。
    デバッグのためになんらかの デバイスを付けるつもりはない。ツールでの通信が可能になれば不要になるはずなのだ。

    ちなみに、ツールでの通信は、まだうまく行っていない。そのデバッグのために ロジアナは必要になるかも知れない。

制約ファイル(.lpf)


      BLOCK RESETPATHS ;
      BLOCK ASYNCPATHS ;
      LOCATE COMP "LED_7" SITE "R14" ;
      LOCATE COMP "LED_6" SITE "T14" ;
      LOCATE COMP "LED_5" SITE "T15" ;
      LOCATE COMP "LED_4" SITE "P14" ;
      LOCATE COMP "LED_3" SITE "R15" ;
      LOCATE COMP "LED_2" SITE "R16" ;
      LOCATE COMP "LED_1" SITE "P15" ;
      LOCATE COMP "LED_0" SITE "P16" ;
      USERCODE ASCII "RT01" ;
      IOBUF PORT "LED_7" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_6" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_5" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_4" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_3" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_2" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_1" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;
      IOBUF PORT "LED_0" IO_TYPE=LVCMOS25 SLEWRATE=SLOW PULLMODE=NONE DRIVE=12 ;

    制約ファイル(.lpf)は、ピンの番号を書くらしい。PB16D とかではない。

    LED をドライブするだけなので、他の設定は適当。

      SLEWRATE は FAST と SLOW があり FAST がデフォルト。意味なく FAST にすることはないと思ったので、SLOW に変更。
      PULLMODE には、UP/DOWN/KEEPER がある。LED は L で点灯するだけなので、NONE にしておいた。
      LVCMOS25 と LVCMOS33 との違いが実際にあるのかどうかは、良く知らない。DRIVE 電流の値は、いくつかあるが、自由に選べるわけではないらしい。LVCMOS25 では 12mA が選択できたので、そのままにしてある。


rtavr_tools-0.1.tar.gz

    開発中のツール。test_hdl ディレクトリに テスト用の HDL コードを置いてある。これを書き込んで、src の basic_test をビルドして動かすと、テスト用の HDL コードと SPI で通信する。

      通信もちゃんと動いているわけではない。9 bit 送ると 8bit 受け取れるという変な状況。

      ... どうも FPGA 側で JTDI が ラッチされているような感じ。そういうものならば、8bit とか 16bit とか最低単位を書いたらいったん Shift-DR を抜けて入りなおすような、処理に統一した方が良さそうだ。いったん抜ければ CS がトグルされ bit 位置が リセットされる。

      rtavr の slave-SPI を使うような場合、2 バイト分を送りこむと AVR 側が間に合わないのでどうしようかと思っていたが、1 バイト書いたら CS トグルなら 余裕ができて好都合。

    作成中のコードは沢山あって、これから組み上げていく予定。

      ほとんどのコードはテストできていないが、

    • .bit(Xilinx) .mcs(Xilinx) , .jed(Lattice) , .mem(Verilog) のファイルの読み込み(パーザは いいかげん)
    • Lattice XO の Config, Xilinx の Config (作っただけ)
    • FT245R/232R BitBang Cable ドライバ(結構動いている)、serjtag Cable ドライバ(作っただけ)

      などが含まれている。

    一応かつて 雑誌の付録になったものはサポート可能にしたい。-- 結構持っているし。ただ Altera は 自分の NotePC に 合成ツールが入れられないし、チップ単体で買えない or 買いづらいのでパス。

    XP2 も チップが買えるし、サポートしたい。(DDT付録 はもっていないけど)

    ただ、無制限にチップをサポートするつもりはない。基本は、自分が使う予定があるもののみ。

MachXO 2280 について

    実は細かいことは知らないのだ。
  • Config 用 FLASH 内蔵
  • 4LUT x 2280 の規模
  • ブロックRAM は 8kbit x 3
  • 内蔵発信器と 2 つの PLL 。

    これぐらい。ブロックRAMの容量が少ないので、チップ自体には興味がない。ボードが入門用に最適だったので選んだだけ。

    Config のしかたは、SVF ファイルを読んでだいぶ理解した。XP2 とおなじようなやり方(違いはある) 。一方 MachXO2 の Config のしかたは、だいぶ違う。あと、FLASH と RAM でデータ形式が違う。.. ちょっと ツールで対応するのは面倒。

    MachXO2 には興味があるが、-1200 は 、規模が小さくブロックRAMの容量も少ない。いま Lattice の チップを買うとすれば(実際は買わないが) LFXP2-5E/8E が良さそうな感じ。

MachXO 2280 Breakout ボードの利用案

    JTAG を通して PC と通信できれば、結構応用範囲が広がる。BitBang では、最大でも 3.7Mbps 程度の帯域にしかならないが、MPSSE を使って通信すれば、24Mbps (3MB/sec の 同時入出力) が可能だ。4pin しか接続されていないから、FT2232H の他の機能は使えないのが残念ではあるが、この程度までなら、お手軽に使える。

    USB なので、うまくバッファリングしてやらないと 途切れなく データを送受信するのは難しいかも知れないが、ブロックRAM もバッファに使うなどしてやれば、サウンドデータを送受信することも可能かも知れない。

    あと、いろんなデバイスとの通信テストとか。ピンが沢山あるから、付ける一方にして、外さないという使い方が可能。PC で制御プログラムを作って確認後、ターゲットのマイコンに移植するやりかたもできる。

    月並みだが、ロジアナ系。低速で良いなら メモリとかなしで作れるだろう。その場合 PC のディスクに全部ログするような使い方もできる。FT2232H を生で使っても似たようなことはできそうだが、FPGA で作るメリットは柔軟性。高速だが 2bit のみとか、低速だが100bit みたいなことができる。

    メモリを付けてまで作るようなことは考えない。手間を考えれば メモリ付きのFPGA ボードにしたほうがお手軽そうだ。

    あと、いろんなライタに仕立てるのは可能。 通信ができる以上、工夫次第で JTAG すら可能だろう。

rtavr_tools-0.2.tar.gz


    spi_test -- spi_echo test1
    30 ff (7f)
    31 30 (18)
    32 31 (18)
    33 32 (19)
    34 33 (19)
    5535 3455 (1a2a)
    aa5536 35aa55 (1ad52a)
    37 36 (1b)
    38 37 (1b)
    39 38 (1c)
    ff 39 (1c)
    ff ff (7f)
    spi_test done

    ようやく通信できた。左から PC の出力データ (MSB first) 、PC への入力データ。() は参考用で 1bit 右シフトした値。8 bit のシフトレジスタがあるだけなので、1 バイト分後で出力されている。

    ググって見付けた 『よくわかるバウンダリスキャン試験解説講座』を読んで TCK の立ち上がりで シフトすることを理解した。SPI とは極性が逆だ。

    test_hdl も直してようやく動いた。

    これで JTAG の API も FIX 。

    void jtag_go(CABLE cbl,int state);
    void jtag_init(CABLE cbl);
    void jtag_reset(CABLE cbl);
    void jtag_IDLE(CABLE cbl, int ms, int count);
    void jtag_SIR(CABLE cbl, uint8_t *buf, int bit_len, int flags, uint8_t *rcv_buf)
    ;
    void jtag_SDR(CABLE cbl, uint8_t *buf, int bit_len, int flags, uint8_t *rcv_buf)
    ;

    void jtag_SIR32(CABLE cbl, uint32_t code, int bit_len, int flags, uint32_t *rcv_
    data);
    void jtag_SDR32(CABLE cbl, uint32_t code, int bit_len, int flags, uint32_t *rcv_
    data);
    void jtag_SDR32R(CABLE cbl, uint32_t code, int bit_len, int flags, uint32_t *rcv
    _data);

    32bit までなら コードが書きやすく分かりやすいように tag_SDR32 などを作っている。jtag_SDR32R は、SPI 通信用で MSB first 。

    flags は、1 : 受信も行う。2: 状態を移行しない。(最後の TMS==0)。

    いまのところ、API 間で非同期にI/O はしていない。受信をしない jtag_SDR を連続で call するような場合しか有効でないが、jtag_SDR を 1 つにまとめたほうが最適化になる。要するに非同期してわずかに高速化してもあまり意味はない。

    そういえば、

    int (* get_tdo_bits)(CABLE cbl, int bit_len, int tdi, uint8_t *rcv_buf);

    なんて (CABLE の) API を作ったのだが、使っていない。これは不要だった。(削除予定)
posted by すz at 21:52| Comment(0) | TrackBack(0) | MachXO2
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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