Bien que la possibilité d’étendre un ordinateur domestique avec plus de RAM, de stockage et d’autres fonctionnalités existe depuis aussi longtemps que les ordinateurs personnels existent, ce n’est qu’avec le PC IBM que le concept d’un système informatique entièrement ouvert et modulaire est devenu courant. Au lieu de se limiter à une configuration système fournie par le fabricant et à quelques add-ons qui ne s’intègrent vraiment pas bien, le concept de cartes d’extension a ouvert des industries entières ainsi qu’un grand marché amateur.

Le premier IBM PC avait cinq emplacements d’extension 8 bits qui étaient connectés directement au processeur 8088. Avec l’IBM PC / AT, ces emplacements d’extension sont devenus 16 bits grâce au processeur 80286 autour duquel il a été construit. Ces emplacements peuvent être utilisés pour tout, des cartes graphiques aux réseaux, en passant par la mémoire étendue ou les E / S personnalisées. Bien qu’il n’y ait pas de nom original distinct pour cette interface de bord de carte, à l’époque PC / AT, on l’appelait Bus PC, aussi bien que Au bus. Le nom Architecture standard de l’industrie (ISA) bus est un rétronyme créé par les fabricants de clones de PC.

Avec une telle ouverture est venue la possibilité de fabriquer relativement facilement et à peu de frais vos propres cartes pour le bus ISA, et le bus PCI suivant, également ouvert. À ce jour, cette ouverture permet un écosystème dynamique, que l’on souhaite construire une carte son ISA ou PCI personnalisée, ou ajouter le support USB à un système IBM PC de 1981.

Mais que faut-il pour démarrer avec les cartes d’extension ISA ou PCI aujourd’hui?

Le coût de la simplicité

De haut en bas: bus XT 8 bits, AT / ISA 16 bits, EISA 32 bits.

Une chose importante à noter à propos d’ISA et du bus PC / AT d’origine est qu’il ne s’agit pas tant d’un bus générique que de périphériques suspendus à un bus d’adressage et de données 8088 ou 80286. Cela signifie que par exemple qu’à l’origine le bus est aussi rapide que la vitesse d’horloge du CPU en question: 4,77 MHz pour le bus PC d’origine et 6-8 MHz pour le PC / AT. Bien que les cartes 8 bits puissent être utilisées dans les slots 16 bits la plupart du temps, il n’y avait aucune garantie qu’elles fonctionneraient correctement.

Alors que les fournisseurs de clones de PC ont commencé à introduire des processeurs plus rapides dans leurs modèles, le bus AT a fini par être cadencé entre 10 et 16 MHz. Naturellement, cela a conduit à de nombreuses cartes de bus AT (ISA) existantes ne fonctionnant pas correctement dans ces systèmes. Finalement, l’horloge du bus a été découplée de l’horloge du processeur par la plupart des fabricants, mais malgré ce que suggère l’acronyme «ISA», à aucun moment ISA n’a été vraiment normalisé.

Il a cependant été tenté de standardiser un remplaçant pour ISA sous la forme de Extended ISA (EISA). Créé en 1988, il comportait un bus 32 bits, fonctionnant à 8,33 MHz. Bien qu’il n’ait pas décollé dans les PC grand public, EISA a constaté une certaine adoption sur le marché des serveurs, en particulier en tant qu’alternative moins chère au bus propriétaire d’architecture Micro Channel (MCA) d’IBM. MCA lui-même a été envisagé par IBM comme le remplacement d’ISA.

En fin de compte, ISA survit à ce jour dans des équipements principalement industriels et des applications embarquées (par exemple le bus LPC), tandis que le reste de l’industrie est passé au PCI et au PCIe beaucoup plus tard. Les cartes graphiques ont connu quelques détours sous la forme de VESA Local Bus (VLB) et Accelerated Graphics Port (AGP), qui étaient des interfaces spécialisées destinées aux besoins des GPU.

Commencer avec une nouvelle ancienne technologie

Le corollaire de cette histoire tumultueuse d’ISA en particulier est qu’il faut être prudent lors de la conception d’une nouvelle «carte d’extension ISA». Pour une compatibilité vraiment large, on pourrait concevoir une carte 8 bits qui peut fonctionner avec une vitesse de bus allant de 4,77 à 20 MHz. Passer directement à une carte 16 bits serait une option si l’on n’a pas besoin de prendre en charge les PC 8088. Lors de la conception d’une carte PC / 104, il ne devrait y avoir aucun problème de compatibilité, car elle suit à peu près la forme la plus standard du bus ISA.

L’interface physique n’est pas un problème avec ISA ou PCI, car les deux utilisent des connecteurs de périphérie. Ceux-ci ont été choisis principalement parce qu’ils étaient bon marché mais fiables, ce qui n’a pas changé aujourd’hui. Du côté du PCB, il n’existe aucun connecteur physique, simplement les «doigts» conducteurs qui entrent en contact avec les contacts du connecteur de bord. On peut utiliser un gabarit pour cette partie, pour obtenir un bon alignement avec les contacts. Gardez également à l’esprit l’épaisseur du PCB car la carte doit établir un bon contact. Ici, le 1,6 mm commun semble être un bon match.

On peut facilement trouver en ligne des ressources pour les règles de conception ISA et PCI si l’on souhaite créer le connecteur de bord lui-même, comme cet excellent aperçu sur le site Multi-CB (fabricant de PCB, sans affiliation). Cela montre l’espacement des doigts et la conicité de 45 degrés sur le bord, ainsi que les exigences d’épaisseur et de distance des doigts.

Il est utile pour la partie conception du circuit électrique de savoir que ISA utilise une signalisation de niveau 5 V, alors que PCI peut utiliser 5 V, 3,3 V ou les deux. Pour ces derniers, cette différence est indiquée en utilisant le placement de l’encoche dans le slot PCI, tel que mesuré à partir de la plaque IO: à 56,21 mm pour les cartes 3,3 V et 104,47 mm pour les cartes 5 V. Les cartes PCI auront elles-mêmes l’une ou l’autre de ces encoches , ou les deux s’ils prennent en charge les deux tensions (carte universelle).

Les slots PCI existent en versions 32 bits et 64 bits, dont seul le premier a fait sensation sur le marché grand public. De l’autre côté du PCI, nous trouvons PCI-X: une évolution du PCI, qui a été le plus utilisé dans les serveurs dans sa version 64 bits. PCI-X double essentiellement la fréquence maximale du PCI (66 à 133 MHz), tout en supprimant la prise en charge de la signalisation 5V. Les cartes PCI-X fonctionnent souvent dans les slots PCI 3,3 V pour cette raison, ainsi que vice-versa. Une carte 64 bits peut revenir en mode 32 bits si elle est insérée dans un emplacement 32 bits plus court, qu’il s’agisse de PCI ou de PCI-X.

Conduire des bus

Chaque appareil sur un bus ajoute une charge qu’un appareil de signalisation doit surmonter. De plus, sur un bus avec des lignes partagées, il est important que les appareils individuels puissent se désengager de ces lignes partagées lorsqu’ils ne les utilisent pas. La manière standard de gérer cela est d’utiliser un tampon à trois états, tel que le 74LS244 commun. Non seulement il fournit l’isolation fournie par un circuit tampon numérique standard, mais il peut également passer à un état Hi-Z (haute impédance), dans lequel il est effectivement déconnecté.

Dans le cas de notre carte ISA, nous devons avoir quelque chose comme le 74LS244 ou son frère bidirectionnel 74LS245 pour s’interfacer correctement avec le bus. Chaque connexion de signal de bus doit avoir un tampon ou un verrou approprié placé dessus, ce qui pour le bus ISA est couvert en détail dans cet article par Abhishek Dutta. Un bon exemple de carte ISA moderne est le clone SoundBlaster «Snark Barker».

Le PCI pourrait également être réalisé de manière aussi discrète, mais les cartes PCI les plus couramment utilisées dans le commerce utilisent des ASIC accélérateurs d’E / S, qui fournissent une interface simple de type ISA aux circuits de la carte. Ces circuits intégrés sont cependant loin d’être bon marché aujourd’hui (sauf prendre un risque avec quelque chose comme le WCH CH365), donc une bonne alternative est d’implémenter le contrôleur PCI dans un FPGA. La version MCA du «Snark Barker» susmentionné (comme nous l’avons précédemment couvert) utilise un CPLD pour s’interfacer avec le bus MCA. Des sites comme OpenCores présentent des projets cibles PCI existants que l’on pourrait utiliser comme point de départ.

Discuter avec ISA et PCI

Après avoir créé un circuit imprimé brillant avec des doigts de contact en or et y avoir soudé des circuits intégrés de tampon de bus ou un FPGA, il faut encore pouvoir parler du protocole ISA ou PCI réel. Heureusement, de nombreuses ressources existent pour le protocole ISA, comme celle-ci pour ISA. Le protocole PCI est, comme le protocole PCIe, un «secret commercial», et n’est officiellement disponible que sur le site Web PCI-SIG pour un prix. Cependant, cela n’a pas empêché les copies de la spécification de fuir au cours des dernières décennies.

Il est tout à fait possible d’utiliser des projets ISA et PCI existants comme modèle ou référence pour ses propres projets. Les projets CPLD / FPGA mentionnés ci-dessus sont un moyen d’éviter d’implémenter le protocole soi-même et d’obtenir simplement les bons éléments. Dans tous les cas, il faut utiliser le système d’interruption (IRQ) pour le bus respectif (lignes de signal dédiées, ainsi que basé sur les messages dans les versions PCI ultérieures), avec la possibilité d’utiliser DMA (DRQn & DACKn sur ISA). Couvrir les subtilités du bus ISA et PCI prendrait cependant un article entier en soi. Pour ceux d’entre nous qui ont eu des cartes ISA avec interrupteurs à bascule ou (pire), ISA PnP (Plug’n’Pray) leur a été infligé, une grande partie de cela devrait déjà être familière, cependant.

Comme pour tout bus partagé, le protocole essentiel lors de l’écriture ou de la lecture consiste à demander l’accès au bus au bus maître ou à déclencher le protocole d’arbitrage de bus avec plusieurs maîtres de bus en PCI. Une carte d’extension peut également être adressée directement en utilisant son adresse de bus, comme Abhishek Dutta l’a expliqué dans son article ISA, qui sous Linux implique l’utilisation de routines du noyau (sys/io.h) pour obtenir des autorisations d’accès avant de pouvoir envoyer des données vers un port IO spécifique sur lequel la carte peut être adressée. Essentiellement:

if (ioperm(OUTPUT_PORT, LENGTH+1, 1)) {
	...
}
if (ioperm(INPUT_PORT, LENGTH+1, 1)) {
	...
}

outb(data, port);
data = inb(port);

Avec ISA, l’adresse IO est définie dans la carte et le décodeur d’adresse sur les lignes de signal d’adresse est utilisé pour déterminer une correspondance. Des commutateurs à bascule ou des cavaliers étaient souvent utilisés pour autoriser une adresse spécifique, une IRQ et une ligne DMA. ISA PnP a cherché à améliorer ce processus, mais a effectivement causé plus de problèmes. Pour PCI, PnP fait partie de la norme: le bus PCI est analysé pour les périphériques au démarrage et la ROM intégrée (BIOS) interrogée pour les besoins de la carte, après quoi l’adresse et les autres paramètres sont automatiquement configurés.

Emballer

De toute évidence, cet article a à peine couvert l’essentiel du développement de ses propres cartes d’extension ISA ou PCI personnalisées, mais j’espère qu’il a au moins donné un large aperçu du sujet. Une grande partie de ce dont on a besoin dépend du type de carte que l’on souhaite développer, qu’il s’agisse d’une carte ISA 8 bits (PC / XT) de base ou d’une carte PCI-X 64 bits.

Cependant, les bus tels que ISA et PCI sont très amusants, car ils sont très accessibles. Leurs vitesses de bus sont bien à la portée du matériel et des oscilloscopes amateurs en cas de débogage / analyse. L’utilisation d’un bus de données parallèle plus lent signifie qu’aucune signalisation différentielle n’est utilisée, ce qui simplifie le routage des traces.

Même si ces bus hérités ne jouent pas dans la même ligue que PCIe, leur ensemble de fonctionnalités et leur accessibilité signifient qu’ils peuvent donner une nouvelle vie aux anciens systèmes, même si c’est pour quelque chose d’aussi simple que d’ajouter du stockage Flash à un original. IBM PC.

[Heading image: Snark Barker ISA SoundBlaster clone board. Credit: Tube Time]