USB-Blasterもどきの製作(KiCadによる設計、基板発注まで)

KiCadの練習を兼ねてUSB-Blasterもどきを製作し、基板発注までトライしてみる。説明不要だと思うが、USB-Blasterもどきとは以下のサイトで公開されている “AlteraのUSB接続JTAGインターフェース:USB-Blaster” を安価なPICマイコンでエミュレートしたデバイスのこと。

そもそもJTAGとは何ぞやということで色々調べてみたところ、以下のサイトが詳しかった。


こちらのサイトによると、JTAGとは30年程前に登場した「基板検査」のための標準規格だが、今ではその汎用性の高さからあらゆる用途で使用されている総合デバッグインタフェース。インタフェース仕様はIEEE1149.1で定められていて、TCK(クロック) / TDI(データ入力) / TDO(データ出力) / TMS(状態制御)の4線シリアルインターフェース。モノによってはTRST(リセット)も追加される(CPUでは必ず使用するが、FPGAではあまり使用されないらしい)。電気的特性の規格は無く、各デバイスごとにCMOSだったりTTLだったり。

また登場の背景が面白い。当時、基板製造技術の進展で内層直結信号とかBGA端子が登場したものの、これらが物理的にプロービングできないため電気的な検査ができないという問題があったらしい。ショート検査などはX線で確認することができたのだが。そこで登場したのがJTAGを代表としたスキャンテスト。これは予めICの端子直近にスキャン・セルと呼ばれるテストプローブを内蔵してしまい、それをシリアル接続で操作するというもので、これがJTAGの始まり。

USB-Blaster仕様確認

USB-Blasterの仕様確認にあたり、インテル® FPGA ダウンロード・ケーブル(旧USB-Blaster)ユーザーガイドを参照した(Intelに買収されてからUSB-Blasterの名前が変わったらしい)。ピンアサインと信号機能は以下。

– インテル, インテル® FPGA ダウンロード・ケーブル(旧USB-Blaster)ユーザーガイド p.5より –

モードによって扱う信号線が異なるため、どのモードまでサポートするのかを考える必要がある。USB-Blasterもどきは最も信号線の多いASモードまでサポートしているようだが、そもそもモードって何だ?これに関しては以下のサイトが詳しかった。

こちらのサイトによると、ASモードはFPGAが自らクロックを生成し、アルテラ・コンフィギュレーション・メモリなる不揮発ROMからデータを取ってくるモード。PSモードはFPGAが外からクロックを受け取り、基板上のCPU(マイコン等)が汎用FlashROMを操作してビットストリームを流し込むモード。これ、部品点数を増やせない場合は有用らしい。そして最後のJTAGモードはご存知USB-Blasterを使用したPCからの強制書き込み。これを見るとそもそもUSB-BlasterはJTAGモードでしか使わないのだから、ケーブルにASモードの信号を通す必要は無いのでは?と思ったが、取り敢えずUSB-Blasterもどきと同構成にすることにした。

次に悩んだのはVCC(TARGET)の扱い。これは何の電源だろうか。USB-BlasterはホストPCから5V貰っているため、これをFPGA基板に渡してFPGA電源とするのだろうか。仕様書では「VCC(TARGET)はデバイスボードによって供給されます」とあるが、デバイスボードって何だ?結論から言うと、VCC(TARGET)はFPGA基板(ターゲットボード / デバイスボード)からUSB-Blasterに供給される電源。FPGAによって入出力が3.3Vだったり2.5Vだったりするため、これを信号のドライブ電源とするためらしい。そもそも仕様書の「USBダウンロードケーブルのボードへの接続手順」を参照すると手順の中でデバイスボードへ電源ケーブルを接続しているため、USB-Blasterから電源供給するようなユースケースは無い。

待て待て、USB-Blasterもどきの回路図を見るとホストPCから供給されるUSB 5VでPICを駆動している。この出力を100Ω, 200Ω分圧して3.3Vにしているのだが、これだと3.3V品のFPGA専用になってしまう。困った、最近のFPGAは2.5V品も多いらしいのでこれだと用途が限られてしまう。解決策としてPICをVCC(TARGET)で駆動すれば良い気がするが、使用するPICの動作電圧範囲が2.7V – 5.5Vなのでダメっぽい(ファームをお借りする以上、PIC変更は不可)。またよく見ると分圧抵抗が小さく消費電流が大きい。大きな抵抗で分圧すると速度が犠牲になるのでこの値なのだと思う。今回は個人使用だしUSB-Blasterという特性上、消費電力なんて全く気にしないのだが、せっかくなのでレベル変換回路を用意してデバイスボード側の駆動電源をVCC(TARGET)とする方法を採る。

レベル変換回路

単純にレベルシフタを使えば良さそうだと考えていたけれど、以下のサイトを見たらもう少し勉強が必要だと感じた。

こちらのサイトでは種々のレベル変換方式が説明されている。その中で以下の文章が気になった。

5V系・3.3V系の相互接続には信号レベル変換LSIを用いるというのが当然の発想のように思われるかもしれませんが、電子工作のレベルではデメリットもあります. 変換LSIは、古いCMOS標準ロジック(74HCシリーズ等)よりも微細化された製造プロセスを用いています. 当然、74HCシリーズなどよりもはるかに高速で動作し、結果としてスイッチング・ノイズも大きくなります. そのため、クロック信号のエッジで信号を取り込むシリアル・インターフェース回路をソルダーレス・ブレッドボードを用いて組んだ場合などに、ノイズによる誤動作の問題が発生することがあります.

わざわざ信号レベル変換LSIを買ってきて使うくらいならば、代わりにレベル変換用のバス・スイッチLSI(電源電圧3.3V、5V耐入力)を使用することをお勧めします.(例えば、SN74CB3T1G125, SN74CB3T3245 etc) 信号増幅をしないパッシブ動作のデバイスですからノイズ発生の問題はありません.

どうやらレベル変換ICには信号増幅をするものとそうでないものがあるようだ。5Vトレラントで3.3V出力するという次元の話では無い気がするため、バススイッチとレベルシフタについて調べてみることにした。東芝の汎用ロジックIC総合ガイドでラインナップを見てみる。

ICの大分類として汎用ロジック、ASSP(特定用途向けロジック)、レベルシフタ、バススイッチの4種類があるようだ。後者2つも汎用ロジックのような気がするのだが、分けた方が都合が良いのだと思う。後者2つの機能は1ビット / 2ビット / 4ビット / 8ビット / マルチプレクサで分類されていた。マルチプレクサ機能はレベルシフタには無く、バススイッチのみサポートされているようだ。2ビット以上のバススイッチは全てマルチプレクサ機能を持っているのだが、そもそも2ビット以上のバススイッチのことをマルチプレクサと呼ぶのだが……何でこんな分類にしたんだろ。→シングル入出力をワンパッケージにした多bit品があるためだった。

気を取り直してまずはバススイッチから詳細を見てみる。シリーズとして高速伝送スイッチ / USB2.0スイッチ / 低電圧バススイッチ / 5V系バススイッチの4種類があるようだ。前者2つはPCI-eやUSB3.0等、高速インターフェース信号の経路を切り替える用途で使用されるらしい。特定用途向けマルチプレクサのようなイメージで良いのかな。

 

レベルシフト機能付きバススイッチのことをレベルシフタと呼んでいる

 

コネクタの方向確認
TDOとTDI

回路図

ここに貼り付け

ラベルについて

KiCADではシート内ジャンプにローカルラベル、シート間ジャンプにグローバルラベルと呼ばれるものの使用が推奨されている。しかしローカルラベルを使用すると、「信号が切れているように見える」「ネット名との区別が付かない」という問題があってとにかく使い難い(後者はローカルラベルの実態がネット名だからなのだが)。そこで今回は配線のジャンプにはシート内であろうとグローバルラベルを使用し、ネット名の配置にはローカルラベルを使用するようにした。

USB mini-Bコネクタについて

今回はUSBコネクタにmini-Bを使用することにした。このmini-B、USB On-The-Go(USB OTG)で使うID信号ピンが追加された5ピン仕様となっている。このIDピンがオープンの場合は通常通りmini-B側がスレーブとして動作し、GNDに短絡されている場合はmini-B側がホストとして動作する。USB-Blasterもどきでは対mini-B側はPCとの接続になるためオープンで良いが、念のため0Ω抵抗のパターンを設けておくことにした。

USB OTGの備忘録として記載を残すが、USB OTGはPC等をホストとせず動作時にホスト機器を動的に切り替える機能を拡張したもので、USB機器同士を直接接続するインタフェース規格。例えばスマホもUSB Flashメモリも(プリンタでもHDDでも)、PCをホストとした構成が前提となっているが、USB OTG対応であればmini-B側にスマホを繋いで対mini-B側にUSB Flashメモリを繋いぐことでスマホがホストとなり、データのやり取りが可能となる。また以上の話はmicro-Bでも同じこと。USB端子形状の種類などは以下のサイトが分かりやすかった。

 

PWR FLAGについて

KiCADの仕様で今回のように回路図に電源が無い場合、ネットに電源が供給されていることをERCに伝えるPWR FLAGなるものをを+5VとGNDにそれぞれ接続する必要があるらしい(ただ、エラー箇所にピンのエレクトリックタイプが電源出力になっているコンポーネントが接続されている場合にはERCでエラーが出ないらしい)。

 

デバイスボードの10ピン・オス・ヘッダーに接続する10ピン・メス・プラグ(2.54mmピッチ2列)が必要らしいので、別途メス-メスケーブルを作製する。