# VMEbus

Der VMEbus (Versa Module Eurocard-bus), auch VME-Bus oder VME-Bussystem genannt, ist ein Multi-User-Bussystem für die Steuerungstechnik, das 1981 ursprünglich für die Motorola-Prozessorfamilie 68000 entwickelt wurde. Gegenwärtig unterstützt der VMEbus nahezu alle Prozessoren, z. B. Intel x86, HP PA-RISC, Motorola 88000 und PowerPC. Er wurde von der IEC als ANSI/IEEE 1014–1987 standardisiert.
Die Ursprungsvariante verfügte über einen 16 Bit breiten Datenbus und einen 24 Bit breiten Adressbus, für die später diverse Erweiterungen entwickelt wurden. Mit der aktuellen VME64-Version stehen 64 Bit Busbreite zur Verfügung. Verwendet wird der VMEbus u. a. in der Luft- und Raumfahrt, z. B. basiert der Computer der ISS auf dem VMEbus, wenngleich in anderer Bauform.
Der Bus ist ein Backplanebus (Rückwandbus ohne eigene elektronische Bauteile) für 19″-Einschubgehäuse.
Entworfen wurde der VMEbus von einem Konsortium um die Unternehmen Motorola und Philips. Unternehmen, die VMEbus-Bauteile entwickeln und vertreiben, sind in der VITA (VMEbus International Trade Association) organisiert, Anwender haben sich ebenfalls in Organisationen zusammengeschlossen.
In Konkurrenz zum VMEbus hat das Unternehmen Intel den vergleichbaren Multibus II auf Basis der 80x86-Prozessoren auf den Markt gebracht, der aber bei weitem nicht so erfolgreich wurde wie der VMEbus und seine Weiterentwicklungen.

## Anschlüsse
### Steckverbindungen

Die Platinen und Baugruppen (Einschübe) werden mit Steckverbindern nach DIN 41612 und IEC 603-2 auf dem VMEbus aufgesteckt. Diese haben 3 Reihen mit je 32 Kontakten, also 96 Kontakten je Steckverbinder. Je nach Ausbaustufe werden die Anschlüsse P1, P2 und P3 (neueste Erweiterung – nur im VXI-Bus) belegt.

### Allgemeines

Auf dem Anschluss P1 sind untergebracht (Details s. u.):
* die Bus- und Interruptsteuerung
* die Datenbusleitungen D00 bis D15
* die Adressbusleitungen A01 bis A23.
Der Anschluss P2 enthält:
* in der mittleren Reihe (Reihe B):
** die Datenbusleitungen D16 bis D31
** die Adressbusleitungen A24 bis A31.
* Die äußeren Reihen A und C sind im VMEbus nicht definiert; sie sind:
** unbelegt
** vom Benutzer definiert belegt oder
** durch einen Subbus verwendet; als Subbusse sind der VMXbus oder der VMSbus definiert (s. u.).
Der Anschluss P3 enthält:
* die Erweiterungen des VXI-Busses.

### Belegung an P1

| ## | Reihe A | Reihe B | Reihe C |
| 01 | D00 | /BBSY | D08 |
| 02 | D01 | /BCLR | D09 |
| 03 | D02 | /ACFAIL | D10 |
| 04 | D03 | /BG0IN | D11 |
| 05 | D04 | /BG0OUT | D12 |
| 06 | D05 | /BG1IN | D13 |
| 07 | D06 | /BG1OUT | D14 |
| 08 | D07 | /BG2IN | D15 |
| 09 | GND | /BG2OUT | GND |
| 10 | SYSCLK | /BG3IN | /SYSFAIL |
| 11 | GND | /BG3OUT | /BERR |
| 12 | DS1 | /BR0 | /SYSRESET |
| 13 | DS0 | /BR1 | /LWORD |
| 14 | /WRITE | /BR2 | AM5 |
| 15 | GND | /BR3 | A23 |
| 16 | /DTACK | AM0 | A22 |
| 17 | GND | AM1 | A21 |
| 18 | /AS | AM2 | A20 |
| 19 | GND | AM3 | A19 |
| 20 | /IACK | GND | A18 |
| 21 | /IACKIN | SERCLK | A17 |
| 22 | /IACKOUT | SERDAT | A16 |
| 23 | AM4 | GND | A15 |
| 24 | A07 | /IRQ7 | A14 |
| 25 | A06 | /IRQ6 | A13 |
| 26 | A05 | /IRQ5 | A12 |
| 27 | A04 | /IRQ4 | A11 |
| 28 | A03 | /IRQ3 | A10 |
| 29 | A02 | /IRQ2 | A09 |
| 30 | A01 | /IRQ1 | A08 |
| 31 | −12V | +5V (Batt) | +12V |
| 32 | +5V | +5V | +5V |

#### Legende

| Befehl | Bezeichnung | Gruppe |
| D00 – D15 | Datenbusleitungen |
| A01 – A23 | Adressbusleitungen |
| AM0 – AM5 | Adressmodifizierer |
| /BR0 – BR3 | Busanforderungen | Bus-Steuerung |
| /BG0IN – /BG3IN | Busfreigaben (Eingang) | Bus-Steuerung |
| /BG0OUT – /BG3OUT | Busfreigaben (Ausgang) | Bus-Steuerung |
| /IRQ1 – /IRQ7 | Interrupt-Anforderungen | Interrupt-Steuerung |
| /IACK | Interrupt-Bestätigung | Interrupt-Steuerung |
| /IACKIN | Interrupt-Bestätigung (Eingang) | Interrupt-Steuerung |
| /IACKOUT | Interrupt-Bestätigung (Ausgang) | Interrupt-Steuerung |
| /ACFAIL | Störung im Netz (Spannung) |
| /BERR | Busfehler |
| /SYSFAIL | Systemfehler |
| /SYSRESET | Systemreset |
| SYSCLK | Systemtakt 16 MHz (nicht für Bussteuerung erforderlich) |
| /LWORD | Langwort-Übertragung |
| /BBSY | Bus belegt |
| /BCLR | Aufforderung zur Busfreigabe |
| /WRITE | Schreibzyklus |
| /DS0 – /DS1 | Datenbusselektion |
| SERCLK | Serieller Bus (Takt) |
| /SERDAT | Serieller Bus (Daten) |
| GND | Masse | Spannungsversorgung |
| +5V | Versorgungsspannung 5 Volt | Spannungsversorgung |
| +5V (Batt) | Versorgungsspannung 5 Volt aus Batterie | Spannungsversorgung |
| +12V | Versorgungsspannung 12 Volt | Spannungsversorgung |
| −12V | Versorgungsspannung −12 Volt | Spannungsversorgung |

#### Bussteuerleitungen

Die Bussteuerungsleitungen dienen zur Belegung und Freigabe im Datenbus. Hierzu gehören die Leitungen /BR0 bis /BR3, sie sind die Busanforderungen (Busrequest), sie sind L-aktiv. Jeder Einschub kann eine Busanforderung starten, in dem die entsprechende Leitung auf L gesetzt wird.
Die Leitungen /BG0OUT bis /BG3OUT sind die Busfreigaben (Bus Grant) als Ausgänge, /BG0IN bis /BG3IN analog dazu die Eingänge. Diese Leitungen sind so beschaltet, dass ein Ausgang /BGxOUT jeweils an den nächsten Einschub an den Eingang /BGxIN weitergeleitet wird. Diese Daisy-Chain-Beschaltung ermöglicht die Weitergabe der Freigabe an den nächsten Einschub. Nicht belegte Einschübe müssen mit Jumpern gebrückt werden, da die Weitergabekette sonst unterbrochen ist. Mit dieser Technik wird erreicht, dass die vier Busanforderungen von beliebig vielen Einschüben genutzt werden können, dies führt allerdings zu dem Nebeneffekt, dass Einschübe weiter links eine höhere Zuteilungswahrscheinlichkeit haben.
Wenn ein Einschub den Bus belegt, zeigt er es durch ein L auf der Leitung / BBSY (Bus Busy) an. Das Gegenstück dazu ist die Leitung / BCLR (Bus Clear), die vom Arbiter angesteuert wird und mit einem L den Einschub auffordert, den Bus wieder freizugeben, also die Übertragung zu beenden.
Mit der Leitung /DTACK (Data Acknowledge) wird mit L angezeigt, dass ein Datenbustransfer erfolgreich war. Mit einem L auf der Leitung /BERR wird das Fehlschlagen der Übertragung angezeigt Die Leitungen DS0 und DS1 legen zusammen mit LWORD und (in Grenzen) AD01 fest, welche Datengruppen eines 8-, 16- oder 32-Bit-Worts sich auf welchen Datenleitungen befinden. Diese etwas unübersichtliche Methode machte es möglich, Datengruppen auf unterschiedlichen Busbreiten und in unterschiedlichen Adressräumen zu übertragen.
Zusätzlich dienen die Leitungen AM0 bis AM6 der Zuordnung von Adressräumen und Übertragungsarten. Dabei werden unterschieden:
* Adressräume
** 16-, 24- und 32-Bit
* Übertragung
** Block und Byte/Wort
** Daten- und Programm-Übertragung
** mit oder ohne Privileg.

#### Interruptleitungen

Die Interruptanforderungen erfolgen über die Leitungen IRQ1 bis IRQ7. Anders als bei der Arbitrierung kann die Interruptsteuerung auch von anderen als dem ersten Einschub behandelt werden. Hierzu ist eine Leitung IACK (Interrupt Acknowledge) als Ausgang durchgeführt, die vor dem ersten Einschub zum IACKIN wird, die dann wie bei der Buszuweisung immer über IACKIN und IACKOUT weitergegeben wird.
In der Zeichnung sind diejenigen Anschlüsse rot dargestellt, die bei fehlendem Einschub durch einen Jumper überbrückt werden. (Nur 3 der 20 möglichen Einschübe sind eingezeichnet, die Reihe würde sich so immer fortsetzen.) Es gibt nur einen solchen IACK-Kanal, die Nummer des Interrupts, der gerade behandelt wird, wird in den Adressbits A1 bis A3 übertragen.

## Arbeitsweise

Interrupt- und Bussteuerung machen einen Arbiter erforderlich, der die Interrupt- und Bus-Anforderungen regelt. Er ist in der Regel im ersten Steckplatz angeordnet.

### Interrupts

Der VMEbus hat sieben IRQ-Leitungen mit unterschiedlichen Prioritäten. Jeder Interrupt kann aber von beliebig vielen Platinen genutzt werden, da der Interruptvektor nicht durch die IRQ-Leitung bestimmt wird, sondern die anfordernde Platine gibt den Interruptvektor selbst an.
Im Einzelnen erfolgt eine Interruptanforderung so:
* die anfordernde Einheit setzt den Interrupt Request (einen von IRQ1 bis IRQ7) auf L.
* Die Einheit, die für die Interruptbehandlung zuständig ist, holt sich mit höchster Priorität den Zugriff auf den Bus, falls sie diesen nicht ohnehin hat.
* Die Einheit aus 2.) sendet die Nummer des Interrupt Requests, der bearbeitet werden soll, auf Leitung A01 bis A03 und ein L auf der Leitung /IACK.
* Das Signal wird über /IACKIN und /IACKOUT von links nach rechts von einem Einschub zum nächsten weitergeleitet.
* Die erste Einheit, welche die Anforderung gestellt hat, sendet auf dem Datenbus auf D00 bis D07 den eigentlichen Interruptvektor zurück (00h bis FFh).
* Der Interruptvektor wird abgearbeitet.
Der große Vorteil dieses Verfahrens, das erst einmal unnötig kompliziert anmutet, liegt darin, dass sich viele Einheiten die IRQ-Leitungen teilen können, ohne dadurch Interrupt-Konflikte zu provozieren, so wie es im ISA-, VLB- und auch im PCI-Bus immer wieder passiert. Dabei ist zu beachten, dass der VMEbus historisch vor den eben genannten Bussystemen entwickelt und im Markt eingeführt wurde.

### Bussteuerung

Der VMEbus ist ein Multimaster-Bus, d. h. mehrere Busmaster können den Bus belegen. Auch hier wird wieder mit Prioritäten gearbeitet: vier BRQ-Leitungen stehen zur Verfügung, sie:
* sind entweder streng prioritär belegt, dies ist das üblichere Verfahren, oder
* arbeiten im Round-Robin-Verfahren mit rotierenden Prioritäten. Damit wird ein Fairness-Verfahren betrieben, d. h. länger wartende Einheiten werden bevorzugt.
Der Arbiter zur Buszuteilung sitzt in der Regel auf der ersten Einschubposition, weil es keine gemeinsame BGx-Leitung gibt. Ein Arbiter, der an anderer Stelle sitzt, kann nur noch die Einheiten steuern, die rechts von ihm eingebaut sind; damit wären die Steckplätze links davon verloren.

## VMSbus und VMXbus

* Der VMXBus (VME Extended bus) spezifiziert die Anbindung eines Speichers. Der Datenpfad zu diesem ist 32 Bit breit, eine Adresse umfasst 24 Bit, die im Multiplex als zwei 12 Bit breite Worte übertragen werden. Ein Flachbandkabel realisiert die Verbindung zwischen zwei Karten.
* Über den VMSbus (VME Serial bus) werden Nachrichten mit 200 bis 400 MByte/s übermittelt.

## Anwendungen

* Optoluchs