# Peripheral Component Interconnect

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

* 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
### 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
### Pin di sistema

* CLK: il clock è il riferimento temporale per tutti i trasferimenti del bus PCI. Tutti i segnali PCI ad eccezione di reset e interrupts sono campionati sul fronte ascendente del segnale di CLK. Tutte le specifiche riguardo alle tempistiche sono definite in relazione al fronte ascendente. Come già fatto notare il clock del bus PCI, di base, funziona a 33 MHz. Per la versione 2.1 del bus PCI il clock è passato a 66 MHz. Le schede da alloggiare negli slot PCI rendono noto se possono funzionare a 66 MHz attraverso il segnale M66EN. Se un sistema è in grado di supportare un bus PCI esclusivamente a 33 MHz allora una scheda che funzioni a 66 MHz deve essere in grado di operare a una frequenza minore. La frequenza minima del segnale di CLK è settata a 0 Hz permettendo al CLK di essere sospeso per scopi di risparmio di potenza.
* RST#: è il segnale di reset (attivo basso), usato all'accensione del sistema per innescare un reset hardware di un dispositivo PCI. Il reset agisce sui registri di configurazione, di stato e i segnali di output vengono riportati al loro stato iniziale. Il segnale di RST# è asincrono rispetto al segnale di CLK. Rimane attivo per un tempo minimo di 100 us dopo che il clock diventa stabile.

### Pin di indirizzi e dati

* AD[31:0]: gli indirizzi e i dati sono multiplexati su questi pin. I pin AD[31:0] trasferiscono indirizzi fisici a 32 bit durante la addres phase e trasferiscono 32 bit di dati durante la data phase. Un'address phase inizia col fronte del clock seguendo una transizione alto basso del segnale di FRAME#. Una data phase inizia quando sia IRDY# e TRDY# sono impostati a bassi. Il target guida TRDY# basso quando è in grado di accettare dati in scrittura. Quando sia IRDY# che TRDYB# sono bassi, il target cattura i dati in scrittura e la transazione è completata. Per transazioni in lettura è l'opposto. Il target porta TRDY# basso quando dei dati validi vengono portati sui pin AD[31:0] e l'initiator imposta IRDY# basso quando è capace di accettare dei dati. Quando sia IRDY# che TRDY# sono bassi l'initiator cattura i dati e la transazione è completata. Il bit 31 è il più significativo dei bit di AD e conseguentemente il bit 0 è il bit meno significativo.
* C/BE[3:0]#: sono multiplexati su questi pin i bus command e i byte enables (identificatori del byte trasmesso). Durante un'address phase questi segnali trasportano dei bus command che definiscono il tipo di trasferimento che sarà effettuato. Nella tabella seguente c'è una lista di codici di bus command validi. Durante una data phase questi segnali portano informazioni riguardanti il byte enable (quale byte dei dati si sta trasmettendo). Il segnale C/BE[3]# si riferisce al byte più significativo (AD[31:24]) mentre C/BE[0]# si riferisce al byte meno significativo (AD[7:0]). I segnali C/BE[3:0] sono comandati esclusivamente dall'initiator e sono attivi durante tutte le address phase e le data phase.
* PAR: la parità si applica ai segnali di AD[31:0] C/BE[3:0]# e PAR. Parità significa che c'è un numero pari di 1 tra i segnali di AD[31:0] C/BE[3:0]# e PAR. Il segnale di PAR ha la stessa tempistica dei segnali AD[31:0], ma è ritardato di un ciclo per concedere più tempo per calcolare la parità.

### Pin di controllo del dispositivo (interfaccia)

* FRAME#: il cycle frame è portato a basso dall'initiator per segnalare l'inizio di una nuova transazione. La fase di indirizzo inizia durante il primo ciclo di clock utile dopo la transizione alto basso del segnale FRAME#. Se l'initiator intende cominciare una transazione con una sola fase dati porterà di nuovo ad alto il segnale FRAME# dopo un solo ciclo di clock. Se ci saranno più data phase l'initiator manterrà il segnale FRAME# basso fino all'ultima data phase. Se il termine di una transazione è attuato da un dispositivo master il segnale FRAME# è portato ad alto durante l'ultima fase dati, se invece il termine di una transazione è comandato da un target (slave) allora l'initiator continua a mantenere basso il segnale FRAME# fino alla fine della transazione.
* IRDY#: il segnale di initiator ready è portato a basso dall'initiator come un'indicazione che è pronto a completare la fase dati corrente della transazione. Durante le fasi di scrittura indica che l'initiator ha inviato dei dati validi sui pin AD[31:0]. Durante le letture indica che l'initiator è pronto ad accettare dati dai pin AD[31:0]. Una volta asserito l'initiator mantiene IRDY# basso finché TRDY# non è deasserito per completare il trasferimento, oppure il target usa il segnale di STOP# per terminare senza portare avanti la data phase. IRDY# permette all'initiator di inserire periodi di attesa (wait states) se necessario per rallentare il trasferimento dati.
* TRDY#: il segnale di target ready è deasserito dal target come indicazione che è in grado di completare la fase dati corrente della transazione. Durante le scritture indica che il target è pronto ad accettare dati sui pin AD[31:0]. Durante le letture indica che il target ha disposto dei dati validi sui pin AD[31:0]. Una volta asserito, il target mantiene TRDY# basso fino a che IRDY# non diventa basso per completare il trasferimento. TRDY# permette al target di inserire periodi di pausa (wait states) se necessario per rallentare il trasferimento dati.
* STOP#: il segnale di STOP# è portato a basso dal target per richiedere all'initiator di terminare la transazione in corso. Nell'eventualità che il target abbia bisogno di un lungo periodo di tempo per rispondere alla transazione può usare il segnale di STOP# per sospendere la transazione affinché il bus possa essere usato per altre transazioni nel frattempo. Quando il target termina una transazione senza nessuna data phase si dice che si è fatto un retry. Se una o più data phases sono completate prima che il target termini la transazione si dice che si è attuato un disconnect. I retry o disconnect segnalano all'initiator che deve ritornare in seguito per tentare di portare a termine la transazione di nuovo. Nell'eventualità di un fatal error come ad esempio un problema hardware il target può usare STOP# e DEVSEL# per segnalare una terminazione anormale del trasferimento sul bus chiamata target abort. L'initiator può usare il target abort per segnalare al software di sistema che è stato identificato un fatal error.
* LOCK#: il segnale di lock può essere asserito da un initiator per richiedere un accesso esclusivo per attuare transazioni multiple con un target. Previene che altri initiator modifichino gli indirizzi sotto lock affinché l'initiator che ha asserito il lock possa terminare la propria transazione. Solo una specifica regione di 16 byte minimo degli indirizzi del target è sotto lock per un accesso esclusivo. Mentre il LOCK# è asserito altre transazioni non esclusive possono procedere con indirizzi che attualmente non sono sotto lock, ma ogni accesso non esclusivo allo spazio degli indirizzi sotto lock del target verrà rifiutato attraverso un'operazione di retry. Il segnale di LOCK# è pensato per essere usato da dispositivi ponte (ad esempio ASICs?) per prevenire deadlocks (molti processi sono in attesa di altri processi, nessuno finisce il proprio lavoro per mancanza di informazioni che devono arrivare dagli altri processi e si è in una situazione di stallo).
* IDSEL: il segnale di initialization device select è usato come un selettore di chip durante le transazioni di lettura e scrittura della configurazione del PCI. IDSEL è asserito dal sistema PCI ed è unico per ogni slot PCI. Questo permette al meccanismo di configurazione del PCI di individuare l'indirizzo di ogni dispositivo PCI del sistema. Un dispositivo PCI è selezionato da un ciclo di configurazione solo se IDSEL è alto, AD[1:0] sono “00” (indicando un ciclo di configurazione di tipo 0) e il comando presente sui segnali C/BE[3:0]# durante la address phase è o un “configuration read” o un “configuration write”. I segnali AD[10:8] possono essere usati per selezionare da 1 fino a 8 funzioni dentro al dispositivo PCI. I segnali AD[7:2] selezionano specifiche configurazioni di registri dentro a funzioni e dispositivi.
* DEVSEL#: il segnale device select è asserito ad attivo basso dal target PCI quando rileva il suo indirizzo nel bus PCI. DEVSEL# può essere asserito una, due o tre volte successivamente la fase di indirizzo. DEVSEL# deve essere attivato con priorità quando, al fronte del clock, il segnale TRDY# è attivato. Una volta attivato DEVSEL# non può essere disattivato finché l'ultima fase dati non è completata o il target effettua un target (slave) abort. Se l'inititator non riceve un DEVSEL# attivo termina la transazione nel senso di master abort.

### Pin di arbitraggio (relativi solo all'initiator)

* REQ#: il segnale di request è usato da un dispositivo PCI per richiedere l'uso del bus. Ogni dispositivo PCI ha il suo unico segnale REQ#. L'arbitro nel sistema PCI riceve i segnali di REQ#da ogni dispositivo. È importante che questo segnale sia sotto le condizioni del tri-state mentre il segnale RST# è asserito per prevenire un blocco del sistema. Questo segnale è implementato solo nei dispositivi capaci di essere initiator.
* GNT#: il segnale di grant indica che una richiesta di un dispositivo PCI di usare il bus è stata garantita. Ogni dispositivo PCI ha il suo unico segnale di GNT# dall'arbitro del sistema PCI. Se un segnale di GNT# è attivo durante un ciclo di clock allora il dispositivo può cominciare una transazione nel ciclo di clock seguente impostando il segnale FRAME#. Questo segnale è implementato solo nei dispositivi capaci di essere initiator.

### Pin di segnalazione errori

* PERR#: il segnale di parity error è usato per riportare errori di parità sui dati durante tutte le transazioni PCI ad eccezione dei “cicli speciali”. PERR# è deasserito due periodi di clock dopo la data phase contenente errori di parità. È deasserito per un minimo di un ciclo di clock. PERR# è condiviso fra tutti i dispositivi PCI ed è controllato da un tri-state driver. Una resistenza di pull-up assicura che il segnale sia mantenuto in uno stato inattivo quando nessun dispositivo lo sta usando. Dopo essere stato deasserito PERR# deve essere riportato alto un ciclo di clock prima che sia asserito attraverso un tri-state per ripristinare il segnale al suo stato inattivo. Questo assicura che il segnale non rimanga basso nel ciclo seguente per una salita del fronte lenta causata dal pull-up.
* SERR#: il segnale di system error serve a riportare errori di parità, errori sui dati durante uno Special Cycle o altri errori fatali del sistema. SERR# è condiviso fra tutti i dispositivi PCI ed è asserito solo come un segnale open drain (è deasserito o con tri-state da un dispositivo PCI, ma mai asserito alto). È attivato in sincronismo con il CLK, ma quando rilasciato si riporterà alto in maniera asincrona attraverso una resistenza di pull-up.

### Pin di interrupt

* INTA#, INTB#, INTC#, INTD#: i segnali di interrupt sono impostati a bassi dai dispositivi PCI per richiedere attenzione dai loro relativi driver software. Sono pin definiti “level sensitive” e sono impostati bassi come segnali open drain. Una volta impostati i segnali INTx# continueranno ad essere mantenuti dai dispositivi PCI finché il driver software del relativo dispositivo PCI non soddisfi la richiesta pendente. Un dispositivo PCI che contenga solo una funzione dovrebbe usare solo INTA#. Dispositivi multifunzione (ad esempio schede che funzionano sia per collegamento a una LAN sia da modem) possono usare linee multiple INTx#. Un dispositivo con un'unica funzione usa INTA#, uno con due funzioni usa INTA# e INTB# e così via. Tutti i driver dei dispositivi PCI devono essere capaci di condividere un livello di interrupt con altri dispositivi attraverso la vettorizzazione degli 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.
* SBO#: il segnale di snoop backoff indica un hit a una linea modificata quando asserito. Quando SBO# è deasserito e SDONE è asserito indica un risultato di ricerca "CLEAN".
* SDONE: il segnale snoop done indica lo stato di una ricerca per l'accesso corrente. Quando deasserito, indica il risultato di una ricerca che è ancora pendente. Quando asserito indica che la ricerca è completata.

### Pin addizionali

* PRSNT[1:2]#: i segnali present sono usati per due scopi:
** 1 – per indicare che una scheda è fisicamente presente
** 2 – per indicare la richiesta di potenza da parte di una scheda.
Questi segnali sono statici che vengono riferiti a terra o lasciati scollegati sulla scheda. Nella tabella seguente sono riportati i codici dei vari segnali.
* CLKRUN#: il segnale di clock running è opzionale e usato per facilitare lo stop del segnale di CLK per risparmio di potenza. CLKRUN# è inteso per ambienti tipo laptop in cui il consumo di potenza è critico. Non è definito nel connettore PCI usato per normali schede. CLKRUN# è guidato come un segnale open drain. Il sistema PCI imposta CLKRUN# basso quando sta propagando un segnale CLK normale. Rilascia CLKRUN# affinché possa flottare ad un livello alto attraverso una resistenza di pull-up come richiesta di fermare il CLK per una dispositivo PCI specifico. Il dispositivo può in seguito impostare CLKRUN# a basso per indicare al sistema che dovrebbe continuare a guidare il CLK, o consentire a CLKRUN# di rimanere alto come conferma che CLK può essere fermato. Se CLK è stato fermato e un dispositivo PCI vuole ripristinare le normali operazioni imposta CLKRUN# basso come una richiesta che il sistema dovrebbe ricominciare a fornire CLK di nuovo.
* M66EN: il segnale di 66 MHz Enable è lasciato aperto o disconnesso su schede che supportano operazioni con CLK a 66 MHz e riferito a terra su schede che supportano operazioni con un CLK solo a 33 MHz. Sistemi a 66 MHz dispongono di una resistenza di pull-up su questo segnale per rilevare se la scheda è capace di funzionare a 66 MHz. Se il segnale è alto è fornito un CLK con massima frequenza di 66 MHz, se è basso è fornito un CLK con frequenza massima di 33 MHz. Sistemi a 33 MHz attaccano questo segnale alla terra. Operazioni a 66 MHz avranno luogo solo se sia il sistema che la scheda supportano questa frequenza.

## Esempi di diagrammi temporali del bus PCI
### Descrizione ciclo per ciclo di una transazione di lettura (read) del bus PCI

* Ciclo 1: il bus è nello stato di idle (non passa nessuna informazione).
* Ciclo 2: l'initiator asserisce un indirizzo valido e dispone un comando di lettura sui segnali C/BE#, questa è la address phase.
* Ciclo 3: l'initiator mette in condizione di tri-state l'indirizzo in modo che il target possa cominciare a fornire i dati da leggere. L'initiator adesso imposta valide informazioni di byte enables (abilitazione dei vari byte di dati trasmessi) sui segnali C/BE#. L'initiator asserisce IRDY# basso per indicare che è pronto a catturare dati in lettura. Il target asserisce DEVSEL# basso (in questo ciclo o nel prossimo) come acknowledgment (riconoscimento di operazione completata) che ha positivamente decodificato l'indirizzo. Il target porta TRDY# alto per indicare che non sta ancora fornendo dati validi in lettura.
* Ciclo 4: il target fornisce dei dati validi e asserisce TRDY# basso per indicare all'initiator che i dati sono validi. IRDY# e TRDY# sono tutti e due bassi durante questo ciclo, questo comporta che il trasferimento di dati abbia luogo. L'initiator cattura i dati. Questa è la prima data phase.
* Ciclo 5: il target deasserisce TRDY#alto per indicare che necessita di più tempo per preparare il prossimo trasferimento di dati.
* Ciclo 6: la seconda data phase avviene quando sia IRDY# che TRDY# sono bassi. L'initiator cattura i dati forniti dal target.
* Ciclo 7: il target provvede a fornire dei dati validi per la terza data phase, ma l'initiator indica che non è pronto deasserendo IRDY# alto.
* Ciclo 8: l'initiator riasserisce IRDY# basso per completare la terza data phase. L'initiator cattura i dati forniti dal target. L'initiator porta FRAME# ad alto indicando che è l'ultima data phase (master termination).
* Ciclo 9: FRAME#, AD e C/BE# sono in modalità tri-state, mentre IRDY# TRDY# e DEVSEL# sono portati ad inattivi alti per un ciclo precedente prima di essere messi in modalità tri-state.

### Descrizione ciclo per ciclo di una transazione in scrittura

* Ciclo 1: il bus è nello stato di idle (non passa nessuna informazione).
* Ciclo 2: l'initiator asserisce un indirizzo valido e dispone un comando di scrittura sui segnali C/BE#, questa è la address phase.
* Ciclo 3: l'initiator dispone dati validi da scrivere e i segnali di byte enable (C/BE#). L'initiator asserisce IRDY# basso per indicare che dati validi da scrivere sono disponibili. Il target asserisce DEVSEL# basso come acknowledgment (riconoscimento di operazione completata) per aver positivamente decodificato l'indirizzo (il target non può asserire TRDY# prima di DEVSEL#). Il target porta TRDY# basso per indicare che è pronto a catturare i dati. La prima data phase avviene quando sia IRDY# che TRDY# sono bassi. Il target cattura i dati in scrittura.
* Ciclo 4: l'initiator fornisce nuovi dati e byte enables (C/BE#). La seconda data phase avviene quando sia IRDY# che TRDY# sono bassi. Il target cattura i dati in scrittura.
* Ciclo 5: l'initiator deasserisce IRDY# indicando che non è pronto a fornire i prossimi dati. Il target deasserisce TRDY# per indicare che non è ancora pronto a catturare i dati.
* Ciclo 6: l'initiator fornisce i prossimi dati validi e asserisce IRDY# basso. L'initiator porta FRAME# alto indicando che è la data phase finale (master termination). Il target non è ancora pronto e mantiene TRDY# alto.
* Ciclo 7: il target non è ancora pronto e mantiene TRDY# alto.
* Ciclo 8: il target diventa pronto e asserisce TRDY# basso. La terza data phase comincia non appena sia IRDY# che TRDY# sono bassi. Il target cattura i dati in scrittura.
* Ciclo 9: FRAME#, AD e C/BE# sono settati in modalità tri-state, mentre IRDY#, TRDY# e DEVSEL# sono portati a inattivi alti per un ciclo precedente ad essere messi in modalità tri-state.