|
USB-Blasterもどきの製作
・概要
AlteraのUSB接続JTAGインターフェース、「USB-Blaster」をPICマイコンで安価にエミュレートします。
Alteraの純正ツールでCPLD、FPGAの書き込み、デバッグがUSB一本でできます。
本機を使ってLattice XP2-5Eを6秒以内で高速書き込みできるソフトも公開しています。
Ver.0.2標準回路製作例(クリックで拡大)
|
Ver.0.4標準回路製作例(クリックで拡大)
|
・背景、というよりどうでもいい前書き
AlteraのCPLD、FPGAの書き込み・デバッグにはUSB-Blasterを使います。
純正品は5万円くらいするらしいです。高い。
Terasic-Blasterという互換品ならば5千円くらい(直輸入の場合・送料別)で買えます。
それでも私はケチで趣味で扱うデバイスの開発環境にこれほどの出費はしたくないものです。
海外でUSB-Blasterを解析した方が居ましたので、それを参考に出来る限り安価に自作してみました。
-- ※注意 --
気を付けて欲しいのは、これは互換でもコピーでもクローンでもなく「もどき」です。
QuartusIIからUSB-Blasterとして認識・使用できるというだけで、似て非なるものです。
本物はハードウェア処理ですがPICのソフトウェアで処理しているため遅かったです(Ver.0.4で本物に迫る速度になりました)。
さらに、手抜き回路なのでJTAG電圧は2.5〜3.3V程度が対応範囲だと思われます。
低電圧なデバイスを使いたい場合、レベルコンバータを挟んでください。
純正でないハードウェアにUSB-Blasterのドライバを使うのはもしかしたらライセンス違反になる可能性があります。
半田付けしてて火傷したとか、ショートしてPCが壊れたとか、過電圧でFPGAが死んだとか、書き込み失敗して事故が起きたとか、書き込みが遅くてイライラして取り返しの付かないことをしてしまったとか、訴訟を起こされたりしても一切の責任は負いません。
このページの情報は自己責任でご利用ください。
1.必要なパーツ
| 品名 | 購入店 | 価格 |
USB搭載マイコン PIC18F2550 下位の2450でもいけると思いますがそっちのほうが高いので | 秋月電子 | \400 |
| セラロック 20MHz | 秋月電子 | \40 |
| ピンヘッダ 2x5(2x25を割る) | 秋月電子 | \10 (5台分50円) |
| カーボン抵抗1/6W型 100Ω x2 | 秋月電子 | \2 (100本100円) |
| カーボン抵抗1/6W型 470Ω x5 | 秋月電子 | \5 (100本100円) |
| カーボン抵抗1/6W型 1kΩ x6 | 秋月電子 | \6 (100本100円) |
| カーボン抵抗1/6W型 10kΩ x1 | 秋月電子 | \1 (100本100円) |
| チップ積層セラミックコンデンサ 10uF | 秋月電子 | \5 (40個200円) |
| チップ積層セラミックコンデンサ 0.1uF x2 | 秋月電子 | \0.9 (4000個1800円) |
| 基板 適当 (価格は秋月C基板) | --- | \60 |
| USBコネクタ | 秋月電子 | \50 |
| お好みのLED | ---- | ---- |
はい、1000円掛からないです。
PICは18F4550でも大丈夫なはずです。
要望があれば書き込み済みPICを頒布するかもしれません。
PICライタ純正品買っても3千円代と結構安いので、PICの世界に足を踏み入れてみるのもいいんじゃないでしょうか。
別にマイク□チップの回し者じゃないですが。簡易ライタならもっと安く作れますよ。
2.回路図

※2009/07/20公開:Ver.0.4ではSPIモジュール利用のためデフォルトのピン配置が変更になっています。
PIOモードに切り替えれば従来のピン配置にも変更できます。詳細は配布アーカイブのreadme.txtをご覧ください。
信号電圧変換が下りは分圧、上りは直結というところがチープでいいですね。
PICはTTL入力なので2.5V CMOSレベル以上なら判別可能です。
100Ωは所謂ダンピング抵抗というやつです。
3.PIC側のプログラム
USB-Blasterもどき ソース・HEX一式(Ver.0.5.090806)【最新版】
前バージョン比:IOタイミングの微調整、MCHPFSUSBブートローダとHIDブートローダを使った書き込みに対応
ソースコードを読む目的であればVer.0.2をお勧めします。高速化のため非常に可読性の悪いコードになりました。
回路図通りであればHEXファイルをそのまま焼いておk
マイクロチップのUSBファームウェアVer.2.1-Genericをベースに作っています。
ピン配置変更、セラロック周波数変更等で再コンパイルする場合下記の環境が必要です。
・MPLAB IDE
・C18 Compiler
・Microchip USB Firmware Ver.2.1(配布終了のためアーカイブに同梱しました)
上記ツールをインストールした上でプロジェクトファイルを開き、Configure->SelectDevice画面でPIC18F2550を選択してください。
クロック周波数やピン配置の変更手順については配布アーカイブ中のreadme.txtをご覧ください。
※ライセンスについて
基本的に自由に使っていただいてかまいませんが、応用したものを公開される場合、可能であれば当サイトにリンク等していただけると幸いです。
4.動作確認
ドライバはUSB-Blaster(本物)と同じようにインストールします。

PCとの接続がうまくいけば上図のようにQuartusII->Programmer->Hardware Setup画面に現れます。
・接続例
クリックで拡大
オプティマイズさんのMAX2 CPLDボード(1600円)との接続。
本回路とこれだけで完結します。おそらく(USB対応で)最安のCPLD開発環境なのではないでしょうか。

ちゃんと認識してます。
・処理時間
計測環境はWindows XP SP3、ICH7、Core2Duo 800MHz動作でUSB2.0HUBを経由しています。
直接USBポートに接続すると若干遅くなります。これは純正品でも同様のようです。
| Altera MAXII EPM570T100C5N | もどきVer0.2 | Ver0.4(PIO) | Ver0.4(SPI) | USB-Blaster |
| Erase->Blank-check | 4.5秒 | 3.2秒 | 3.1秒 | 2.9秒 |
| Examine | 3.1秒 | 1.7秒 | 1.7秒 | 1.3秒 |
| Erace->Write->Verify | 10秒 | 7.5秒 | 7.1秒 | 7.5秒 |
・Cyclone FPGAで使っている方からの報告
| Altera Cyclone EP1C12Q240C6N | もどきVer0.2 | Ver0.4(SPI) | USB-Blaster |
| AS直接ConfigROM書き込み | 20秒 | 15秒 | 15秒 |
LE使用率は6%とのことです。書き込み時間と関係あるのかどうかはわかりませんが…
・(有)ヒューマンデータさまからの報告
| Altera Cyclone III | もどきVer0.2 | USB-Blaster |
| SRAM書き込み | 6秒 | 1秒 |
| JTAG経由ConfigROM書き込み | 75秒 | 24秒 |
| AS直接ConfigROM書き込み | 20秒 | 15秒 |
5.Ver.0.4での高速化の肝
アセンブラは面倒なのでCで出来る限り高速化をしてみました。
出力されたマシン語コードを見る限り、アセンブラでこれ以上がんばってもほとんど効果はないであろう域に達しています。
最大スループットはVer.0.2の約4倍に向上しましたが、実際の書き込み時間は若干縮んだ程度です。
JTAGは小さいデータをチマチマとやりとりすることが多いので、本物・もどき共にUSBのレスポンスがボトルネックになっているようです。
・極力、関数の使用を避ける
関数呼び出しは引数をスタックに積んで、引き出すといった作業が伴うので非常に高コストです。
C18にはインライン関数がないようなのでマクロ関数を使って実装しました。
幸いにも18F2550はROMが大量にあるので、インライン展開してもまったく困りません。
//マクロ関数の定義の例
//複数行にわたる場合は行末にバックスラッシュを置く
//注意:マクロ関数中にはコメントが書けない
//返り値は持てないので、変数を渡して値を受け取るようにする
#define sum(ans,p1,p2) {\
ans=p1+p2;\
}
|
・高速でアクセスしたい変数はACCESS領域に配置する
通常の変数のアクセスにはバンク切り替えが必要で、これが速度低下をもたらしています。
ACCESS領域はレジスタ同様、バンク切り替えが必要ない領域なので、ここに変数を置くと高速になります。
ただしACCESS領域は96バイトしかないので、バッファや大きなテーブル等は置けません。
//ACCESS領域にBYTE(unsigned char)型変数tmpを宣言する
#pragma udata access accessram
near BYTE tmp;
//以降の変数を通常の領域に配置するように戻す
#pragma udata
|
・繰り返しはfor文ではなくdo-while文を使う
//一般的な繰り返し文
for(i=0; i<10; i++){
/* functions */
}
| |
//オーバーヘッドの少ない繰り返し文
i=10;
do{
/* functions */
}while(--i);
|
一般的な繰り返しの書き方と言えば左側のような書き方だと思いますが、これは遅いです。
高速な繰り返しの書き方は右側のようになります。
「加算して、ある数と比較」よりも「減算して、0かどうか」のほうが使う命令が少なくて済むのです。
同様に、バッファ配列のローテーションは、「num++; if(num==MAX) num=0;」とするよりも「if(num) num--; else num=MAX-1;」とすると速くなります。
・SPIモジュールの利用
当初からSPIモジュールに目はつけていたのですが、JTAGはLSBファーストでビットオーダーが逆なのでそのままでは使えません。
ビットを逆に並び替える(ビットリバーサルと呼ぶらしいです)操作は、単純にプログラムで行うと16命令サイクル必要です。
本プログラムでは、パワーオン時にRAM上に256通りのビット並び替えテーブルを作成し、プログラム中で呼び出すことで8命令サイクルでビット並び替えを済ませます。
ちなみにROM上のテーブルだと10命令サイクルかかりました。RAMが少ないPICに実装する際はROM上でも良いでしょう。
また、SPIモジュールを使うと、送受信中に他事が出来るので、その隙に次のデータのプリフェッチを行うことで時間短縮しています。
SPIモジュールをENABLEにする時、クロックラインにグリッチが出て1bitずれてしまうので、TRISレジスタを操作してマスクしています。
//MSSPをONにする際のクロック漏れを防ぐ
TRISBbits.TRISB1=1;
SSPCON1bits.SSPEN=1;
TRISBbits.TRISB1=0;
|
6.DDT#1付録 Lattice XP2-5Eの書き込み
クリックで拡大
ディジタル・デザイン・テクノロジ No.1 FPGA超入門
の付録のFPGA Lattice XP2-5E(LFXP2-5E)をUSB-Blasterもどきで書き込むソフトを作成しました。
USB-Blasterもどきをダウンロードケーブルとして使うので、プリンタポートが不要です。
コンフィグデータはSVFではなく、直接JEDECファイル(*.jed)を書き込めるので変換不要で快適にお使いいただけると思います。
また、一度ファイルをオープンすると、Programボタンを押すたびに自動でリロードしますので操作が少なく済みます。
書き込み時間も高速ですが、コンパイルのほうが圧倒的に時間が掛かるので意味ないですね。
QuartusIIで15秒でコンパイルできるソースをispLEVERでコンパイルしたら3分掛かりました。最速設定でも1分半掛かりました。遅い。

XP2Write ソース・バイナリ一式(Ver.0.54.091016)【最新版】
書き込み後にロジックが動作するように修正。ウィンドウへのドラッグに対応。
ソースつきなのでreadme.txtを読んで煮るなり焼くなり好きにしてください。VisualC++2005でMFCを使って書いてあります。
純正ドライバ使用時でftd2xx.dllがシステムに組み込まれていない場合、エラーダイアログが表示されます。
その場合はusbblstr32.dllをftd2xx.dllにリネームしてexeファイルと同じディレクトリに置いてください。
※注意:USB-BlasterもどきのPIC用プログラムはVer.0.5を使ってください。古いのは微妙にIOタイミングが悪く、ビットずれを起こします。
あと、LatticeのチップはAlteraと比べて信号にシビアなようです。うまく通信できない場合はJTAGラインにバッファを挟んでみてください。
5V→3.3V変換の分圧抵抗をもっと小さな値にしたほうが良いかもしれません。
・Windows7のタスクバーの新機能に対応(XP2Write Ver.0.52以降)
|
|
| 緑色のバーで進捗、赤のバーでエラーを表示 | サムネイルボタンから操作可能 |
・非公式・代替ドライバの使用(XP2Write Ver.0.53以降)

USB-Blasterの純正ドライバは、Alteraの開発環境QuartuusIIをインストールしなければ使えません。
LatticeXP2を使いたいだけなのにAlteraの開発環境をインストールするのは億劫だと思います。ライセンスの問題もあると思います。
Ver.0.53から、PICのUSB開発ツールのドライバをカスタマイズしたものを同梱し、XP2Writeで使用できるようにしました。
Lattice XP2のみで使用する場合は、純正ドライバは不要となりました。
もちろんこの非公式ドライバを適用した場合は、QuartusIIからは認識されません。
XP2Writeでは、非公式・代替ドライバを使用しているUSB-Blaster→純正ドライバを使用しているUSB-Blasterの順に探します。
そのため、純正ドライバを当てたUSB-BlasterをAltera用に、非公式ドライバを当てたUSB-BlasterをLattice用に、と使い分けることが可能です。
純正ドライバと非公式ドライバで、速度差はありませんでした。
・処理時間
計測環境はWindows XP SP3、ICH7、Core2Duo 800MHz動作でUSB2.0HUBを経由しています。
| Lattice LFXP2-5E | もどきVer0.5(SPI) | Ver0.5(PIO) | USB-Blaster |
| Erase only | 1.7秒 | 1.7秒 | 1.9秒 |
| Program(Erace,Write,Verify) | 5.7秒 | 7.8秒 | 63秒 |
トランジスタ技術2010年02月号によると、FT2232HのJTAG機能をUSB2.0 HighSpeedで使っても15秒掛かるそうです。
ご覧のようにUSB-Blaster(本物)でも使えますが、とてつもなく遅いのでお勧めしません。
原因は書き込み完了フラグのチェックがUSB-Blaster(本物)だととても時間が掛かるためです。
本物はハードウェア処理なので大量のデータの連続書き込みは速いのですが、小さなデータの往復は遅いようです。ざまあ。
・ソースコードについて
基本的には自由にお使いいただいてかまいませんが、商用利用は禁止させていただきます。
利用された場合は、リンクや事後報告をしていただけるとうれしいです。
USB-Blasterを使ったJTAG通信部分のみ別ファイル(jtag.cpp / jtag.h)に分けてあります。
自作ソフトからUBS-BlasterをJTAGインタフェースとして利用するためのライブラリとして使うことが可能です。
コードを差し替えることで、違うJTAGインターフェースを利用してLFXP2-5Eに書き込むことも可能です。
A.戯言
一応プログラムが書けてから、QuartusIIに認識してもらえず、3日くらい開発が止まっていました。
DLLフックしてどこで跳ねられているのか検証してみると、デバイス名の取得で跳ねられていたようです。
デバイス名を「USB-Blaster」としなければいけないところを「USB-Blaster 」としていたらしいです。
まさに見えない敵と戦っていたわけです。
旧Ver置き場
・回路図
Ver.0.2標準回路
※2009/06/18追記:回路図の8-11ピンの接続がずれていたので修正しました。
・PIC18F2550用プログラム
USB-Blasterもどき ソース・HEX一式(Ver.0.2.090312)
※2009/06/11追記:ヘッダファイルが抜けていましたので直したアーカイブに差し替えました。
※2009/06/12追記:Firmware2.4でコンパイルが通らないので2.1を同梱しました。
USB-Blasterもどき ソース・HEX一式(Ver.0.4.090720)
前バージョン比:高速化、安定化
・Lattice XP2書き込みソフトウェア「XP2Write」
※Ver.0.51以前では環境によってはVisualC++2005再頒布可能ランタイムパッケージのインストールが必要になる場合があります。
XP2Write ソース・バイナリ一式(Ver.0.50.090807)
この版ではSED_CRCの書き込みを省いていますが、問題なく動作するようです。
XP2Write ソース・バイナリ一式(Ver.0.51.090808)
SED_CRCの書き込みを行うようにしました。
XP2Write ソース・バイナリ一式(Ver.0.52.090810)
Win7のタスクバー拡張に対応、コマンドライン対応、ランタイムをスタティックリンクにしました。
XP2Write ソース・バイナリ一式(Ver.0.53.090813)
USB-Blaster純正ドライバなしでも使えるように非公式・代替ドライバのサポートを追加。
|