VMEバス

VMEバスは、コンピュータのバス規格のひとつであり、元々はモトローラの68000シリーズマイクロプロセッサのために開発された。その後、多くのデバイスで使用され、IEC 821、ANSI/IEEE 1014-1987 として標準化された。 物理的には Eurocard サイズの接続機構を採用しているが、信号接続は独自のものである。 1981年の最初に開発され、今日でも広く使われている。 1979年、モトローラは 68000 CPU を開発していた。 技術者の一人 Jack Kister は 68000システム向けの標準化されたバスシステムを作り VERSAバスと呼んだ。 その後、John Black が加わり、仕様を改善して VERSAモジュール という製品コンセプトを作り上げた。 モトローラの欧州部門の Sven Rau と Max Loesel は機械的仕様を追加して、Eurocard 規格を活用するようにした。 その結果完成したのが最初の VERSAバス-E であり、後に VMEバス(VERSAmodule Eurocard bus)と改称された(ただし Versa Module Europaとする説もある)。 その後、多くの企業がこの規格を使用するようになり(シグネティクス、Philips、Thompson、Mostekなど)、すぐにIECにおいて IEC 821 VMEbus として標準化され（現 IEC 60821）、ANSI と IEEE において ANSI/IEEE 1014-1987 として標準化された。 当初の標準は 16ビットバスであった。既存の Eurocard のコネクタに収めるためである。 しかし、その後何回かの拡張を経て、現在の VME64 では 6Uカード の 64ビットバス規格と、3Uカードの 32ビットバス規格がある。VME64 の標準的な性能は 40 MB/s である。その他にも、ホットスワッピング(プラグアンドプレイ)を規定した VME64x や、小さなカード(IP)をVMEバスカードに接続する機構、各種接続規格とVMEシステムとのリンクを実現する規格などがある。 1990年代終盤、同期型プロトコルが好ましいと思われるようになり、VME320 と呼ばれる研究プロジェクトが開始された。VITA Standards Organization は VME32/64 のバックプレーンを変更せずに同期型プロトコルを動作させる新しい標準を求めた。1999年、新たな 2eSST プロトコルが ANSI/VITA 1.5 として承認された。 VMEバスはまた、非常によく似たVXIバスやVPX（英語版）の開発にも使われた。 VMEバスは、68000の持つピンをそのままバックプレーンに出力したようなものである。多くの場合、これは良い設計とは言えない。バスを使えるチップセットが限られてしまうからである。しかし、68000は 32ビットのフラットなメモリモデルを持つことが特徴であり、VMEは68000ベースの設計ではあるものの、68000の設計が汎用性が高いために広く使われるようになったのである。 VMEはデータとアドレスそれぞれに分離した32ビットバスを持っている。実装としてのMC68000自身の物理外部バスとしては、アドレスは24ビットで、データは16ビットであるが、(内部)アーキテクチャとしては68000は32ビットであり（アドレス空間は24ビットだったが、32ビットへの拡張を前提にできた）、VMEの設計者はシリーズの将来のプロセッサでの、完全な32ビット実装を見据えていた。どちらのバス幅にも対応するため、VMEではふたつの Eurocard コネクタ P1 と P2 を使用する。P1 には 32本のピンが 3列あり、24ビットのアドレスバスと 16ビットのデータバス、その他の制御信号などがこのコネクタを通る。P2 にはもう一列のピンがあり、残りの アドレス 8ビット分と データ 16ビット分がセットされている。 バスを制御するため、9本のarbitration bus（調停バス）が使用される。全ての通信はバスにセットされたarbiter module（調停モジュール）カードが制御する。ラウンドロビンと優先順位方式の2種類の調停モードが用意された。 調停モードに関わらず、カードはバスマスターになるために4つある Bus Request 線のいずれかを low にする。ラウンドロビン調停の場合、Bus Request 線 BR0-BR3 をほぼ同時に low にしてバスマスターになろうとしたカードがあった場合に、調停モジュールはこれらをラウンドロビン・スケジューリングで順次バスマスターとするよう調停する。優先順位調停の場合、BR0-BR3 には固定の優先順位が割り当てられ（BR0 が最低で BR3 が最高）、調停モジュールは最も高い優先順位でバスマスターになろうとしているカードをバスマスターにする。 調停モジュールがどの要求を受け付けるかを決定したら、対応する Bus Grant 線（BG0 - BG4）をアサートしてバスマスターの権利を与えることを通知する。複数のカードが同時に同じ BR 線でバスマスターになろうとしていた場合、調停モジュールに近い方が優先される。バスマスターとなったカードはバスが使用中であることを示すため、Bus Busy (BBSY*) をアサートする。 この時点で最初に要求を出したカードがバスの使用権を得る。データを書き込むには、アドレスとデータをバスに出力し、address strobe線 と二本の data strobe線を low にしてデータがレディ状態であることを示し、書き込み線を low にして処理を実行する。data strobe が二本あるのは、その組み合わせによってデータサイズを指定するため（8ビット、16ビット、32ビット、そしてVME64ではさらに 64ビット）である。指定されたアドレスを持つカードはデータを読み込み、data transfer acknowledge線を low にして完了を知らせる（あるいは必要ならbus error線）。 データの読み込みも基本的には同じだが、カードが最初にアドレスだけをバス上に出力し、READ ピンを引く。 他のカードはそのアドレスのデータをバス上に出力し、data strobe を引いてデータがレディであることを示す。 このような信号方式は非同期であり、PCIのようなバス全体のクロック同期が存在しない。 ブロック転送プロトコルにより、複数のバス転送を一回のアドレスサイクルで出来るようになる。ブロック転送モードでは、最初の転送にアドレスサイクルが含まれ、その後の転送はデータサイクルだけとなる。スレーブはそれらが連続したアドレスに関するものであると解釈する。 マスターがバスを解放する方法は2種類ある。Release When Done (RWD) では、マスターは転送が完了したときにバスを解放し、次の転送の際には再度調停が必要となる。Release On Request (ROR) の場合、マスターは転送が終わっても BBSY* をアサートし続け、バスを保持し続ける。ROR では、Bus Clear (BCLR*) が他のカードによってアサートされるまで、現マスターが制御を握り続ける。従って、一度に多量のデータ転送が必要となるようなカードでは、性能を最適化しやすい。これにより転送のレイテンシが減少するが、他のカードにとっては逆にレイテンシが大きくなる。 VMEには割り込みバスも存在し、割り込み要求線（IRQ1 - IRQ7）は68000の7種類の優先順位付き割り込みに対応している。割り込みモジュールは、これら割り込み要求線のうちの1つをアサートすることで割り込み要求を発生させる。バス上の各モジュールは任意の割り込みを発生することが可能である。割り込み処理モジュールが対応する優先順位の割り込み要求を検出すると、割り込み処理モジュール自身が上に説明したような方法でバスマスターとなる。そして、アドレスバスにIRQ線の番号を2進数にしたものを出力することで（例えば IRQ5 なら 101）、割り込みベクターを読み取る。また、IACK 線をアサートし、ステータス/ID を読み取る。ステータス/IDを返すのは割り込みを発生したカードである。割り込み制御モジュール（通常、CPU）は、このステータス/IDを使って適切な割り込み処理ルーチンを呼び出す。 VMEでの転送はすべてDMAであり、各カードがマスターにもスレーブにもなる。このあたりのコンセプトはバス規格によって様々である。たとえば、ISAバスでは、既存の「チャネル」モデルを使っている。すなわちホストCPUが全ての通信を制御する方式である（チャネル・コントローラ参照）。その点、VMEはコンセプトとしては非常に単純であるが、そのために各カード上に複雑なコントローラを必要とする。 現在では、VME は各種CPUバスをサポートしている。インテル x86、HP PA-RISC、モトローラ 88000、PowerPC などである。 コンパクトPCI インターフェース 1987年2月号 特集VMEバス・システム完全マスタ。 VMEbus International Trade Association (VITA)(英語) VMEbus Systems Magazine(英語) VME Blog VMEbus in the 21st Century Next Generation VME VME bus pinout and signals First PCIexpess based VMEboard