|
|
〜 Main Menu 〜 ● コンテンツ ● サーバーについて ● ウェブログ ●外部リンク |
USB-Blasterもどきの製作・概要AlteraのUSB接続JTAGインターフェース、「USB-Blaster」を安価なPICマイコンエミュレートします。 Alteraの純正ツールでCPLD、FPGAの書き込み、デバッグがUSB一本でできます。 本機を使ってLattice XP2-5Eを6秒以内で高速に書き込みできるソフトも公開しています。
・背景、というよりどうでもいい前書き 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.必要なパーツ
要望があれば書き込み済みPICを頒布するかもしれません。 PICライタ純正品買っても3千円代と結構安いので、PICの世界に足を踏み入れてみるのもいいんじゃないでしょうか。 別にマイク□チップの回し者じゃないですが。簡易ライタならもっと安く作れますよ。
2.回路図
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.7のUSB-Blasterに対する比) →Fast ![]() ※ Small:1バイト/1ビットだけのIOを発行した場合 Large:186バイトのIOを発行した場合 BB:ビット単位でのIO操作を行った場合 Ser:バイト単位でのシリアルIO操作を行った場合 RW:リードを伴うIO操作を行った場合 W:ライトのみのIO操作を行った場合 読み出しを伴うIO操作では、"もどき"が圧倒的に高速であることがわかります。 ・Cyclone FPGAで使っている方からの報告
・(有)ヒューマンデータさまからの報告
5.高速化の肝Ver.0.4での高速化アセンブラは面倒なのでCで出来る限り高速化をしてみました。出力されたマシン語コードを見る限り、アセンブラでこれ以上がんばってもほとんど効果はないであろう域に達しています。 最大スループットはVer.0.2の約4倍に向上しましたが、実際の書き込み時間は若干縮んだ程度です。 JTAGは小さいデータをチマチマとやりとりすることが多いので、本物・もどき共にUSBのレスポンスがボトルネックになっているようです。 ・極力、関数の使用を避ける
・高速でアクセスしたい変数はACCESS領域に配置する
・繰り返しはfor文ではなくdo-while文を使う
高速な繰り返しの書き方は右側のようになります。 「加算して、ある数と比較」よりも「減算して、0かどうか」のほうが使う命令が少なくて済むのです。 同様に、バッファ配列のローテーションは、「num++; if(num==MAX) num=0;」とするよりも「if(num) num--; else num=MAX-1;」とすると速くなります。 ・SPIモジュールの利用
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文で場合分け演算によりオンデマンドで生成しています。 大幅に速度低下しましたが、デバイス認識時のみの処理なので通信速度には影響ありません。
・高速化 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.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(本物)でも使えますが、とてつもなく遅いのでお勧めしません。 原因は書き込み完了フラグのチェックがUSB-Blaster(本物)だととても時間が掛かるためです。 本物はハードウェア処理なので大量のデータの連続書き込みは速いのですが、小さなデータの往復は遅いようです。ざまあ。 ・ソースコードについて
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用プログラム
・Lattice XP2書き込みソフトウェア「XP2Write」 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||