Tre slot di espansione PCI da 5 volt da 32 bit su una scheda madre.

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[1] 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 un'altissima velocità per la 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

Varianti PCI convenzionali

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.

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:

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.

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.

Descrizione dei segnali PCI

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#---------
                   ----------------

Pin di sistema

Pin di indirizzi e dati

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	

Pin di controllo del dispositivo (interfaccia)

Pin di arbitraggio (relativi solo all'initiator)

Pin di segnalazione errori

Pin di interrupt

Pin di supporto alla cache (opzionali)

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.

Pin addizionali

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	

Esempi di diagrammi temporali del bus PCI

Transazione di una lettura (read) sul bus PCI

            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

Descrizione ciclo per ciclo di una transazione di lettura (read) del bus PCI

Transazione di una scrittura (write) sul bus PCI

             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

Descrizione ciclo per ciclo di una transazione in scrittura

Note

  1. ^ PCI (Peripheral Component Interconnect), su tech-faq.com. URL consultato il 1º marzo 2016.

Bibliografia

Altri progetti

Controllo di autoritàLCCN (ENsh2001003078 · BNF (FRcb13556158h (data) · J9U (ENHE987007534930405171
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica