2007年06月14日

USB910のJTAG拡張案

デザインウェーブマガジン 2007年7月号 (2480円)には、付録に 250K ゲート相当 のFPGA Spartan-3E XC3S250E 基板が付いて来る。いままで、FPGA の付録は買ってきたが、実際になにかを作ったり動かしたりしたことはなかった。今度こそなにか動かしたいものだと思う。
FPGA のプログラミングはともかくとして、その前に USB910 を拡張して JTAG ケーブル 機能をつけてみたい。

USB の JTAG 関係で 参考になるものはないかと思い、sourceforge を JTAG で 検索すると ... xilprg というものが見付かった。
xilprg is a Xilinx FPGA/PROM/CPLD JTAG programmer tool for Win32/Linux.
Supports Parallel III cable, Digilent USB. cblsrv is a Open-Source CableServer for Xilinx Impact.

だそうだ。Digilent の
JTAG-USB
を サポートしていて、コンフィグレーションできるだけではなく、CableServer を使うと Xilinx のツールである iMPACT から直接書き込みできるようになるらしい。

というわけで、TAG-USB がどのようなプロトコルで通信しているか興味をもった。それは、xilprg の コードを見ればわかるわけだ。
前置きが長くなってしまったが、この JTAG-USB のプロトコルを紹介。

この JTAG-USB は、バルク転送で パケットをやりとりする。パケットの形式は、フラグ 4bit/コマンド 4bit , サイズ 16bit , データ (61 バイト)で、パケット全体が 64 バイトになるようになっている。 サイズの 16bit は、ビッグエンディアン で HI - LO の順。データ転送の場合、サイズには bit 数を入れる。データ転送でない場合は、バイトのようだ。

送信パケットのコマンドは、6 種類で 、受信パケットのコマンドは 1種類(0x06 固定)。送信パケットは、16 個まで連続して送ることができる。

送信パケット詳細

コマンド NULL (0x00)
サイズ 0
データ 0 バイト

受信パケット要求のコマンド。このコマンドを発行
したときだけ、受信パケットが送られてくる。

コマンド ENABLE (0x01)
サイズ 1
データ 1 バイト
0 : DISABLE
1 : ENABLE

初期化と終了コマンド

コマンド SET (0x02)
サイズ 1
データ 1 バイト
ビットマップになっていて bit の意味は以下のとおり
1 : TDI を HI
2 : TMS を HI
4 : TCK を HI

コマンド PUT_TDI_BITS (0x03)
フラグ RECIEVE(0x40) , TMS_HIGH(0x20)
サイズ bit数
データ (bit数 + 7)/8

TDI にビット列を送り込む。バイト内の並び順は
    LSB first
フラグには、受信データを用意する要求(?) の
RECIEVE と TMS の状態をセットする TMS_HIGH がある。
RECIEVE フラグを立て、コマンド NULL で要求して
はじめて、受信できる。

コマンド PUT_TMS_TDI_BITS (0x04)
フラグ RECIEVE(0x40)
サイズ bit数
データ (bit数 + 3)/4
PUT_TDI_BITS より高機能で、TMS の状態も 1bit
書き込み毎に設定する。(データの並び順は、TDI TMS
.... で 総bit数は、サイズで指定した bit数x2)

データには、TDI の状態 と TMS の状態が含まれる。

コマンド GET_TDO_BITS (0x05)
フラグ TDI_HIGH(0x10) , TMS_HIGH(0x20)
サイズ bit数
データ 0
TDI/TMS の状態を設定して TDO を読み取る。
受信するためのコマンドで、RECIEVE フラグは必要ない
が、コマンド NULL で要求してはじめて、受信できる。

こういうプロトコルなら、USBの遅延を隠蔽できるので、かなりのスループットが実際に出ると思う。また、JTAG だけでなく (標準的な)SPI にも使える。
よく考えられていると思うので、参考にして、USB910 の拡張をしようと思う。
コマンドは 数字('0' 〜 '5') を使いパケットは可変長にする。bit 数の 最大は 64 バイト分(512bit)かもうすこし大きめ。bitmap は USIを使う場合も考えて、MSB first。
こうやって USB910 を拡張して、xilprg を digilent 版ベースで改造すれば、iMPACT で使えるものになるはずだ。

それは良いのだが ... Digilent のものは、専用の USB インターフェイスがあるので、高速だ。それに対して、USB910 は 最大でも 80kbps ぐらいしか出ない。FPGA のコンフィグレーションとかは、それでがまんするしかないのだが、JTAG のバウンダリスキャン を使ってバスの状態を設定して、バスの上の FLASH ROM を書き換える用途などでは遅くて使えない。

たとえば、bit 数が 512 ほどあって、1 バイトのデータを書くのに
3 回 512 bit 送らなければならないとすれば、80kbps 出たとしても FLASH の書き込みは、52 バイト/sec になってしまう。FLASH が 4MBでも 22 時間もかかってしまう。

もうひとひねり必要だ。... 更新するデータだけを送り、複数の JTAG 転送をしてくれるような機能がないと使えない。そしてメモリもあまりない。
この部分は、まだどうしたら良いか思い付いていない。

なんだか USB910で無理やり機能をつけているからこうなってしまう気もする。AVRでの電子工作にこだわったとしても、ATmega88 と、FT245RL USBパラレル変換モジュールを組み合わせれば高速なものが作れると思うし、AT90USB162(pdf) なら、デジキーで購入可能で自由に高速なものを作れそうだ。そもそも、実用的かつ安価なものを求めるなら、Digilent の
JTAG-USB
を買うのも良いわけだ。

それでも、USB910(と AVR-CDC) にこだわりたい、USB910はいつも傍らにあるし、プログラムを作るだけでよいのだ。(ただし、Spartan-3E のJTAG は、2.5V なので、レベル変換は必要)。このブログのネタにもなるし、工夫の余地があって楽しくもある。


とはいえ、ATtiny861/ATtiny44 はまだどこでも入手できるチップではないので、いまは他の人に使ってもらうという立場ではない。
付録基板を USB から使いたい and/or I2CSND を使いたいという人のために、なにか考えようかと思う。
今のところFT245RL USBパラレル変換モジュール+ATtiny2313 を使って、USB910から I2C と JTAG拡張だけ抜き出したものが良さそうだと思っている。秋月で全部そろうし、USB910よりずっとJTAG の性能が良さそうだ。プロトコルをあわせておいて、xilprgの改造もする。あと、AVRDUDE とか UISP も改造すれば、AVR910の機能がなくともライタとして使えるはず。もしくは、ATmega88向けに USB910+JTAG拡張機能を BUILD できるようにするか... I2CSND 向けに シングルエンド ADC 機能と周波数カウンタ機能は移植したいところだ。


おわりに

デザインウェーブマガジン 付録の話題は、ネタふりにだけ使ってしまった。まぁ、実際なにか作りたいとは思う。だけれども、FPGA ならではのもので、あまり複雑な外付け回路を必要とせず、なにかの役に立つという条件を付けるとあまり作れるものがない。最近 I2CSND を作っているので、思いついたのだが、256〜384オペレータの FM音源で USBかMIDIインターフェイスを持っていてΣΔで DA変換(ウィキベディアの説明)してサウンドを出力する..とかはどうだろう。...といってもそこまでのものは、設計できる実力はない。設計する能力さえあれば、Spartan-3E XC3S250E はハード的にこれぐらいは可能だと思う。18bit 乗算器とブロックメモリが 12 個もあるし、PicoBlaze 12 個乗せてそれぞれ 32 オペレータ担当させれば、意外と簡単に作れるのかも知れない。が、なにしろ未経験なのでよくわからない。
posted by すz at 00:31| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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