Dans le cadre PCI d'origine («PCI conventionnel») et dans PCI-X également, les périphériques correspondaient à des «emplacements», chacun avec ses propres connecteurs connectés au même bus parallèle. Chaque emplacement avait une broche d'identification unique qui a été affirmée pendant l'énumération. L'énumération demandait essentiellement (pour chaque emplacement): "Hé, y a-t-il quelque chose de présent dans cet emplacement?" L'appareil a répondu en envoyant des données sur le bus en réponse à ce signal. Le manque de réponse signifiait aucun appareil.
Un appareil peut également être un «pont», ce qui signifie qu'il forme un bus subordonné. Ce bus aurait un ID distinct (attribué à partir de l'amont) et aurait son propre ensemble d'emplacements qui ont été énumérés indépendamment.
PCI-Express (PCIe) est totalement différent. PCIe n'est pas vraiment un bus - comme dans une ressource partagée entre des périphériques; à la place, chaque appareil possède sa propre connexion série point à point à son appareil en amont (et à tout appareil en aval - et s'il a des appareils en aval, cela signifie qu'il fonctionne également comme un pont). Considérez PCIe comme un LAN. Chaque pont est analogue à un commutateur, qui a un tas de ports connectés à d'autres appareils. Les autres périphériques peuvent être des terminaux ou des commutateurs (par exemple des ponts PCIe).
PCIe a été conçu de manière à ce que son cadre conceptuel et son adressage (et donc le comportement fourni aux logiciels) soient compatibles avec PCI et PCI-X. L'implémentation est cependant complètement différente. Dans l'énumération de périphériques, par exemple, étant donné qu'il s'agit d'un point à point, la seule question qui doit être déterminée à chaque point de l'énumération est "quelque chose là-bas?" Étant donné que chaque périphérique possède son propre jeu de câbles indépendant, les ID de périphérique sont essentiellement tous codés en dur (par conséquent, chaque pont, y compris le "complexe racine" de niveau supérieur, indique à chaque périphérique quel sera son ID de périphérique).
Dans tous les cas, la partie "fonction" du bus / périphérique / fonction est gérée strictement à l'intérieur du périphérique. Par exemple, un contrôleur NIC à double port aura souvent deux fonctions, une pour chaque port. Ils peuvent être configurés et exploités indépendamment, mais le chemin de données de l'UC vers la fonction est le même pour les deux.