USB-Blasterもどきの製作
・概要
AlteraのUSB接続JTAGインターフェース、「USB-Blaster」を安価なPICマイコンエミュレートします。
Alteraの純正ツールでCPLD、FPGAの書き込み、デバッグがUSB一本でできます。
本機を使ってLattice XP2-5Eを6秒以内で高速に書き込みできるソフトも公開しています。
==更新履歴==
2009/03/12 Ver.0.2公開(初版)
2009/06/12 ソースコード更新(プログラム変更なし)
2009/06/18 回路図修正
2009/06/20 (有)ヒューマンデータさまに紹介していただきました
2009/07/20 Ver.0.4公開 高速化及び安定化(バッファオーバラン防止)
2009/08/07 Ver.0.5公開、DDT#1付録LaticceXP2-5E書き込みソフト公開
2009/10/16 XP2Write Ver.0.54に更新
2010/12/12 Ver.0.6公開、Windows7でHUB経由時動作しない問題を解決
2011/03/01 Ver.0.7公開、より安価なPIC18F14k50に移植
2012/11/03 XP2Write Ver.0.60に更新
|
Ver.0.4標準回路製作例(クリックで拡大)
|
Ver.0.7応用製作例(クリックで拡大)
|
・背景、というよりどうでもいい前書き
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搭載マイコン PIC18F14k50 | 秋月電子 | \200 |
セラロック 12MHz | 秋月電子 | \20 |
ピンヘッダ 2x5(2x25を割る) | 秋月電子 | \10 (5台分50円) |
カーボン抵抗1/6W型 100Ω x9 | 秋月電子 | \9 (100本100円) |
カーボン抵抗1/6W型 200Ω x5 | 秋月電子 | \5 (100本100円) |
カーボン抵抗1/6W型 1kΩ x1 | 秋月電子 | \1 (100本100円) |
カーボン抵抗1/6W型 10kΩ x1 | 秋月電子 | \1 (100本100円) |
チップ積層セラミックコンデンサ 1uF | 秋月電子 | \2 (100個200円) |
チップ積層セラミックコンデンサ 0.1uF x2 | 秋月電子 | \0.9 (4000個1800円) |
基板 適当 (価格は秋月C基板) | --- | \60 |
USBコネクタ | 秋月電子 | \50 |
お好みのLED | ---- | ---- |
はい、400円掛からないです。
要望があれば書き込み済みPICを頒布するかもしれません。
PICライタ純正品買っても3千円代と結構安いので、PICの世界に足を踏み入れてみるのもいいんじゃないでしょうか。
別にマイク□チップの回し者じゃないですが。簡易ライタならもっと安く作れますよ。
2.回路図
※2011/03/01公開:Ver.0.7では使用するPICが変更になっています。高速化のためピン配置は固定です。
信号電圧変換が下りは分圧、上りは直結というところがチープでいいですね。
出力電圧はこの定数で約2.8Vとなりました。ターゲットの耐圧に注意。
PICはTTL入力なので2.5V CMOSレベル以上なら判別可能です。
入力ポートの100Ωは所謂ダンピング抵抗というやつです。保護も兼ねていますが。
3.PIC側のプログラム
USB-Blasterもどき ソース・HEX一式(Ver.0.7.110301)【最新版】
前バージョン比:MCHPFSUSB2.8使用。より安価なPICに移植。
基本的にHEXファイルをそのまま焼いておk
今回はポートマップもクロック周波数も変更できません。
マイクロチップのUSBファームウェアVer.2.8をベースに作っています。
再コンパイルする場合下記の環境が必要です。
・MPLAB IDE
・C18 Compiler
・Microchip USB Firmware Ver.2.8(アーカイブに同梱しました)
上記ツールをインストールした上でプロジェクトファイルを開き、Configure->SelectDevice画面でPIC18F14k50を選択してください。
※ライセンスについて
基本的に自由に使っていただいてかまいませんが、応用したものを公開される場合、可能であれば当サイトにリンク等していただけると幸いです。
4.動作確認
ドライバはUSB-Blaster(本物)と同じようにインストールします。
PCとの接続がうまくいけば上図のようにQuartusII->Programmer->Hardware Setup画面に現れます。
・接続例
Ver.0.2接続例(クリックで拡大)
|
Ver.0.7接続例(クリックで拡大)
|
オプティマイズさんのMAX2 CPLDボード(1600円)、自作FPGAボード(材料費2700円)との接続。
本回路とこれだけで完結します。おそらく(USB対応で)最安のCPLD/FPGA開発環境なのではないでしょうか。
ちゃんと認識してます。
・処理速度
計測環境はWindows XP SP3、ICH7、Core2Duo 800MHz動作でUSB2.0HUBを経由しています。
→PC買い替えに付き、Windows7 SP1、QM57、Core i7 1.3GHz動作、USB2.0HUB経由に変更になりました。
直接USBポートに接続すると若干遅くなります。これは純正品でも同様のようです。
Altera MAXII EPM570T100C5N | もどきVer0.2 | Ver0.4(PIO) | Ver0.4(SPI) | Ver0.7 | USB-Blaster |
Erase->Blank-check | 4.5秒 | 3.2秒 | 3.1秒 | 2.8秒 | 2.9秒 |
Examine | 3.1秒 | 1.7秒 | 1.7秒 | 1.3秒 | 1.3秒 |
Erase->Write->Verify | 10秒 | 7.5秒 | 7.1秒 | 6.5秒 | 7.5秒 |
IDCODE Test 9999回 | 未測定 | 未測定 | 7.6秒 | 7.0秒 | 20秒 |
Altera Cyclone III EP3C10E144C8N | もどきVer0.6 | もどきVer0.7 | USB-Blaster |
JIC Erase->BlankCheck | 14.0秒 | 14.2秒 | 11.5秒 |
JIC Program->Verify | 28.4秒 | 24.3秒 | 16.1秒 |
SRAM Config | 1.3秒 | 1.4秒 | 1.0秒 |
IDCODE Test 9999回 | 7.6秒 | 7.5秒 | 20.6秒 |
通信速度ベンチマーク(赤字はVer.0.7のUSB-Blasterに対する比) →Fast
※ Small:1バイト/1ビットだけのIOを発行した場合 Large:186バイトのIOを発行した場合
BB:ビット単位でのIO操作を行った場合 Ser:バイト単位でのシリアルIO操作を行った場合
RW:リードを伴うIO操作を行った場合 W:ライトのみのIO操作を行った場合
読み出しを伴うIO操作では、"もどき"が圧倒的に高速であることがわかります。
・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;
|
Ver.0.7でのリソースの少ないPICへの移植
・省メモリ化
Ver.0.7ではより安価なPIC18F14k50に移植しました。移植前後のハードウェアリソースの違いは以下のとおりです。
特にUSB用RAMが少なく、USBライブラリ使用分64バイトを差し引くと192バイトしかありません。
これでは送信と受信で合計3パケット分しか確保することが出来ません。
性能を落とさないために2パケット分を受信バッファとして使い、送信バッファに1パケット分を割り当てました。
RAM上に256バイトのリングバッファを作成し、1パケット分ずつ送信バッファにコピーすることで送信バッファの少なさをカバーしています。
RAM上にリングバッファを確保したことにより、今度はRAMが足りなくなりました。
256バイト消費するビット反転テーブルをROM化することで、速度をなるべく落とさずに実装しました。
128バイト消費するEEPROMデータは、大量のif文で場合分け演算によりオンデマンドで生成しています。
大幅に速度低下しましたが、デバイス認識時のみの処理なので通信速度には影響ありません。
| PIC18F2550 | PIC14k50 |
| Hardware | Used | Hardware | Used |
RAM (USB以外) | 1024 | 737 | 512 | 417 |
USB通信用RAM | 1024 | 587 | 256 | 256 |
・高速化
SPIクロック12MHzの条件では、最初の通信完了フラグチェックの前に通信が完了します。
フラグチェックを省くことにより、ビット反転テーブルのROM化による速度低下が帳消しにできました。
リングバッファを採用したことでUSB送信データのキューイング処理がシンプルになり大幅に高速化できました。
キューイングの高速化により、送信バッファへの転送による速度低下を差し引いても以前より高速になりました。
ビットバングIOを各ビット単位で行っていたのを、全ビット一括で行うようにし、高速化しました。
IOピンが固定化されてしまい、SPIピンと異なってしまうため、トライステートを活用して使用するピンを切り替えています。
TDIピンとTCKピンに2本のIOが接続されているのはこのためです。
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.60.121103)【最新版】
コンパイラとライブラリを変更。XP2-17Eに暫定対応。本物での高速化。
ソースつきなのでreadme.txtを読んで煮るなり焼くなり好きにしてください。VisualC++2010でWTLを使って書いてあります。
純正ドライバ使用時で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秒 | 11.4秒 |
トランジスタ技術2010年02月号によると、FT2232HのJTAG機能をUSB2.0 HighSpeedで使っても15秒掛かるそうです。
ご覧のようにUSB-Blaster(本物)でも使えますが、とてつもなく遅いのでお勧めしません改善しました(従来63秒)。
原因は書き込み完了フラグのチェックが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ピンの接続がずれていたので修正しました。
Ver.0.4標準回路
※2009/07/20公開:Ver.0.4ではSPIモジュール利用のためデフォルトのピン配置が変更になっています。
PIOモードに切り替えれば従来のピン配置にも変更できます。詳細は配布アーカイブのreadme.txtをご覧ください。
・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)
前バージョン比:高速化、安定化
USB-Blasterもどき ソース・HEX一式(Ver.0.5.090806)
前バージョン比:IOタイミングの微調整、MCHPFSUSBブートローダとHIDブートローダを使った書き込みに対応
USB-Blasterもどき ソース・HEX一式(Ver.0.6.101212)
前バージョン比:MCHPFSUSB2.5使用。Windows7でHUB経由時に動作しない問題を解決。
・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純正ドライバなしでも使えるように非公式・代替ドライバのサポートを追加。
XP2Write ソース・バイナリ一式(Ver.0.54.091016)
書き込み後にロジックが動作するように修正。ウィンドウへのドラッグに対応。
|