Serial Parallel Bus

ユニバーサル・シリアル・バス(英語: Universal Serial Bus、略称:USB、ユーエスビー)は、コンピュータ等の情報機器に周辺機器を接続するためのシリアルバス規格の1つである。

ユニバーサル(汎用)・シリアル・バスの名の示す通り、ホスト機器にさまざまな周辺機器を接続するためのバス規格であり、最初の規格となるUSB 1.0は1996年に登場した。現在のパーソナルコンピュータ周辺機器において、最も普及した汎用インターフェース規格である。(後々、レガシーポートとも呼ばれるようになる)従来からのRS-232CシリアルポートやIEEE 1284パラレルポート、PS/2コネクタの置き換えを狙ってコンパックディジタル・イクイップメント・コーポレーション (DEC)、IBMインテルマイクロソフト日本電気株式会社 (NEC)、ノーテルネットワークスの7社が合同で1994年に開発を行い、Windows 98において正式にサポートされたことで普及した。

USB規格では、1つのバスについて周辺機器は最大で127台接続可能である。接続口が足りない場合には、ツリー状に拡張できるUSBハブの使用も想定している。プラグアンドプレイにも対応しており、規格制定当時の一般的な外部インターフェースでは不可能だったホットプラグも可能としていた。

さらにUSB 2.0の登場によって転送速度が大幅に向上し、従来はIDESCSIイーサネットなど高速転送規格が必要だったハードディスクドライブ等の機器との接続にも用いられている。

ホストバスアダプタからの周辺機器への電源供給を規定している(バスパワー)。そのため従来のコンピュータ周辺機器だけでなく、事務用品や携帯電話、デジタルオーディオプレーヤーなど多様な機器へ電力を供給をする用途にも使用されるようになった。この機能に特化してデータ通信を一切行わない安価な接続ケーブルも販売されている。

USBはホスト機器と周辺機器を接続する規格であり、ホスト同士・周辺機器同士の直接接続には非対応で、電力供給能力が低いといった限界や柔軟性に欠ける部分はあるものの、現在のパーソナルコンピュータ環境では利便性に優れ、周辺機器との接続に最も使用される規格である。特に外部記憶デバイスとして扱えるUSB接続のUSBメモリは可搬性の高さからよく利用されている。

当初はインテルマイクロソフトコンパック(現:ヒューレット・パッカード)、ディジタル・イクイップメント・コーポレーション(現:ヒューレット・パッカード)、IBM日本電気、ノーザンテレコム(現:ノーテルネットワークス)が仕様を策定したが、2009年3月現在では、NPOである"USB Implementers Forum, Inc." (USB-IF) が仕様の策定や管理などを行なっている。USB-IFは、インテルヒューレット・パッカードマイクロソフト日本電気NXPセミコンダクターズテキサス・インスツルメンツの6社が主導企業であり、合計180社で構成される。

バス (英: bus) とは、コンピュータの内外、各回路がデータを交換するための共通の経路を指すコンピュータ用語である。

コンピュータにおいて、1つの信号線・通信線に複数のデバイスがぶら下がる構造を「バス型トポロジー」と言う。(詳細はネットワーク構成を参照。)本項目の「バス」の由来はこれである(もしくはそのもの)。

そのため、1対1で接続する専用経路(「ポイントツーポイント」)の場合はバスと言わない。バスに似た用語としてチャネルがある。チャネルは「入出力チャネル」のように、メモリと入出力との間の通信路を指す事が多い。

多くのコンピュータは、CPUなど、コンピュータの中心機能と、周辺機器や各種制御部を繋ぐためにバスを使っている。アーキテクチャが単純だった黎明期のコンピュータでは、各要素が単一のバスに接続されていた。たとえば、サン・マイクロシステムズの初期のワークステーションでは、VMEバスやマルチバスを使っていた。しかし、コンピュータの性能が向上するにつれて、CPUと各機器とを繋ぐバスの伝送容量も向上させる必要があり、次々と新しいバスに切り替わっていった。

マイクロプロセッサのメモリバスもこれまではバス型トポロジが主流だったが、メモリの高速化に対応してチャネルへと移行しつつある。また、マルチプロセッサ構成を採るワークステーションが性能を最大化するために複数のプロセッサとメモリーとの間での多対多の同時通信を行えるようにしたクロスバースイッチを採用してきたように、マルチコアやメニーコアを備えた新世代の高性能マイクロプロセッサの内部でも、多くのコアとキャッシュメモリーや外部との高速大容量の伝送を可能にするために、チャネルに代わってクロスバースイッチやリングバスが採用されるようになっている。

機器内部の構成要素が接続されるものを内部バス、外部機器と接続するものを外部バスという。この分類はどこに視点を置くかで、たとえばマイクロプロセッサ、コンピュータの内部基板(マザーボード等)、コンピュータ装置の筐体、等で分類の仕方も変わる。位置を明示した「CPU内部バス」等といった表現や、メーカーの「標準機器」と「拡張機器」といった商策上の分類などから拡張バスといったように呼ばれるものもある。

1ビットずつ順番にデータを転送するバスをシリアルバスと呼ぶ。通常はクロック信号線は存在せず、受信側での復調に必要なクロックのタイミングはデータ信号に重積して送っている。通信線路の本数が少なければシールドを充実させたり、平衡接続も比較的容易になるため高周波信号が扱いやすくなる。複数の通信線路では互いの信号間でのタイミングがずれるタイミング・スキュー問題が起きるがシリアル化によって回避できる。クロストーク(干渉)の問題も減少する。求められる通信容量の増大に対応してシリアルバスを複数組、束ねるものが現われているが、それぞれの伝送路に流れているのは個別のシリアル信号であって互いの信号間にクロックの同期はない。シリアルバスの多くが通信線路の両端に送信端と受信端を持つチャネルであり、物理的には本来のバス型トポロジーではない。チャネルであれば原理的には線端反射やスタブの影響を受けずにノイズの少ない高周波動作に適した通信路が得られる。初期のシリアルバスは、パラレルバスよりも遙かに低速だった。

RS-232C
RS-485
IEEE 1394
USB
PCI Express
シリアルATA
1-Wire
など

シリアルバスが1ビットずつデータを転送するのに対して、元データそのものや元データから切り出した複数ビットをひとかたまりにして、同時に複数本の通信路で情報を伝送するバスである。パラレルバスが必ずバス型トポロジーを採るとは限らないが、バス型トポロジーを採用するものが多い。クロック信号の専用線がデータ線と平行して設けられており、受信側でのデータ復調の同期に使われる。

信号線の本数が多いので、一般的には不平衡接続が採用されており、シールドの不足や線路間のクロストーク、路線長・LRC特性の違いなどによるスキューによって高速伝送にはあまり向かない。

ビット数すなわち平行する線路数は、8・16・32が多い。

コンピュータで使用されるデータバスやアドレスバスに採用例が多く、外部デバイスをつなぐバスとしても用いられ、GPIB、IDE/(パラレル)ATASCSIPCIなどがある。高速化に限界があるため、PCIの改良版PCI ExpressやパラレルATAの改良版シリアルATAでは、データラインはシリアルバスとなっている。

バス型トポロジーを採るバスでは、複数の送信回路が存在するために同時に送信を行わないよう、伝送路へ信号を送り出す権利を調停する回路が設けられるのが一般的である。このような回路はバス・アービターと呼ばれ、バス・アービトレーションを行う。調停回路を設けずにバスの使用権を各送信回路へ順番に与える方式もあるが、バスの伝送効率は悪くなる。

チャネルと異なり、複数の送受信回路が存在するバス型トポロジーを採るバスでは、仮に両端の終端処理を正しく行っても、途中の送受信回路の接続線やコネクタ類は「スタブ」と呼ばれる引き込み部分を構成してこの部分で信号波形は劣化する。仮に途中のコネクタが空のまま放置されればコネクタの引き込み線部分から反射が生じる。路線長の違いや伝送特性の違いなどを補正するために、伝送路を使用する前にトレーニングを行って平行するデータ線の信号特性を最適化するような工夫も行われたが、長い配線を引き回しながら十分なシールドを行うことは難しく、コモンモードノイズは不平衡伝送では除けず、外来ノイズやクロストークを抑えながら高速信号の波形を乱さないように扱うには限界がある。

スタブ (stub) とは、コンピュータプログラムのモジュールをテストする際、そのモジュールが呼び出す下位モジュールの代わりに用いる代用品のこと。下位モジュールが未完成でも代わりにスタブを用いることでテストが可能になる。逆に上位モジュールの代わりに用いる代用品をドライバ(ソフトウェアの場合)またはコントローラ(ハードウェアの場合)と呼ぶ。ただし、仮のモジュールではなく正規のモジュールについてもドライバ/コントローラと呼ばれる事があるので、区別するために「テストドライバ」や「サンプルドライバ」などと呼ぶ事も多い。

なお、stubの原義は使い残し、半券、切り株と言った意味である[1]。

呼び出す側(上位)のモジュールを検査する場合に、呼び出される側(下位)の部品モジュールが未完成であることがある。このとき、呼び出される側の部品モジュールの代用とする仮のモジュールを、「スタブ」と呼ぶ。スタブモジュールは設計仕様に定義されている全ての関数を実装してあるが、関数内部は正規の動作をせず、定数を返すだけという作りになっている事が多い。下位モジュールの関数の戻り値によって、上位モジュールの動作が分岐する場合は、その分岐パターンを満たすための最低限のいくつかの定数を返す、複数のスタブを作る場合もある。あるいは(その関数が引数をとる場合は)与えられる引数によって(正規の処理とは関係ない、最低限の分岐処理だけを実装し)、それらの値を返すスタブを作ることもある。

たとえば複数人でプログラミングをするときなどでは、初めはモジュールごとにプログラムを作成し、後で各モジュールを結合(リンク)して、全体としてうまく動作するかどうかをテストする。この結合テストの前段階で、個々のモジュールは、あらかじめ正当性を検査しておくことが望ましい。その場合、呼び出す部品モジュールがまだ完成していないときには、スタブが用いられる。スタブは、単純で何もしないようなものであってもよく、テストしたい部分とリンクして動作させるのに十分であればよい。

また、このようなスタブは、モジュールの仕様設計の段階で作られる事が殆どである。とりあえず設計段階で中身の無いスタブモジュールを書く事によって、モジュール間の結合の設計に問題がないかを具体的に確かめながら仕様設計ができるからである。また、スタブモジュールのみを作成することもまずありえない。スタブモジュール作成によって工数を消費することはデメリット以外何物でもないからである。

一般にテストする対象が上位階層のモジュールであって下位の部品が未完成の場合、その代用となる仮の下位階層モジュールを、「スタブ」と呼ぶ。

いずれの場合も、全体のプログラムテストを飛躍的に効率よくする役割を果たす。

組み込みシステムのソフトウェアを開発する際には、コンパイラなどの開発ツールを動かすコンピュータ(ホストコンピュータ)と、開発対象となるコンピュータ(ターゲットコンピュータ)は全く異なるものであることが多い。この時、プログラムを実際に動かしながら動作を確かめるデバッガは、ユーザインタフェースを必要とする本体部分をホストコンピュータ上で動作させ、ターゲットコンピュータ上では本体部分から通信線による指示を受けてCPUやメモリの状態を読み書きする小さなプログラムを動かしておくという構成になることが多い。この、ターゲット上の小さなプログラムを「スタブ」と呼ぶ。

このようなデバッガのスタブは、当然の事ながらターゲットコンピュータのCPUに強く依存したものになり、しばしばアセンブリ言語を用いて作成される。スタブが行なわなければならない主な内容は、次のようになる。

ホストコンピュータとの通信回線を初期化する
任意のメモリ内容を読み出して通信回線に送り出す
任意のメモリ内容を通信回線から受けたデータで書き換える
CPUの内部状態(レジスタ)を整えて、実行コードの任意の位置に制御を移す
実行コード中にソフトウェア割り込み命令を埋め込みターゲットソフトウェアの実行を一時的に停止させスタブに制御を戻す
上記のソフトウェア割り込み発生時にCPUの内部状態を読み取って通信回線に送り出す
組み込みシステム用ソフトウェア開発においては、このスタブを早い段階で安定動作させる事ができるかどうかが、その後の開発作業がスムーズに進むかどうかに大きく影響する。なお、スタブ自身のデバッグ作業には、一般にはハードウェア的にCPUの動作を制御するインサーキット・エミュレータを用いる。このインサーキット・エミュレータは比較的高価な装置であるため、開発人員全員の分を用意すると、開発コストが高くなってしまう。このため、スタブを開発する際やソフトウェアデバッガではどうしても検出できない事象を確認する際などの要所にのみインサーキット・エミュレータを用い、それ以外はスタブを活用して開発作業を進める事になる。