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.

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.
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.
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).
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:
:-----:-----:
-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
:-----:-----:
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.
Lo standard PCI supporta l'indirizzamento a 64 bit (non il trasferimento di dati a 64 bit per cui servirebbe un connettore più lungo) direttamente sui connettori per indirizzamento a 32 bit. Attraverso i dual address cycles si trasferisce l'intero indirizzo: nel primo ciclo i 32 bit meno significativi, nel secondo ciclo i 32 bit più significativi.
L'architettura del bus PCI è indipendente dal processore, le definizioni dei segnali permettono al bus di essere usato da diverse famiglie di processori. A causa della elevata velocità di trasferimento dati il numero di slot PCI su un singolo bus non deve superare le 3 o 4 unità. Per permettere bus di espansione con più di 3 o 4 slot la PCI SIG introdusse un meccanismo di PCI-to-PCI Bridge. I PCI-to-PCI Bridge sono degli ASIC che isolano elettricamente due bus PCI permettendo ai trasferimenti di essere inoltrati da un bus all'altro.
Required Pins Optional Pins
------------- -------------
----------------
| |
<===AD[31:0]=====>| |<===AD[63:32]====>
<===C/BE[3:0]#===>| PCI |<===C/BE[7:4]#===>
<---PAR---------->| Compliant |<---PAR64-------->
| Device |<---REQ64#------->
<---FRAME#------->| |<---ACK64#------->
<---TRDY#-------->| |
<---IRDY#-------->| |<---LOCK#-------->
<---STOP#-------->| |
<---DEVSEL#------>| |----INTA#-------->
----IDSEL-------->| |----INTB#-------->
| |----INTC#-------->
<---PERR#-------->| |----INTD#-------->
<---SERR#-------->| |
| |<---SBO#--------->
<---REQ#----------| |<---SDONE-------->
----GNT#--------->| |
| |<---TDI-----------
----CLK---------->| |----TDO---------->
----RST#--------->| |<---TCK-----------
| |<---TMS-----------
| |<---TRST#---------
----------------
C/BE[3:0]# Command Types 0000 Interrupt Acknowledge 0001 Special Cycle 0010 I/O Read 0011 I/O Write 0100 Reserved 0101 Reserved 0110 Memory Read 0111 Memory Write 1000 Reserved 1001 Reserved 1010 Configuration Read 1011 Configuration Write 1100 Memory Read Multiple 1101 Dual Address Cycle 1110 Memory Read Line 1111 Memory Write and Invalidate
Questi pin sono stati pensati per permettere di implementare una memoria cache su un bus PCI. Trasferiscono informazioni tra il bridge/cache e il target della memory request. Se una transazione risulta un hit su una linea di cache errata (dirty) il bridge/cache segnalerà “snoop backoff” al target. Come risultato il target rieffettuerà dei retry alla linea della cache finché il bridge/cache non completerà l'operazione di writeback. Al target ora verrà permesso di accedere alla cache per completare la propria operazione. Questi pin di supporto cache sono implementati molto raramente nei moderni sistemi PCI. Per ragioni di performance, la memoria cache è tipicamente accoppiata ad un bus che comunica con un processore che lavora a frequenze superiori di quelle del bus PCI.
Questi segnali sono statici che vengono riferiti a terra o lasciati scollegati sulla scheda. Nella tabella seguente sono riportati i codici dei vari segnali.
PRSNT1# PRSNT2# Add-in Board Configuration Open Open No board present Ground Open Board present, 25 W maximum Open Ground Board present, 15 W maximum Ground Ground Board present, 7.5 W maximum
1__ 2__ 3__ 4__ 5__ 6__ 7__ 8__ 9__
CLK __| |__| |__| |__| |__| |__| |__| |__| |__|
____ ____________
FRAME# |___________________________________|
_____ ____ _____ ____ __________
AD ----<_____>-----<____><_____><____><__________>------
Address Data1 Data2 Data3
_____ __________________________________
C/BE# ----<_____><__________________________________>------
Bus-Cmd BE#'s
__________ _____ ______
IRDY# |_______________________| |_____|
________________ _____ ______
TRDY# |_____| |_________________|
________________ ______
DEVSEL# |_____|_____________________________
|<--->|<--------->|<--------->|<--------->|
Address Data Data Data
Phase Phase Phase Phase
|<--------------------------------------->|
Bus Transaction
1__ 2__ 3__ 4__ 5__ 6__ 7__ 8__ 9__ CLK __| |__| |__| |__| |__| |__| |__| |__| |__| ____ ________________________ FRAME# |_______________________| _____ ____ ____ ____ _____________ AD ----<_____><____><____><____><_____________>--------- Address Data1 Data2 Data3 _____ ____ ____ ______________________ C/BE# ----<_____><____><____><______________________>------ Bus-Cmd BE-1 BE-2 BE-3 __________ _____ ______ IRDY# |___________| |_________________| __________ _________________ ______ TRDY# |___________| |_____| ________________ ______ DEVSEL# |_____|_____________________________| |<--->|<--->|<--->|<--------------------->| Address Data Data Data Phase Phase Phase Phase |<--------------------------------------->| Bus Transaction
| Controllo di autorità | LCCN (EN) sh2001003078 · BNF (FR) cb13556158h (data) · J9U (EN, HE) 987007534930405171 |
|---|