La Peripheral Component Interconnect (PCI) o interconnessione di componente periferica è uno standard di bus sviluppato da Intel all'inizio degli anni '90. È entrato in commercio nel 1993 per collegare la CPU con le più svariate periferiche interne al computer (schede elettroniche) attraverso la scheda madre. La velocità di trasmissione dell'interfaccia PCI è rimasta negli anni ancorata a 132 MBytes/s, generata da una trasmissione dati con frequenza di clock pari a 33 MHz a 32 bit.

Sebbene l'interfaccia PCI abbia fatto segnare un notevole passo avanti nell'evoluzione dei PC, sia per il costo contenuto sia per le buone (e inizialmente sufficienti) prestazioni che ne hanno decretato la diffusione di massa rimpiazzando l'Industry Standard Architecture (ISA o Bus AT), i primi limiti si sono fatti sentire poco dopo in sistemi come server e workstation, dove è necessaria una più alta velocità di trasmissione dei dati. Fu così che si iniziò a cercare e progettare sostituti per questa interfaccia: i più fortunati sono stati il PCI a 66 MHz, il PCI-X ed ora il PCI Express. Il primo è la diretta conseguenza del classico PCI: si caratterizza per un aumento della frequenza da 33 a 66 MHz, per poi essere sfruttato sia con interfaccia a 32 che a 64 bit per una banda massima teorica di 528MBytes/s.

Accanto a queste nuove interfacce, il PCI ha subito nel corso del tempo delle leggere mutazioni: ad esempio abbastanza importante è la presentazione del PCI 2.3. Con questa nuova versione le prestazioni rimangono inalterate, ma sono stati introdotti i moduli che funzioneranno o esclusivamente a 3.3v (come per il PCI-X) o in modo universale, riconoscendo la tensione adeguata (3.3v o 5v) e adeguandosi di conseguenza.

Lo standard è sviluppato dal consorzio Peripheral Component Interconnect Special Interest Group.

Specifiche convenzionali del bus PCI clock a 33.33 MHz con trasferimento in modo sincrono transfer rate di 133 MB/s per bus di ampiezza 32 bit (33.33 MHz × 32 bits × 1 byte/8 bits = 133 MB/s) 32 bit o 64 bit di ampiezza del bus 256 byte di configuration space segnali a 3.3 o 5 volt switching delle reflessioni

Varianti PCI convenzionali

PCI 2.2 permette di trasmettere a 66 MHz (richiede di avere segnali a 3.3 volt e ha un transfer rate con picco di 266 MB/s) PCI 2.3 permette il solo uso di schede con segnali di 3.3 volt e non più schede con segnali a 5 volt PCI 3.0 è lo standard definitivo PCI-X raddoppia l'ampiezza a 64 bit, si è revisionato il protocollo e si è aumentato il data rate a 133 MHz (transfer rate di picco a 1014 MB/s) PCI-X 2.0 permette un rate a 266 MHz (transfer rate di picco a 2035 MB/s) e anche a 533 MHz, espande il configuration space a 4096 bytes, aggiunge una variante a 16 bit del bus e permette segnali a 1.5 volt Mini PCI è un PCI 2.2 in nuovo formato da usare nei portatili (laptop) Cardbus è un PCMCIA a 32 bit e 33 MHz PCI Compact PCI usa schede di dimensioni secondo le specifiche Eurocard (per portatili) PC/104-Plus è un bus industriale che usa le specifiche del PCI ma con connettori differenti PCI Express (PCIe) è una nuova interfaccia che sfrutta l'esperienza acquisita con PCI con un protocollo seriale a livello fisico e connettori differenti. PCI Express sta rimpiazzando i bus PCI e AGP. Gli slot PCIe non sono compatibili con i precedenti slot che sfruttano gli standard PCI e PCI-X. Mini PCIe, formato PCIe per portatili, per questa porta esistono due dimensioni delle schede, di cui la Half Mini PCIe è caratterizzata per le dimensioni più contenute M.2 o NGFF, utilizzato su alcuni portatili, porte basate sulle PCIe

Registri I registri di configurazione di una qualsiasi scheda che sfrutta il bus PCI come comunicazione si suddividono in registri mappati in memoria (di configurazione di tutte le routine legate alla scheda) e in registri appartenenti al PCI Configuration Space.

PCI Configuration Space Il PCI Configuration Space è previsto dallo standard PCI come ulteriore memoria (oltre ai registri standard mappati in memoria) per informazioni aggiuntive quali il Vendor ID, Device ID, per funzioni di configurazione e inizializzazione. La dimensione è di 256 byte indirizzati attraverso il BDF. BDF è un acronimo che significa Bus-Device-Function. Il Vendor ID è salvato in un registro a 16 bit ed è assegnato alla casa produttrice (del chip) dal PCI Special Interest Group, mentre il Device ID (sempre salvato su un registro a 16 bit) è assegnato dalla casa produttrice del chip. Il Subsystem Vendor ID contraddistingue la casa produttrice della scheda e il Subsystem Device ID è assegnato da essa per identificare la scheda. Il Command Register viene settato bit a bit e provvede a controllare il funzionamento della scheda secondo lo standard PCI. Lo Status Register è il registro dove vengono salvate informazioni relative agli eventi legati al bus PCI. All'avvio del PC tutti i dispositivi alloggiati sugli slot PCI sono in uno stato inattivo e non è ancora stato assegnato loro un indirizzo di memoria (dal BIOS o dal firmware associato) per poter comunicare con il sistema operativo o con il driver. Non ci sono metodi per determinare quali slot sono occupati da dei dispositivi e che funzioni svolgono questi dispositivi, per procedere si conta fino a quando non si individua un numero corrispondente ad un Vendor ID e Device ID per ogni combinazione BDF (bus, device, function). Al match del BDF il BIOS o il sistema operativo vanno a scrivere l'indirizzo di memoria di partenza nei BAR (Base Address Registers) del chip, questa operazione è valida per ogni sessione: dall'accensione del PC al suo spegnimento (questa è l'implementazione del plug and play).

Connettore (slot) PCI Dalle specifiche dello standard PCI esistono due tipi di connettori PCI che possono essere realizzati sulla superficie della scheda madre: uno per sistemi che sfruttano segnali a 5 volt e uno per sistemi che sfruttano segnali a 3.3 volt. In aggiunta possono essere implementati connettori a 32 bit o a 64 bit. Conseguentemente esistono tre tipi di slot:

slot che funzionano a 5 volt con una tacca che interrompe le posizioni 50 e 51 (per permettere solo a questo tipo di schede di poter entrare negli slot per segnali da 5 volt) slot che funzionano a 3.3 volt con una tacca che interrompe le posizioni 12 e 13 sempre per il già citato motivo slot universali che comprendono contemporaneamente le due tipologie di tacche per permettere l'innesto di tutte le tipologie di schede.

Disposizione e nomi dei pin di uno slot PCI con segnali a 5 volt

-12V |- B1 A1 -| Test Reset Test Clock |- B2 A2 -| +12V Ground |- B3 A3 -| Test Mode Select Test Data Output |- B4 A4 -| Test Data Input +5V |- B5 A5 -| +5V +5V |- B6 A6 -| Interrupt A Interrupt B |- B7 A7 -| Interrupt C Interrupt D |- B8 A8 -| +5V PRSNT1# |- B9 A9 -| Reserved Reserved |- B10 A10 -| +V I/O PRSNT2# |- B11 A11 -| Reserved

Reserved |- B14 A14 -| Reserved Ground |- B15 A15 -| Reset Clock |- B16 A16 -| +V I/O Ground |- B17 A17 -| Grant Request |- B18 A18 -| Ground +V I/O |- B19 A19 -| Reserved Address 31 |- B20 A20 -| Address 30 Address 29 |- B21 A21 -| +3.3V Ground |- B22 A22 -| Address 28 Address 27 |- B23 A23 -| Address 26 Address 25 |- B24 A24 -| Ground +3.3V |- B25 A25 -| Address 24 C/BE 3 |- B26 A26 -| Init Device Select Address 23 |- B27 A27 -| +3.3V Ground |- B28 A28 -| Address 22 Address 21 |- B29 A29 -| Address 20 Address 19 |- B30 A30 -| Ground +3.3V |- B31 A31 -| Address 18 Address 17 |- B32 A32 -| Address 16 C/BE 2 |- B33 A33 -| +3.3V Ground |- B34 A34 -| Cycle Frame Initiator Ready |- B35 A35 -| Ground +3.3V |- B36 A36 -| Target Ready Device Select |- B37 A37 -| Ground Ground |- B38 A38 -| Stop Lock |- B39 A39 -| +3.3V Parity Error |- B40 A40 -| Snoop Done +3.3V |- B41 A41 -| Snoop Backoff System Error |- B42 A42 -| Ground +3.3V |- B43 A43 -| PAR C/BE 1 |- B44 A44 -| Address 15 Address 14 |- B45 A45 -| +3.3V Ground |- B46 A46 -| Address 13 Address 12 |- B47 A47 -| Address 11 Address 10 |- B48 A48 -| Ground Ground |- B49 A49 -| Address 9

Address 8 |- B52 A52 -| C/BE 0 Address 7 |- B53 A53 -| +3.3V +3.3V |- B54 A54 -| Address 6 Address 5 |- B55 A55 -| Address 4 Address 3 |- B56 A56 -| Ground Ground |- B57 A57 -| Address 2 Address 1 |- B58 A58 -| Address 0 +5 I/O |- B59 A59 -| +V I/O Acknowledge 64-bit |- B60 A60 -| Request 64-bit +5V |- B61 A61 -| +5V +5V |- B62 A62 -| +5V

Descrizione del funzionamento del bus PCI In un bus PCI tutti i trasferimenti di dati avvengono in modalità sincrona, cioè secondo un clock di sistema (CLK). Il clock nel nostro caso (PCI 2.0) è di 33 MHz e quindi avviene un trasferimento ogni 30 ns. Sul bus PCI dati e indirizzi vengono multiplexati attraverso gli stessi pin (AD[31:0]) questo permette di ridurre il numero di pin richiesti sul connettore e quindi risparmio sui costi e una ridotta dimensione. Tipicamente le schede alloggiate sugli slot PCI utilizzano circa 50 pin di cui 32 sono quelli per dati o indirizzi. I cicli del bus PCI iniziano con un indirizzo presente sui pin AD[31:0] sul primo fronte del clock, questa è chiamata address phase ed è segnalata dall'attivazione del segnale sul pin FRAME# (che siccome è attivo basso andrà portato al livello logico basso). Il prossimo fronte del clock inizia nella prima di una o più data phases durante le quali i dati vengono trasferiti sui pin AD[31:0]. Secondo la terminologia PCI i dati vengono trasferiti tra un initiator che agisce da master e un target che agisce da slave. L'initiator pilota i segnali C/BE[3:0]# durante l'address phase per evidenziare il tipo di trasferimento (memory read, memory write, I/O read, I/O write, ecc). Durante le data phase i segnali presenti sui pin C/BE[3:0]# servono ad identificare quale byte dati viene trasferito. Sia initiator che target possono inserire wait states nel trasferimento dati portando al livello logico alto i segnali IRDY# e TRDYB#. Un trasferimento di dati è considerato valido ad ogni fronte del clock quando sia il segnale IRDYB# che il segnale TRDYB# sono al livello logico basso.

Un trasferimento attraverso il bus PCI consiste in un'address phase e una o più data phases. Le operazioni di I/O che accedono ai registri dentro ai vari dispositivi che sfruttano il bus PCI hanno tipicamente una sola data phase. Trasferimenti in memoria che muovono blocchi di dati consistono in data phases multiple che leggono o scrivono locazioni di memoria consecutive. Sia initiator che target possono terminare un trasferimento attraverso il bus in ogni momento. L'initiator segnala il completamento del trasferimento attraverso il bus portando ad un livello alto il segnale sul pin FRAME# durante l'ultima data phase (appena prima di trasferire l'ultimo dato). Il target invece può segnalare il termine di un trasferimento attraverso il bus impostando al livello basso il valore del segnale sul pin STOP#. Quando l'initiator rileva che il segnale su STOP# è attivo, deve terminare il trasferimento corrente e ri-arbitrare per la competizione del bus da parte delle varie periferiche. Se il segnale del pin STOP# è attivato senza nessuna data phase completata il target decreta che si tratta di un retry. Se il segnale del pin STOP# è attivato dopo che una o più data phase sono terminate con successo il target risolve che si tratta di un disconnet.

I vari initiator vengono arbitrati per il possesso del bus PCI portando al livello basso il segnale sul pin REQ#. L'arbitro garantisce il possesso del bus portando al livello basso il segnale sul pin GNT#. L'arbitraggio del bus PCI è definito hidden (nascosto) cioè non consuma cicli di clock. I trasferimenti attraverso il bus dell'initiator corrente sono sovrapposti al processo di arbitraggio che determina il prossimo detentore del bus.