PCI 버스

PCI 버스()는 컴퓨터에 하드웨어 장치를 연결하기 위한 로컬 버스이며, PCI 로컬 버스 표준의 일부이다. PCI 버스는 프로세서 버스에서 볼 수 있는 기능을 지원하지만, 특정 프로세서의 기본 버스와는 독립적인 표준화된 형식으로 제공된다. PCI 버스에 연결된 장치는 버스 마스터에게는 자신의 버스에 직접 연결된 것처럼 보이며, 프로세서의 주소 공간에 주소가 할당된다. 이는 단일 버스 클럭에 동기화된 병렬 버스이다.
연결된 장치는 메인보드에 장착된 집적 회로 (PCI 사양에서는 플래너 장치라고 함) 또는 슬롯에 맞는 확장 카드의 형태를 가질 수 있다. PCI 로컬 버스는 IBM PC 호환기종에서 처음 구현되었으며, 여기서는 여러 개의 느린 ISA 슬롯과 하나의 빠른 VLB 슬롯의 조합을 버스 구성으로 대체했다. 이후 다른 컴퓨터 유형에도 채택되었다. PC에서 사용되는 일반적인 PCI 카드에는 네트워크 카드, 사운드 카드, 모뎀, USB 또는 직렬과 같은 추가 포트, TV 수신 카드 및 하드 디스크 드라이브 호스트 어댑터가 포함된다. PCI 비디오 카드는 대역폭 요구 사항이 PCI의 능력을 초과할 때까지 ISA 및 VLB 카드를 대체했다. 비디오 카드의 선호 인터페이스는 이후 PCI 익스프레스에 자리를 내주기 전까지 PCI의 상위 집합인 AGP가 되었다.

소매 데스크톱 컴퓨터에서 발견된 PCI의 첫 번째 버전은 버스 클럭과 신호 방식을 사용하는 32비트 버스였다. 비록 PCI 1.0 표준은 64비트 변형도 제공했지만 말이다. 이들은 카드에 하나의 위치 노치가 있다. PCI 표준 버전 2.0은 3.3 V 슬롯을 도입했는데, 이는 5 V 카드의 우발적인 삽입을 방지하기 위해 뒤집힌 물리적 커넥터로 물리적으로 구별된다. 두 전압 모두에서 작동할 수 있는 범용 카드에는 두 개의 노치가 있다. PCI 표준 버전 2.1은 선택적 66 MHz 작동을 도입했다. 서버 지향 PCI 변형인 PCI-X는 PCI-X 1.0의 경우 최대 133 MHz, PCI-X 2.0의 경우 최대 533 MHz 주파수에서 작동했다. 노트북 카드용 내부 커넥터인 Mini PCI는 PCI 사양 버전 2.2에서 도입되었다. PCI 버스는 외부 노트북 커넥터 표준인 CardBus에도 채택되었다. 첫 번째 PCI 사양은 인텔이 개발했지만, 이후 표준 개발은 PCI-SIG의 책임이 되었다.

PCI와 PCI-X는 때때로 직렬, 레인 기반 아키텍처를 채택한 최신 후속 제품인 PCI 익스프레스와 기술적으로 구별하기 위해 병렬 PCI 또는 기존 PCI로 지칭되기도 한다. 데스크톱 컴퓨터 시장에서 PCI의 전성기는 대략 1995년부터 2005년까지였다. PCI와 PCI-X는 2013년 이후 대부분의 목적에서 구식화되어 많은 다른 최신 메인보드에서 사라졌지만, 하위 호환성 및 상대적으로 저렴한 생산 비용 때문에 일부 최신 데스크톱에서는 여전히 흔하게 사용된다. 병렬 PCI의 또 다른 일반적인 최신 응용 분야는 산업용 PC이며, 여기서는 일부 ISA 카드와 마찬가지로 많은 특수 확장 카드가 PCI 익스프레스로 전환되지 않았다. 이전에는 PCI 확장 카드로만 사용할 수 있었던 많은 종류의 장치들이 이제는 메인보드에 통합되거나 USB 및 PCI 익스프레스 버전으로 제공된다.

 역사 
섬네일|일반적인 32비트, 5 V 전용 PCI 카드 (이 경우 아답텍의 SCSI 어댑터)
섬네일|2개의 32비트 PCI 슬롯과 2가지 크기의 PCI 익스프레스 슬롯이 있는 메인보드

PCI에 대한 작업은 인텔 아키텍처 연구소(IAL, Architecture Development Lab)에서 에 시작되었다. 주로 IAL 엔지니어들로 구성된 팀이 아키텍처를 정의하고 회사의 데스크톱 PC 시스템 및 코어 로직 제품 조직의 팀과 협력하여 개념 증명 칩셋 및 플랫폼(새턴)을 개발했다.

PCI는 즉시 서버에 사용되어 MCA 및 EISA를 대체하여 선호되는 서버 확장 버스가 되었다. 주류 PC에서 PCI는 VLB를 대체하는 데 더뎠고, 2세대 펜티엄 PC에서 1994년 후반까지는 크게 시장에 침투하지 못했다. 1996년까지 VLB는 거의 사라졌고, 제조업체들은 인텔 80486 (486) 컴퓨터에도 PCI를 채택했다. EISA는 2000년까지 PCI와 함께 계속 사용되었다. 애플 컴퓨터는 1995년 중반에 전문가용 파워 매킨토시 컴퓨터(이전의 뉴버스 대체)에 PCI를 채택했으며, 1996년 중반에는 소비자용 퍼포마 제품군(이전의 LC PDS 대체)에 채택했다.

서버 시장을 제외하고 일반 PCI의 64비트 버전은 실제로 드물게 남아 있었다. 예를 들어 모든 (아이맥 이후) G3 및 G4 파워 매킨토시 컴퓨터에서 사용되었다.

PCI의 후속 개정판은 66 MHz 3.3 V 표준 및 133 MHz PCI-X를 포함한 새로운 기능과 성능 개선 사항을 추가했으며, PCI 신호를 다른 폼 팩터에 적용했다. PCI-X 1.0b와 PCI-X 2.0은 일부 PCI 표준과 하위 호환된다. 이러한 개정판은 서버 하드웨어에 사용되었지만, 소비자 PC 하드웨어는 거의 모든 것이 32비트, 33 MHz 및 5볼트로 유지되었다.

PCI-SIG는 에 직렬 PCI 익스프레스를 도입했다. 그 이후로 메인보드 제조업체는 점차 새로운 표준을 선호하여 PCI 슬롯을 줄이거나 제거했다. 브리지 어댑터를 사용하면 레거시 PCI 카드를 PCI 익스프레스 메인보드에서 사용할 수 있다.

 자동 구성 
PCI는 x86 프로세서 제품군을 위해 각각 64 및 32비트 크기의 별도의 메모리 및 메모리 맵 I/O 포트 주소 공간을 제공한다. 이들 주소 공간의 주소는 소프트웨어에 의해 할당된다. PCI 구성 공간이라고 불리는 세 번째 주소 공간은 고정 주소 지정 체계를 사용하며, 소프트웨어가 각 장치에 필요한 메모리 및 I/O 주소 공간의 양을 결정할 수 있도록 한다. 각 장치는 구성 공간 레지스터를 통해 최대 6개의 메모리 공간 또는 I/O 포트 공간을 요청할 수 있다.

일반적인 시스템에서 펌웨어 (또는 운영체제)는 부팅 시 모든 PCI 버스를 조회하여 (PCI 구성 공간을 통해) 어떤 장치가 존재하며 각 장치가 어떤 시스템 자원(메모리 공간, I/O 공간, 인터럽트 라인 등)을 필요로 하는지 파악한다. 그런 다음 자원을 할당하고 각 장치에 할당량을 알려준다.

PCI 구성 공간은 또한 소량의 장치 유형 정보를 포함하고 있어 운영체제가 해당 장치에 대한 장치 드라이버를 선택하거나 최소한 시스템 구성에 대해 사용자와 대화할 수 있도록 돕는다.

장치에는 x86 또는 PA-RISC 프로세서용 실행 코드, 오픈 펌웨어 드라이버 또는 Option ROM이 포함된 온보드 ROM이 있을 수 있다. 이들은 일반적으로 운영체제가 장치 드라이버를 로드하기 전, 시스템 시작 중에 사용되는 장치에 필요하다.

또한, PCI 지연 타이머는 PCI 버스 마스터링 장치가 PCI 버스를 공정하게 공유하기 위한 메커니즘이다. 여기서 "공정"이란 장치가 사용 가능한 PCI 버스 대역폭의 너무 많은 부분을 사용하지 않아 다른 장치가 필요한 작업을 수행할 수 없도록 하는 것을 의미한다. 이는 PCI 익스프레스에는 적용되지 않는다.

 인터럽트 
장치는 인터럽트 요청(IRQ) 라인을 공유할 수 있도록 프로토콜을 따라야 한다. PCI 버스에는 INTA#부터 INTD#까지 4개의 인터럽트 라인이 있으며, 이들 모두 각 장치에서 사용할 수 있다. APIC가 활성화된 x86 시스템에서는 최대 8개의 PCI 장치가 동일한 IRQ 라인(INTINA#부터 INTINH#까지)을 공유한다. 인터럽트 라인은 다른 PCI 버스 라인처럼 병렬로 연결되지 않는다. 인터럽트 라인의 위치는 슬롯 간에 회전하므로, 한 장치에는 INTA# 라인으로 보이는 것이 다음 장치에는 INTB#가 되고 그 다음 장치에는 INTC#가 된다. 단일 기능 장치는 일반적으로 인터럽트 신호에 INTA#를 사용하므로, 장치 부하가 사용 가능한 4개의 인터럽트 라인에 비교적 고르게 분산된다. 이는 인터럽트 공유의 일반적인 문제를 완화한다.

PCI 인터럽트 라인이 PCI 호스트 브리지를 통해 시스템 인터럽트 라인에 매핑되는 방식은 구현에 따라 다르다. 플랫폼별 펌웨어 또는 운영체제 코드는 이를 알고 각 장치의 구성 공간에 "인터럽트 라인" 필드를 설정하여 어떤 IRQ에 연결되어 있는지 나타내도록 되어 있다.

PCI 인터럽트 라인은 레벨 트리거 방식이다. 이는 공유 인터럽트 라인을 서비스할 때 이점을 얻고 견고성을 위해 에지 트리거 방식보다 선택되었다. 에지 트리거 인터럽트는 놓치기 쉽기 때문이다.

PCI 사양의 후속 개정판은 메시지 시그널 인터럽트에 대한 지원을 추가했다. 이 시스템에서 장치는 전용 라인을 주장하는 대신 메모리 쓰기를 수행하여 서비스가 필요함을 신호한다. 이는 인터럽트 라인의 부족 문제를 완화한다. 인터럽트 벡터가 여전히 공유되더라도 레벨 트리거 인터럽트의 공유 문제로 고통받지 않는다. 또한 메모리 쓰기가 장치와 호스트 간에 예측할 수 없게 수정되지 않기 때문에 라우팅 문제도 해결한다. 마지막으로, 메시지 신호가 대역 내에 있기 때문에 포스트된 쓰기 및 대역 외 인터럽트 라인에서 발생할 수 있는 일부 동기화 문제를 해결한다.

PCI 익스프레스는 물리적 인터럽트 라인이 전혀 없다. 메시지 시그널 인터럽트만 독점적으로 사용한다.

 일반적인 하드웨어 사양 
섬네일|upright=1.5|32비트 및 64비트 PCI 카드의 다양한 키 위치를 보여주는 다이어그램

이러한 사양은 일반 PC에서 사용되는 PCI의 가장 일반적인 버전을 나타낸다.
 클럭과 동기식 전송
 32비트 버스 폭에서 133 MB/s (초당 133 메가바이트)의 최대 전송 속도 (33.33 MHz × 32 비트 ÷ 8 비트/바이트 = 133 MB/s)
 32비트 버스 폭
 32 또는 64비트 메모리 주소 공간 (GiB 4개 또는 EiB 16개)
 32비트 I/O 포트 공간
 256-바이트 (장치당) 구성 공간
 5볼트 신호 방식
 반사파 스위칭

PCI 사양은 또한 3.3 V 신호 방식, 64비트 버스 폭, 66 MHz 클럭킹 옵션을 제공하지만, 이는 서버 메인보드의 PCI-X 지원 외에는 흔히 볼 수 없다.

PCI 버스 중재자는 PCI 버스의 여러 마스터 간에 버스 중재를 수행한다. PCI 버스에는 원하는 수의 버스 마스터가 상주할 수 있으며, 버스 요청도 가능하다. 각 버스 마스터에게는 한 쌍의 요청 및 승인 신호가 전용으로 할당된다.

 카드 전압 및 키잉 
섬네일|5 V 및 3.3 V 지원 노치가 모두 있는 PCI-X 기가비트 이더넷 확장 카드, B면이 카메라를 향함

일반적인 PCI 카드는 신호 전압에 따라 하나 또는 두 개의 키 노치를 가지고 있다. 3.3 볼트를 요구하는 카드는 카드 백플레이트에서 56.21 mm 떨어진 곳에 노치가 있고, 5 볼트를 요구하는 카드는 백플레이트에서 104.41 mm 떨어진 곳에 노치가 있다. 이를 통해 카드는 지원하는 전압의 슬롯에만 장착할 수 있다. 두 전압 모두를 지원하는 "범용 카드"는 두 개의 키 노치를 모두 가지고 있다.

 커넥터 핀 배열 
PCI 커넥터는 에지 커넥터의 각 측면에 62개의 접점을 가지도록 정의되어 있지만, 그 중 2개 또는 4개는 키 노치로 대체되므로 카드에는 각 측면에 60개 또는 58개의 접점이 있다. A면은 '솔더 면'을, B면은 '부품 면'을 의미한다. 커넥터가 아래를 향하도록 카드를 잡았을 때, A면은 백플레이트가 오른쪽에 있고, B면은 백플레이트가 왼쪽에 있다. B면과 A면의 핀 배열은 메인보드 커넥터를 아래로 내려다본 상태에서 다음과 같다 (핀 A1과 B1이 백플레이트에 가장 가깝다).

64비트 PCI는 각 측면에 추가 32개의 접점을 통해 AD[63:32], C/BE[7:4]#, PAR64 패리티 신호 및 여러 개의 추가 전원 및 접지 핀을 제공하여 확장된다.

대부분의 라인은 각 슬롯에 병렬로 연결된다. 예외는 다음과 같다.
 각 슬롯에는 메인보드 중재자에게 보내는 자체 REQ# 출력과 중재자로부터 받는 GNT# 입력이 있다.
 각 슬롯에는 자체 IDSEL 라인이 있으며, 일반적으로 특정 AD 라인에 연결된다.
 TDO는 다음 슬롯의 TDI에 데이지 체인 방식으로 연결된다. JTAG를 지원하지 않는 카드는 체인을 끊지 않도록 TDI를 TDO에 연결해야 한다.
 각 슬롯의 PRSNT1# 및 PRSNT2#는 메인보드에 자체 풀업 저항기가 있다. 메인보드는 PCI 카드의 존재 및 전력 요구 사항을 확인하기 위해 이 핀들을 감지할 수 있다 (필수는 아님).
 REQ64# 및 ACK64#는 32비트 전용 슬롯에서 개별적으로 풀업된다.
 INTA#부터 INTD#까지의 인터럽트 핀은 모든 슬롯에 다른 순서로 연결된다. (한 슬롯의 INTA#는 다음 슬롯의 INTB#, 그 다음 슬롯의 INTC#이다.)

참고:
 IOPWR은 백플레인에 따라 +3.3 V 또는 +5 V이다. 슬롯에는 해당 전압 표준 지원을 나타내는 해당 키 노치가 없는 카드를 삽입하지 못하도록 두 위치 중 한 곳에 릿지(ridge)가 있다. 범용 카드는 두 개의 키 노치를 모두 가지며 IOPWR을 사용하여 I/O 신호 레벨을 결정한다.
 PCI SIG는 3.3 V PCI 신호 사용을 강력히 권장하며, 표준 개정 2.3부터는 이를 지원해야 하지만, 대부분의 PC 메인보드는 5 V 변형을 사용한다. 따라서 현재 사용 가능한 많은 PCI 카드가 둘 다 지원하고 이를 나타내는 두 개의 키 노치를 가지고 있지만, 시장에는 여전히 5 V 전용 카드가 많이 있다.
 M66EN 핀은 대부분의 PC 메인보드에서 발견되는 5 V PCI 버스의 추가 접지이다. 66 MHz 작동을 지원하지 않는 카드와 메인보드도 이 핀을 접지한다. 모든 참가자가 66 MHz 작동을 지원하는 경우, 메인보드의 풀업 저항기가 이 신호를 높게 올려 66 MHz 작동이 활성화된다. 이 핀은 결합 커패시터를 통해 각 카드의 접지에 연결되어 AC 차폐 기능을 유지한다.
 PCIXCAP 핀은 PCI 버스와 카드의 추가 접지이다. 모든 카드와 메인보드가 PCI-X 프로토콜을 지원하는 경우, 메인보드의 풀업 저항기가 이 신호를 높게 올려 PCI-X 작동이 활성화된다. 이 핀은 여전히 각 카드의 결합 커패시터를 통해 접지에 연결되어 AC 차폐 기능을 유지한다.
 PRSNT1# 및 PRSNT2# 중 적어도 하나는 카드에 의해 접지되어야 한다. 선택된 조합은 카드의 총 전력 요구 사항 (25 W, 15 W 또는 7.5 W)을 나타낸다.
 SBO# 및 SDONE은 캐시 컨트롤러에서 현재 대상으로 보내는 신호이다. 이들은 개시자 출력이 아니지만, 대상 입력이므로 그렇게 색상이 지정되어 있다.
 PME# () 전원 관리 이벤트(선택 사항)는 PCI 이상에서 지원된다. 이는 , 오픈 드레인, 활성 로우 신호이다. PCI 카드는 이 신호를 사용하여 PCI 소켓을 통해 PME를 직접 송수신할 수 있으므로, 특수 Wake-on-LAN 케이블이 필요 없어진다.

 다른 폭의 슬롯에 32비트 및 64비트 PCI 카드 혼합 
섬네일|32비트 PCI 슬롯에 부분적으로 삽입된 PCI-X 카드. 가장 오른쪽 노치의 필요성과 하위 호환성을 유지하기 위한 메인보드의 추가 공간을 보여준다.
섬네일|32비트 PCI 슬롯에서 작동하는 64비트 SCSI 카드
대부분의 32비트 PCI 카드는 64비트 PCI-X 슬롯에서 제대로 작동하지만, 버스 클럭 속도는 가장 느린 카드의 클럭 주파수로 제한된다. 이는 PCI의 공유 버스 토폴로지의 본질적인 한계이다. 예를 들어, 133 MHz를 지원하는 PCI-X 버스에 PCI 2.3, 66-MHz 주변 장치가 설치되면 전체 버스 백플레인이 66 MHz로 제한된다. 이 제한을 해결하기 위해 많은 메인보드에는 두 개 이상의 PCI/PCI-X 버스가 있으며, 하나는 고속 PCI-X 주변 장치용이고 다른 하나는 범용 주변 장치용이다.

많은 64비트 PCI-X 카드는 더 짧은 32비트 커넥터에 삽입될 경우 32비트 모드에서 작동하도록 설계되어 있으며, 약간의 성능 손실이 있다. 이러한 예시로는 아답텍 29160 64비트 SCSI 인터페이스 카드가 있다. 하지만 일부 64비트 PCI-X 카드는 표준 32비트 PCI 슬롯에서 작동하지 않는다.

32비트 슬롯에 64비트 PCI-X 카드를 설치하면 카드 에지 커넥터의 64비트 부분이 연결되지 않고 돌출된다. 이 경우 메인보드 구성 요소가 카드 에지 커넥터의 돌출된 부분을 기계적으로 방해하지 않도록 배치되어야 한다.

 물리적 치수 
PCI 브래킷 높이:
 표준: 120.02 mm;
 로우 프로파일: 79.20 mm.

PCI 카드 길이 (표준 브래킷 & 3.3 V):
 짧은 카드: 169.52 mm;
 긴 카드: 313.78 mm.

PCI 카드 길이 (로우 프로파일 브래킷 & 3.3 V):
 MD1: 121.79 mm;
 MD2: 169.52 mm;
 MD3: 243.18 mm.

 Mini PCI 
섬네일|Mini PCI 슬롯
섬네일|Mini PCI Wi-Fi 카드 유형 IIIB
섬네일|PCI-MiniPCI 변환기 유형 III
섬네일|MiniPCI와 MiniPCI 익스프레스 카드 비교
Mini PCI는 랩톱과 일부 라우터에서 사용하기 위해 PCI 버전 2.2에 추가되었다. 이는 전원 연결(3.3 V 전용, 5 V는 100 mA로 제한됨)이 있는 32비트, 33 MHz 버스이며 버스 마스터링 및 DMA를 지원한다. Mini PCI 카드의 표준 크기는 풀 사이즈 카드 크기의 약 4분의 1이다. 브래킷에 커넥터가 있는 데스크톱 PCI 카드와 달리 케이스 외부에서 카드에 접근할 수 없다. 이는 Mini PCI 카드가 수행할 수 있는 기능의 종류를 제한한다.

Wi-Fi, 고속 이더넷, 블루투스, 모뎀(종종 윈모뎀), 사운드 카드, 암호 가속기, SCSI, IDE–ATA, SATA 컨트롤러 및 복합 카드와 같은 많은 Mini PCI 장치가 개발되었다. Mini PCI 카드는 Mini PCI-PCI 변환기를 사용하여 일반 PCI 장비와 함께 사용할 수 있다. Mini PCI는 훨씬 더 좁은 PCI 익스프레스 미니 카드로 대체되었다.

 Mini PCI의 기술적 세부 사항 
Mini PCI 카드는 최대 2 W의 전력 소비량을 가지며, 이 폼 팩터에서 구현할 수 있는 기능을 제한한다. 또한 전력 관리 목적으로 PCI 클럭을 시작하고 중지하는 데 사용되는 CLKRUN# PCI 신호를 지원해야 한다.

세 가지 카드 폼 팩터가 있다: 유형 I, 유형 II 및 유형 III 카드. 각 유형에 사용되는 카드 커넥터는 다음과 같다: 유형 I 및 II는 100핀 스태킹 커넥터를 사용하는 반면, 유형 III는 124핀 에지 커넥터를 사용한다. 즉, 유형 I 및 II의 커넥터는 SO-DIMM과 같이 카드의 가장자리에 커넥터가 있는 유형 III의 커넥터와 다르다. 추가 24핀은 시스템 커넥터(오디오, AC-링크, LAN, 전화선 인터페이스)를 통해 I/O를 라우팅하는 데 필요한 추가 신호를 제공한다. 유형 II 카드에는 RJ11 및 RJ45 마운트형 커넥터가 있다. 이 카드들은 RJ11 및 RJ45 포트를 외부에서 접근할 수 있도록 컴퓨터 또는 도킹 스테이션의 가장자리에 위치해야 한다.

Mini PCI는 144핀 마이크로 PCI와 다르다.

 PCI 버스 트랜잭션 
PCI 버스 트랜잭션은 일련의 PCI 버스 트랜잭션으로 구성된다. 각 트랜잭션은 주소 단계 다음에 하나 이상의 데이터 단계로 이루어진다. 데이터 단계의 방향은 개시자에서 대상(쓰기 트랜잭션)으로 또는 그 반대(읽기 트랜잭션)일 수 있지만, 모든 데이터 단계는 동일한 방향이어야 한다. 어느 한쪽이든 언제든지 데이터 단계를 일시 중지하거나 중지할 수 있다. (한 가지 일반적인 예는 버스트 트랜잭션을 지원하지 않는 저성능 PCI 장치이며, 항상 첫 번째 데이터 단계 이후 트랜잭션을 중지한다.)

모든 PCI 장치는 트랜잭션을 시작할 수 있다. 먼저, 메인보드에 있는 PCI 버스 중재자에게 허가를 요청해야 한다. 중재자는 요청하는 장치 중 하나에게 허가를 부여한다. 개시자는 32비트 주소와 4비트 명령 코드를 브로드캐스팅하여 주소 단계를 시작한 다음 대상이 응답할 때까지 기다린다. 다른 모든 장치는 이 주소를 검사하고 그 중 하나가 몇 사이클 후에 응답한다.

64비트 주소 지정은 두 단계 주소 단계를 사용하여 수행된다. 개시자는 특별한 "이중 주소 사이클" 명령 코드와 함께 낮은 32비트 주소를 브로드캐스팅한다. 64비트 주소 지정을 지원하지 않는 장치는 단순히 해당 명령 코드에 응답하지 않을 수 있다. 다음 사이클에서 개시자는 높은 32비트 주소와 실제 명령 코드를 전송한다. 트랜잭션은 그 시점부터 동일하게 작동한다. 32비트 PCI 장치와의 호환성을 보장하기 위해, 필요하지 않은 경우(즉, 상위 주소 비트가 모두 0인 경우) 이중 주소 사이클을 사용하는 것은 금지되어 있다.

PCI 버스는 데이터 단계당 32비트를 전송하지만, 개시자는 8비트 바이트 중 어떤 바이트를 유효한 것으로 간주할지 나타내는 4개의 활성-로우 바이트 활성화 신호를 전송한다. 특히, 쓰기는 대상 PCI 장치의 활성화된 바이트에만 영향을 미쳐야 한다. 메모리 읽기에는 중요성이 거의 없지만, I/O 읽기에는 부수 효과가 있을 수 있다. PCI 표준은 바이트가 활성화되지 않은 데이터 단계를 명시적으로 허용하며, 이는 아무런 작동도 하지 않는 것처럼 동작해야 한다.

일반적인 시스템에서 펌웨어 (또는 운영체제)는 시작 시 모든 PCI 버스를 조회하여 (PCI 구성 공간을 통해) 어떤 장치가 존재하며 각 장치가 어떤 시스템 자원(메모리 공간, I/O 공간, 인터럽트 라인 등)을 필요로 하는지 파악한다. 그런 다음 자원을 할당하고 각 장치에 할당량을 알려준다.

 PCI 주소 공간 
PCI에는 메모리, I/O 주소, 구성이라는 세 가지 주소 공간이 있다.

메모리 주소는 32비트(선택적으로 64비트) 크기이며, 캐싱을 지원하고 버스트 트랜잭션이 가능하다.

I/O 주소는 인텔 x86 아키텍처의 I/O 포트 주소 공간과의 호환성을 위한 것이다. PCI 버스 사양은 모든 주소 공간에서 버스트 트랜잭션을 허용하지만, 대부분의 장치는 메모리 주소에만 지원하고 I/O에는 지원하지 않는다.

마지막으로, PCI 구성 공간은 PCI 장치당 256바이트의 특수 구성 레지스터에 대한 접근을 제공한다. 각 PCI 슬롯에는 자체 구성 공간 주소 범위가 할당된다. 이 레지스터는 장치가 트랜잭션 개시자로부터 응답해야 하는 메모리 및 I/O 주소 범위를 구성하는 데 사용된다. 컴퓨터가 처음 켜지면 모든 PCI 장치는 구성 공간 접근에만 응답한다. 컴퓨터의 BIOS는 장치를 검색하고 메모리 및 I/O 주소 범위를 할당한다.

주소가 어떤 장치에도 주장되지 않으면, 트랜잭션 개시자의 주소 단계가 타임아웃되어 개시자가 작업을 중단하게 된다. 읽기의 경우, 이 경우 읽기 데이터 값으로 모든 1(0xFFFFFFFF)을 제공하는 것이 일반적이다. 따라서 PCI 장치는 일반적으로 중요한 상태 레지스터에서 모든 1의 값을 사용하는 것을 피하여 소프트웨어에서 이러한 오류를 쉽게 감지할 수 있도록 설계된다.

 PCI 명령 코드 

16개의 가능한 4비트 명령 코드가 있으며, 그 중 12개가 할당되어 있다. 고유한 이중 주소 사이클을 제외하고, 명령 코드의 최하위 비트는 다음 데이터 단계가 읽기(대상에서 개시자로 데이터 전송)인지 쓰기(개시자에서 대상으로 데이터 전송)인지를 나타낸다. PCI 대상은 주소뿐만 아니라 명령 코드도 검사해야 하며, 지원되지 않는 명령 코드를 지정하는 주소 단계에는 응답하지 않아야 한다.

캐시 라인을 참조하는 명령은 PCI 구성 공간 캐시 라인 크기 레지스터가 올바르게 설정되어 있는지 여부에 따라 달라지며, 설정될 때까지는 사용될 수 없다.

 0000 인터럽트 승인
 이는 인터럽트 컨트롤러에 암묵적으로 지정된 특수 형태의 읽기 사이클이며, 인터럽트 벡터를 반환한다. 32비트 주소 필드는 무시된다. 가능한 구현 중 하나는 PCI/ISA 버스 브리지를 사용하여 ISA 버스에서 인터럽트 승인 사이클을 생성하는 것이다. 이 명령은 IBM PC 호환성을 위한 것이다. PCI 버스에 인텔 8259 스타일의 인터럽트 컨트롤러가 없으면 이 사이클은 전혀 사용되지 않아도 된다.

 0001 특수 사이클
 이 사이클은 PCI 카드가 관심을 가질 수 있는 시스템 이벤트의 특수 브로드캐스트 쓰기이다. 특수 사이클의 주소 필드는 무시되지만, 페이로드 메시지를 포함하는 데이터 단계가 이어진다. 현재 정의된 메시지는 프로세서가 어떤 이유로 정지하고 있음을 알린다(예: 전원 절약). 어떤 장치도 이 사이클에 응답하지 않는다. 항상 버스에 데이터를 최소 4사이클 동안 남겨둔 후 마스터 중단으로 종료된다.

 0010 I/O 읽기
 I/O 공간에서 읽기를 수행한다. 읽기 주소의 모든 32비트가 제공되므로, 장치는 (호환성 이유로) 4바이트 미만의 I/O 레지스터를 구현할 수 있다. 바이트 활성화가 PCI 장치에서 지원하는 주소 범위 내에 없는 데이터를 요청하는 경우(예: 2바이트 I/O 주소 공간만 지원하는 장치에서 4바이트 읽기), 대상 중단으로 종료되어야 한다. 선형(단순 증가) 버스트 순서를 사용하여 여러 데이터 사이클이 허용된다.
 PCI 표준은 새로운 장치에서 I/O 공간 사용을 권장하지 않으며, 가능한 한 많은 작업을 주 메모리 매핑을 통해 수행하도록 선호한다.

 0011 I/O 쓰기
 I/O 공간에 쓰기를 수행한다.

 010x 예약됨
 PCI 장치는 이러한 명령 코드를 가진 주소 사이클에 응답해서는 안 된다.

 0110 메모리 읽기
 메모리 공간에서 읽기 사이클을 수행한다. PCI 장치가 구현할 수 있는 가장 작은 메모리 공간은 16바이트이므로, 주소 단계에서 주소의 최하위 2비트는 필요하지 않다. 대신 바이트 선택 신호 형태로 데이터 단계에서 동등한 정보가 도착한다. 장치가 요청된 순서를 지원하지 않는 경우, 첫 번째 단어를 제공한 다음 연결을 끊어야 한다.
 메모리 공간이 "프리페치 가능"으로 표시된 경우, 대상 장치는 메모리 읽기에서 바이트 선택 신호를 무시하고 항상 32개의 유효한 비트를 반환해야 한다.

 0111 메모리 쓰기
 메모리 읽기와 유사하게 작동한다. 선택되지 않은 바이트는 메모리에 기록되지 않아야 하므로 쓰기에서 바이트 선택 신호가 더 중요하다.
 일반적으로 PCI 쓰기는 PCI 읽기보다 빠르다. 장치가 들어오는 쓰기 데이터를 버퍼링하고 버스를 더 빨리 해제할 수 있기 때문이다. 읽기의 경우, 데이터가 인출될 때까지 데이터 단계를 지연해야 한다.

 100x 예약됨
 PCI 장치는 이러한 명령 코드를 가진 주소 사이클에 응답해서는 안 된다.

 1010 구성 읽기
 I/O 읽기와 유사하지만, PCI 구성 공간에서 읽는다. 장치는 주소의 하위 11비트가 구현하는 기능 및 레지스터를 지정하고, 특수 IDSEL 신호가 주장될 때만 응답해야 한다. 상위 21비트는 무시해야 한다. PCI 구성 공간에서는 (선형 증가를 사용하는) 버스트 읽기가 허용된다.
 I/O 공간과 달리 표준 PCI 구성 레지스터는 읽기가 장치의 상태를 방해하지 않도록 정의되어 있다. 장치가 표준 64바이트를 넘어서 읽기 부수 효과를 가지는 구성 공간 레지스터를 가질 수 있지만, 이는 드물다.
 구성 공간 접근은 IDSEL 라인이 안정화될 시간을 주기 위해 몇 사이클의 지연이 종종 발생하여 다른 형태의 접근보다 느리다. 또한, 구성 공간 접근은 단일 기계 명령이 아닌 다단계 작업을 필요로 한다. 따라서 PCI 장치의 일상적인 작동 중에는 이를 피하는 것이 가장 좋다.

 1011 구성 쓰기
 구성 읽기와 유사하게 작동한다.

 1100 메모리 다중 읽기
 이 명령은 일반 메모리 읽기와 동일하지만, 긴 읽기 버스트가 현재 캐시 라인 끝을 넘어 계속될 것이며 대상이 내부적으로 많은 양의 데이터를 프리페치해야 한다는 힌트를 포함한다. 대상은 항상 이를 일반 메모리 읽기의 동의어로 간주할 수 있다.

 1101 이중 주소 사이클
 32비트 이상을 나타내는 메모리 주소에 접근할 때, 주소 단계는 이 명령과 주소의 하위 32비트로 시작하며, 실제 명령과 주소의 상위 32비트가 포함된 두 번째 사이클이 이어진다. 64비트 주소 지정을 지원하지 않는 PCI 대상은 단순히 이를 다른 예약된 명령 코드로 처리하고 응답하지 않을 수 있다. 이 명령 코드는 0이 아닌 상위 주소 단어와 함께 사용될 수 있으며, 필요하지 않은 경우 이 사이클을 사용하는 것은 금지되어 있다.

 1110 메모리 라인 읽기
 이 명령은 일반 메모리 읽기와 동일하지만, 읽기가 캐시 라인의 끝까지 계속될 것이라는 힌트를 포함한다. 대상은 항상 이를 일반 메모리 읽기의 동의어로 간주할 수 있다.

 1111 메모리 쓰기 및 무효화
 이 명령은 일반 메모리 쓰기와 동일하지만, 하나 이상의 전체 캐시 라인이 모든 바이트 선택이 활성화된 상태로 기록될 것이라는 보장이 따른다. 이는 버스를 스누핑하는 쓰기 백 캐시를 위한 최적화이다. 일반적으로 더티 데이터를 보유한 쓰기 백 캐시는 자체 더티 데이터를 먼저 기록하기에 충분한 시간 동안 쓰기 작업을 중단해야 한다. 이 명령을 사용하여 쓰기가 수행되는 경우, 다시 기록될 데이터는 관련이 없음이 보장되며, 쓰기 백 캐시에서 단순히 무효화될 수 있다.
 이 최적화는 스누핑 캐시에만 영향을 미치며, 메모리 쓰기 명령의 동의어로 처리할 수 있는 대상에는 차이가 없다.

 PCI 버스 지연 시간 
PCI 사양 공표 직후, 일부 장치에서 느린 승인, 긴 데이터 버스트 또는 이들의 조합으로 인한 긴 트랜잭션이 다른 장치에서 버퍼 언더런 또는 오버런을 유발할 수 있다는 사실이 발견되었다. 개정판 2.0의 개별 단계 타이밍에 대한 권장 사항은 개정판 2.1에서 의무화되었다.

 대상은 트랜잭션 시작 후 16사이클 이내에 초기 데이터 단계(TRDY# 및 STOP# 주장)를 완료할 수 있어야 한다.
 개시자는 8사이클 이내에 각 데이터 단계(IRDY# 주장)를 완료해야 한다.

또한, 개정판 2.1부터 두 개 이상의 데이터 단계를 버스트할 수 있는 모든 개시자는 프로그래밍 가능한 지연 타이머를 구현해야 한다. 타이머는 트랜잭션이 시작될 때(개시자가 FRAME#를 주장할 때) 클럭 사이클을 카운트하기 시작한다. 타이머가 만료되고 중재자가 GNT#를 제거한 경우, 개시자는 다음 법적 기회에 트랜잭션을 종료해야 한다. 이는 일반적으로 다음 데이터 단계이지만, 메모리 쓰기 및 무효화 트랜잭션은 캐시 라인 끝까지 계속되어야 한다.

 지연된 트랜잭션 
이러한 타이밍 제약을 충족할 수 없는 장치는 (메모리 쓰기의 경우) 게시된 쓰기와 (다른 쓰기 및 모든 읽기의 경우) 지연된 트랜잭션의 조합을 사용해야 한다. 지연된 트랜잭션에서 대상은 트랜잭션(쓰기 데이터를 포함하여)을 내부적으로 기록하고 첫 번째 데이터 단계에서 중단한다(TRDY# 대신 STOP#를 주장). 개시자는 나중에 정확히 동일한 트랜잭션을 다시 시도해야 한다. 그 동안 대상은 내부적으로 트랜잭션을 수행하고, 다시 시도된 트랜잭션을 기다린다. 다시 시도된 트랜잭션이 보이면 버퍼링된 결과가 전달된다.

장치는 하나의 지연된 트랜잭션을 완료하는 동안 다른 트랜잭션의 대상이 될 수 있다. 장치는 트랜잭션 유형, 주소, 바이트 선택 및 (쓰기인 경우) 데이터 값을 기억해야 하며, 올바른 트랜잭션만 완료해야 한다.

대상이 내부적으로 기록할 수 있는 지연 트랜잭션 수에 제한이 있는 경우(간단한 대상은 1개로 제한할 수 있음), 기록하지 않고 해당 트랜잭션을 다시 시도하도록 강제한다. 이는 현재 지연 트랜잭션이 완료될 때 처리된다. 두 개시자가 동일한 트랜잭션을 시도하는 경우, 하나가 시작한 지연 트랜잭션의 결과가 다른 개시자에게 전달될 수 있다. 이는 무해하다.

대상은 버퍼링된 결과를 재시도가 성공적으로 전달되거나, 버스가 재설정되거나, 재시도를 보지 않고 215=32768 클럭 사이클(약 1밀리초)이 경과하면 지연 트랜잭션을 포기한다. 후자는 정상 작동에서는 절대로 발생해서는 안 되지만, 한 개시자가 재설정되거나 오작동하는 경우 전체 버스의 교착 상태를 방지한다.

 PCI 버스 브리지 
PCI 표준은 여러 독립적인 PCI 버스를 필요할 때 한 버스에서 다른 버스로 작업을 전달하는 버스 브리지로 연결할 수 있도록 허용한다. PCI는 많은 버스 브리지를 사용하지 않는 경향이 있지만, PCI 익스프레스 시스템은 일반적으로 PCI 익스프레스 루트 포트라고 불리는 많은 PCI-PCI 브리지를 사용한다. 각 PCI 익스프레스 슬롯은 다른 슬롯에 브리지로 연결된 별도의 버스처럼 보인다. PCI 호스트 브리지(일반적으로 x86 플랫폼의 노스브리지)는 CPU, 주 메모리 및 PCI 버스 간의 상호 연결 역할을 한다.

 게시된 쓰기 
일반적으로 버스 브리지가 한 버스에서 다른 버스로 전달되어야 하는 트랜잭션을 보면, 원본 트랜잭션은 전달된 트랜잭션이 완료될 때까지 기다려야 결과가 준비된다. 한 가지 주목할 만한 예외는 메모리 쓰기의 경우이다. 여기서 브리지는 쓰기 데이터를 내부적으로 기록(공간이 있는 경우)하고, 전달된 쓰기가 완료되기 전이나 심지어 시작되기 전에 쓰기 완료를 신호할 수 있다. 이러한 "전송되었지만 아직 도착하지 않은" 쓰기는 우편 메시지에 비유하여 "게시된 쓰기"라고 불린다. 이러한 쓰기는 성능 향상에 큰 기회를 제공하지만, 허용되는 사항을 규정하는 규칙은 다소 복잡하다.

 결합, 병합 및 축소 
PCI 표준은 특정 상황에서 버스 브리지가 여러 버스 트랜잭션을 하나의 더 큰 트랜잭션으로 변환하는 것을 허용한다. 이는 PCI 버스의 효율성을 향상시킬 수 있다.

 결합 
연속된 주소에 대한 쓰기 트랜잭션은 원래 쓰기 순서와 동일한 순서로 버스트 내 접근이 이루어지는 한, 더 긴 버스트 쓰기로 결합될 수 있다. 쓰기가 거의 연속적인 경우 모든 바이트 활성화가 비활성화된 추가 데이터 단계를 삽입하는 것도 허용된다.

 병합 
동일한 단어의 서로 다른 부분에 대한 여러 쓰기는 여러 바이트 활성화가 주장된 단일 쓰기로 병합될 수 있다. 이 경우, 특정 순서로 버스 브리지에 제시된 쓰기는 전달될 때 동시에 발생하도록 병합된다.

 축소 
동일한 바이트 또는 바이트에 대한 여러 쓰기는 결합될 수 없다. 예를 들어, 두 번째 쓰기만 수행하고 덮어쓴 첫 번째 쓰기를 건너뛰는 것은 허용되지 않는다. 이는 PCI 사양이 쓰기에 부수 효과를 허용하기 때문이다.

 PCI 버스 신호 

PCI 버스 트랜잭션은 다섯 가지 주요 제어 신호에 의해 제어되며, 그 중 두 개는 트랜잭션 개시자(FRAME# 및 IRDY#)에 의해 구동되고 세 개는 대상(DEVSEL#, TRDY#, STOP#)에 의해 구동된다. 트랜잭션을 시작할 권한을 얻는 데 사용되는 두 가지 추가 중재 신호(REQ# 및 GNT#)가 있다. 모든 신호는 액티브 로우이며, 이는 활성 또는 주장 상태가 낮은 전압임을 의미한다. 메인보드의 풀업 저항기는 어떤 장치도 신호를 구동하지 않으면 신호가 높게(비활성 또는 비주장) 유지되도록 보장하지만, PCI 버스는 저항기에 의존하여 신호 레벨을 변경하지 않는다. 모든 장치는 신호 레벨을 변경하기 전에 한 사이클 동안 신호를 높게 구동한 다음 구동을 중단한다.

 신호 타이밍 
모든 PCI 버스 신호는 클럭의 상승 에지에서 샘플링된다. 신호는 클럭의 하강 에지에서 명목상 변경되며, 각 PCI 장치에 클럭의 상승 에지에서 관찰한 신호에 응답하는 방법을 결정하는 데 약 절반 클럭 사이클, 그리고 응답을 다른 장치로 전송하는 데 약 절반 클럭 사이클을 제공한다.

PCI 버스는 PCI 버스 신호를 구동하는 장치가 변경될 때마다 한 장치가 신호 구동을 중단하고 다른 장치가 시작하는 사이에 하나의 턴어라운드 사이클이 경과해야 한다고 요구한다. 그렇지 않으면 두 장치가 동시에 신호를 구동하는 기간이 발생하여 버스 작동을 방해할 수 있다.

이 턴어라운드 사이클과 제어 라인을 구동을 중단하기 전에 한 사이클 동안 높게 구동해야 하는 요구 사항의 조합은 각 주요 제어 라인이 소유자를 변경할 때 최소 두 사이클 동안 높게 유지되어야 함을 의미한다. PCI 버스 프로토콜은 이것이 거의 제한이 되지 않도록 설계되었다. 몇 가지 특수한 경우(특히 고속 연속 트랜잭션)에만 이 요구 사항을 충족하기 위해 추가 지연을 삽입해야 한다.

 중재 
PCI 버스에서 버스 마스터로 작동할 수 있는 모든 장치는 다른 장치와 트랜잭션을 시작할 수 있다. 한 번에 하나의 트랜잭션만 시작되도록 하기 위해 각 마스터는 먼저 메인보드에 위치한 중재자로부터 버스 부여 신호인 GNT#를 기다려야 한다. 각 장치에는 버스를 요청하는 별도의 요청 라인 REQ#가 있지만, 중재자는 현재 요청이 없으면 버스 부여 신호를 모든 장치에 "주차"할 수 있다.

중재자는 언제든지 GNT#를 제거할 수 있다. GNT#를 잃은 장치는 현재 트랜잭션을 완료할 수 있지만, (FRAME#를 주장하여) GNT#가 시작되기 전 사이클에 주장된 것을 관찰하지 않으면 새 트랜잭션을 시작할 수 없다.

중재자는 다른 마스터의 트랜잭션 중에도 언제든지 GNT#를 제공할 수 있다. 트랜잭션 중에는 FRAME# 또는 IRDY# 또는 둘 다가 주장된다. 둘 다 비주장되면 버스는 유휴 상태이다. GNT#가 주장되고 버스가 유휴 상태이면 언제든지 장치가 트랜잭션을 시작할 수 있다.

 주소 단계 
PCI 버스 트랜잭션은 주소 단계로 시작된다. 개시자(일반적으로 칩셋)는 GNT#가 있고 버스가 유휴 상태임을 확인하고 AD[31:0] 라인에 대상 주소를 구동하고, 관련 명령(예: 메모리 읽기 또는 I/O 쓰기)을 C/BE[3:0]# 라인에 구동하며, FRAME#를 낮게 당긴다.

다른 각 장치는 주소와 명령을 검사하고 DEVSEL#를 주장하여 대상으로 응답할지 여부를 결정한다. 장치는 3사이클 이내에 DEVSEL#를 주장하여 응답해야 한다. 1 또는 2사이클 이내에 응답하겠다고 약속하는 장치는 각각 "고속 DEVSEL" 또는 "중속 DEVSEL"을 가진다고 한다. (실제로는 응답 시간은 2.5사이클이며, PCI 장치는 모든 신호를 3사이클 후에 수신될 수 있도록 반 사이클 일찍 전송해야 한다.)

장치는 첫 번째 사이클에 주소를 래치해야 한다. 개시자는 DEVSEL# 응답을 받기 전에도 다음 사이클에 버스에서 주소와 명령을 제거해야 한다. 추가 시간은 캡처된 주소와 명령을 해석하는 데만 사용할 수 있다.

주소 단계의 다섯 번째 사이클(또는 다른 모든 장치가 중속 DEVSEL 이상인 경우 더 일찍)에는 일부 주소 범위에 대해 포괄적인 "감산 디코딩"이 허용된다. 이는 일반적으로 ISA 버스 브리지에서 해당 범위(메모리의 경우 24비트, I/O의 경우 16비트) 내의 주소에 사용된다.

여섯 번째 사이클에 응답이 없으면 개시자는 FRAME#를 비주장하여 트랜잭션을 중단할 수 있다. 이는 마스터 중단 종료로 알려져 있으며, PCI 버스 브리지는 이 경우 모든 1의 데이터(0xFFFFFFFF)를 반환하는 것이 일반적이다. 따라서 PCI 장치는 일반적으로 중요한 상태 레지스터에서 모든 1의 값을 사용하는 것을 피하여 소프트웨어에서 이러한 오류를 쉽게 감지할 수 있도록 설계된다.

 주소 단계 타이밍 

파일:AddressPhaseTiming wavedrom.svg

참고:
 GNT#는 사이클이 시작된 후에는 무관하다.
 주소는 한 사이클 동안만 유효하다.
 C/BE는 첫 번째 데이터 단계 바이트 활성화에 이어 명령을 제공한다.

클럭 0의 상승 에지에서 개시자는 FRAME#와 IRDY#가 모두 높고 GNT#가 낮음을 관찰하므로 클럭 1의 상승 에지에 맞춰 주소, 명령을 구동하고 FRAME#를 낮게 주장한다. 대상은 주소를 래치하고 디코딩을 시작한다. 클럭 2(고속 DEVSEL), 3(중속) 또는 4(저속)에 맞춰 DEVSEL#로 응답할 수 있다. 감산 디코딩 장치는 클럭 4까지 다른 응답이 없음을 확인하고 클럭 5에 응답할 수 있다. 마스터가 클럭 5까지 응답을 보지 못하면 트랜잭션을 종료하고 클럭 6에 FRAME#를 제거한다.

TRDY#와 STOP#는 주소 단계 동안 비주장(높음)이다. 개시자는 데이터 전송 준비가 되면 즉시 IRDY#를 주장할 수 있으며, 이론적으로는 클럭 2부터 주장할 수 있다.

 이중 사이클 주소 
64비트 주소 지정을 허용하기 위해 마스터는 두 개의 연속적인 사이클에 걸쳐 주소를 제시한다. 먼저 C/BE[3:0]#에 특수 "이중 사이클 주소" 명령과 함께 하위 주소 비트를 보낸다. 다음 사이클에는 상위 주소 비트와 실제 명령을 보낸다. 상위 주소 비트가 0인 경우 이중 주소 사이클은 금지되므로, 64비트 주소 지정을 지원하지 않는 장치는 단순히 이중 사이클 명령에 응답하지 않을 수 있다.

 _ 0_ 1_ 2_ 3_ 4_ 5_ 6_
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
 ___
 GNT# \___/XXXXXXXXXXXXXXXXXXXXXXX
 _______
 FRAME# \_______________________
 ___ ___
 AD[31:0] -------<___X___>--------------- (낮은 비트, 그 다음 높은 비트)
 ___ ___ _______________
 C/BE[3:0]# -------<___X___X_______________ (DAC, 그 다음 실제 명령)
 ___________________________
 DEVSEL# \___\___\___\___
 Fast Med Slow
 _ _ _ _ _ _ _ _
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
 0 1 2 3 4 5 6

 구성 접근 
PCI 구성 공간 접근을 위한 주소는 특수 디코딩을 사용한다. 이 경우, 하위 주소 라인은 원하는 PCI 구성 레지스터의 오프셋을 지정하고, 상위 주소 라인은 무시된다. 대신, 장치가 DEVSEL#를 주장하기 전에 추가 주소 신호인 IDSEL 입력이 높아야 한다. 각 슬롯은 다른 상위 주소 라인을 IDSEL 핀에 연결하고, 상위 주소 라인에 원-핫 인코딩을 사용하여 선택된다.

 데이터 단계 
주소 단계 이후(구체적으로 DEVSEL#가 낮아지는 사이클부터) 하나 이상의 데이터 단계 버스트가 이어진다. 모든 경우에 개시자는 C/BE[3:0]# 라인에 활성-로우 바이트 선택 신호를 구동하지만, AD[31:0]의 데이터는 개시자(쓰기의 경우) 또는 대상(읽기의 경우)에 의해 구동될 수 있다.

데이터 단계 동안 C/BE[3:0]# 라인은 활성-로우 바이트 활성화 신호로 해석된다. 쓰기의 경우, 주장된 신호는 AD 버스의 네 바이트 중 어느 바이트가 지정된 위치에 기록될지를 나타낸다. 읽기의 경우, 개시자가 어떤 바이트에 관심이 있는지를 나타낸다. 읽기의 경우, 바이트 활성화 신호를 무시하고 단순히 모든 32비트를 반환하는 것은 항상 유효하다. 캐시 가능한 메모리 리소스는 항상 32개의 유효한 비트를 반환해야 한다. 바이트 활성화 신호는 주로 읽기가 부수 효과를 가지는 I/O 공간 접근에 유용하다.

네 개의 C/BE# 라인 모두가 비주장된 데이터 단계는 PCI 표준에서 명시적으로 허용되며, 진행 중인 버스트 접근에서 주소를 진행시키는 것 외에는 대상에 아무런 영향을 미치지 않아야 한다.

데이터 단계는 양측이 전송을 완료하고 다음 데이터 단계로 진행할 준비가 될 때까지 계속된다. 개시자는 더 이상 기다릴 필요가 없을 때 IRDY# (개시자 준비)를 주장하고, 대상은 TRDY# (대상 준비)를 주장한다. 데이터를 제공하는 쪽은 자신의 준비 신호를 주장하기 전에 AD 버스에 데이터를 구동해야 한다.

참가자 중 한 명이 준비 신호를 주장하면, 데이터 단계가 끝날 때까지 준비 해제하거나 제어 신호를 변경할 수 없다. 데이터 수신자는 IRDY#와 TRDY#가 모두 주장된 것을 볼 때까지 각 사이클마다 AD 버스를 래치해야 한다. 이는 현재 데이터 단계의 끝을 표시하며, 방금 래치된 데이터가 전송될 단어임을 나타낸다.

최대 버스트 속도를 유지하기 위해 데이터 송신자는 IRDY#와 TRDY#가 모두 주장된 것을 본 후 다음 단어를 AD 버스에 구동하는 데 반 클럭 사이클의 시간을 갖는다.

 0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
 ___ _______ ___ ___ ___
 AD[31:0] ---<___XXXXXXXXX_______XXXXX___X___X___ (쓰기인 경우)
 ___ ___ _______ ___ ___
 AD[31:0] ---<___>~~~
---<___>
 ___ ___ ___ ___ ___
 C/BE[3:0]# ---<___X___X___X___X___>---<___>
 | | | | ___
 IRDY# ^^^^^^^^\______________/ ^^^^^
 | | | | ___
 TRDY# ^^^^^^^^\______________/ ^^^^^
 | | | | ___
 DEVSEL# ^^^^^^^^\______________/ ^^^^^
 ___ | | | ___
 FRAME# \_______________/ | ^^^^\____
 _ _ |_ |_ |_ |_ _ _
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \
 0 1 2 3 4 5 6 7

클럭 에지 1에서 개시자는 주소, 명령을 구동하고 FRAME#를 주장하여 트랜잭션을 시작한다. 다른 신호는 유휴 상태이며(^^^으로 표시됨), 메인보드의 풀업 저항기에 의해 높게 당겨져 있다. 이것은 턴어라운드 사이클일 수 있다. 사이클 2에서 대상은 DEVSEL#와 TRDY#를 모두 주장한다. 개시자도 준비되었으므로 데이터 전송이 발생한다. 이 과정은 세 번 더 반복되지만, 마지막 (클럭 에지 5) 전에 마스터는 FRAME#를 비주장하여 종료를 나타낸다. 클럭 에지 6에서 AD 버스와 FRAME#는 구동되지 않고(턴어라운드 사이클) 다른 제어 라인은 1사이클 동안 높게 구동된다. 클럭 에지 7에서 다른 개시자가 다른 트랜잭션을 시작할 수 있다. 이것은 다른 제어 라인의 턴어라운드 사이클이기도 하다.

동일한 읽기 버스트는 한 사이클 더 소요된다. 대상이 TRDY#를 주장하기 전에 AD 버스가 턴어라운드될 때까지 1사이클을 기다려야 하기 때문이다.

 0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \
 ___ ___ ___ ___ ___
 AD[31:0] ---<___>---<___X___X___X___>---<___>
 ___ _______ ___ ___ ___
 C/BE[3:0]# ---<___X_______X___X___X___>---<___>
 ___ | | | | ___
 IRDY# ^^^^\___________________/ ^^^^^
 ___ _____ | | | | ___
 TRDY# ^^^^ \______________/ ^^^^^
 ___ | | | | ___
 DEVSEL# ^^^^\___________________/ ^^^^^
 ___ | | | ___
 FRAME# \___________________/ | ^^^^\____
 _ _ _ |_ |_ |_ |_ _ _
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \
 0 1 2 3 4 5 6 7 8

대상에 의해 종료되는 고속 버스트는 끝에 추가 사이클이 하나 더 있다.

 0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \
 ___ ___ ___ ___ ___
 AD[31:0] ---<___>---<___X___X___X___XXXX>----
 ___ _______ ___ ___ ___ ___
 C/BE[3:0]# ---<___X_______X___X___X___X___>----
 | | | | ___
 IRDY# ^^^^^^^\_______________________/
 _____ | | | | _______
 TRDY# ^^^^^^^ \______________/
 ________________ | ___
 STOP# ^^^^^^^ | | | \_______/
 | | | | ___
 DEVSEL# ^^^^^^^\_______________________/
 ___ | | | | ___
 FRAME# \_______________________/ ^^^^
 _ _ _ |_ |_ |_ |_ _ _
 CLK _/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \
 0 1 2 3 4 5 6 7 8

클럭 에지 6에서 대상은 (데이터와 함께) 중지하기를 원한다고 나타내지만, 개시자는 이미 IRDY#를 낮게 유지하고 있으므로 다섯 번째 데이터 단계(클럭 에지 7)가 있으며, 이 동안 데이터는 전송되지 않는다.

 패리티 
PCI 버스는 패리티 오류를 감지하지만, 작업을 재시도하여 수정하려고 시도하지 않는다. 이는 순전히 오류 표시일 뿐이다. 이 때문에 패리티 오류가 발생하기 전에 감지할 필요가 없으며, PCI 버스는 실제로 몇 사이클 후에 감지한다. 데이터 단계 동안 AD[31:0] 라인을 구동하는 장치는 이들 라인과 C/BE[3:0]# 라인에 대해 짝수 패리티를 계산하고, 1사이클 후에 PAR 라인을 통해 전송한다. AD 버스에 대한 모든 접근 규칙 및 턴어라운드 사이클은 PAR 라인에도 적용되며, 단 1사이클 늦게 적용된다. AD 버스를 수신하는 장치는 수신된 패리티를 확인하고, 1사이클 후에 PERR#(패리티 오류) 라인을 주장한다. 이는 일반적으로 프로세서 인터럽트를 생성하며, 프로세서는 PCI 버스에서 오류를 감지한 장치를 검색할 수 있다.

PERR# 라인은 대상이 선택된 후에 데이터 단계 동안에만 사용된다. 주소 단계(또는 특수 사이클의 데이터 단계) 동안 패리티 오류가 감지되면, 이를 관찰하는 장치는 SERR#(시스템 오류) 라인을 주장한다.

일부 바이트가 C/BE# 라인에 의해 마스크되어 사용되지 않더라도, 이들은 여전히 정의된 값을 가져야 하며, 이 값은 패리티를 계산하는 데 사용되어야 한다.

 고속 연속 트랜잭션 
PCI 버스 신호를 구동하는 서로 다른 장치 간에 턴어라운드 사이클이 필요하기 때문에 일반적으로 PCI 버스 트랜잭션 사이에 유휴 사이클이 있어야 한다. 그러나 특정 상황에서는 이 유휴 사이클을 건너뛰어 한 전송의 최종 사이클(IRDY# 주장, FRAME# 비주장)에서 다음 전송의 첫 번째 사이클(FRAME# 주장, IRDY# 비주장)로 직접 이동하는 것이 허용된다.

개시자는 다음과 같은 경우에만 연속 트랜잭션을 수행할 수 있다.

 동일한 개시자가 수행하는 경우(그렇지 않으면 C/BE# 및 FRAME# 라인을 턴어라운드할 시간이 없을 것이다).
 첫 번째 트랜잭션이 쓰기인 경우(따라서 AD 버스를 턴어라운드할 필요가 없다).
 개시자가 여전히 PCI 버스를 사용할 권한(GNT# 입력으로부터)을 가지고 있는 경우.

추가적인 타이밍 제약은 특히 DEVSEL#와 같은 대상 제어 라인을 턴어라운드해야 하는 필요성에서 발생할 수 있다. 대상은 최종 데이터 단계 다음 사이클에 DEVSEL#를 비주장하여 높게 구동하며, 이는 연속 트랜잭션의 경우 주소 단계의 첫 번째 사이클이다. 주소 단계의 두 번째 사이클은 DEVSEL# 턴어라운드를 위해 예약되므로, 대상이 이전 대상과 다른 경우 세 번째 사이클(중속 DEVSEL 속도)까지 DEVSEL#를 주장해서는 안 된다.

이 문제가 발생할 수 없는 한 가지 경우는 개시자가 두 번째 전송이 이전 전송과 동일한 대상에 주소 지정됨을 어떤 방식으로든(아마도 주소가 충분한 상위 비트를 공유하기 때문에) 아는 경우이다. 이 경우, 개시자는 연속 트랜잭션을 수행할 수 있다. 모든 PCI 대상은 이를 지원해야 한다.

대상 또한 요구 사항을 추적하는 것이 가능하다. 고속 DEVSEL을 사용하지 않는 경우, 요구 사항은 사소하게 충족된다. 사용하는 경우, 다음 중 하나가 아닌 한 중간 DEVSEL 시간까지 기다려야 한다.

 현재 트랜잭션이 유휴 사이클에 의해 선행되었다 (연속적이지 않음).
 이전 트랜잭션이 동일한 대상에 대한 것이었다.
 현재 트랜잭션이 이중 주소 사이클로 시작되었다.

이러한 기능을 가진 대상은 PCI 구성 레지스터의 특수 비트로 이를 나타내며, 버스상의 모든 대상이 이를 가지고 있다면 모든 개시자는 자유롭게 연속 전송을 사용할 수 있다.

차감 디코딩 버스 브리지는 연속 사이클의 경우 이러한 추가 지연을 예상하고, 연속 지원을 광고해야 한다.

 64비트 PCI 

개정 2.1부터 PCI 사양에는 선택적인 64비트 지원이 포함된다. 이는 64비트 버스 확장인 AD[63:32], C/BE[7:4]# 및 PAR64, 그리고 여러 개의 추가 전원 및 접지 핀을 제공하는 확장 커넥터를 통해 제공된다. 64비트 PCI 커넥터는 추가 64비트 세그먼트를 통해 32비트 커넥터와 구별할 수 있다.

64비트 장치 간의 메모리 트랜잭션은 모든 64비트를 사용하여 데이터 전송 속도를 두 배로 높일 수 있다. 비메모리 트랜잭션(구성 및 I/O 공간 접근 포함)은 64비트 확장을 사용할 수 없다. 64비트 버스트 동안 버스트 주소 지정은 32비트 전송과 마찬가지로 작동하지만, 주소는 데이터 단계당 두 번 증가한다. 시작 주소는 64비트 정렬되어야 한다. 즉, AD2는 0이어야 한다. 중간 주소(AD2 = 1인)에 해당하는 데이터는 AD 버스의 상위 절반에 전달된다.

64비트 트랜잭션을 시작하려면, 개시자는 AD 버스에 시작 주소를 구동하고 FRAME#와 동시에 REQ64#를 주장한다. 선택된 대상이 이 트랜잭션에 대해 64비트 전송을 지원할 수 있는 경우, DEVSEL#와 동시에 ACK64#를 주장하여 응답한다. 대상은 트랜잭션별로 64비트 전송을 허용할지 여부를 결정할 수 있다.

주소 단계 동안 REQ64#가 주장되면, 개시자는 주소의 상위 32비트와 버스 명령 사본을 버스의 상위 절반에 구동한다. 주소가 64비트를 요구하는 경우 이중 주소 사이클이 여전히 필요하지만, 버스의 상위 절반은 두 주소 단계 사이클 동안 주소의 상위 절반과 최종 명령 코드를 전달한다. 이를 통해 64비트 대상은 전체 주소를 보고 더 일찍 응답을 시작할 수 있다.

개시자가 ACK64# 없이 DEVSEL#가 주장된 것을 보면, 32비트 데이터 단계를 수행한다. 첫 번째 데이터 단계 동안 버스의 상위 절반에서 전송되었을 데이터는 대신 두 번째 데이터 단계 동안 전송된다. 일반적으로 개시자는 DEVSEL#를 보기 전에 모든 64비트 데이터를 구동한다. ACK64#가 없으면 데이터 버스의 상위 절반 구동을 중단할 수 있다.

REQ64# 및 ACK64# 라인은 마지막 데이터 단계를 제외한 전체 트랜잭션 동안 주장된 상태로 유지되며, 각각 FRAME# 및 DEVSEL#와 동시에 비주장된다.

PAR64 라인은 PAR 라인과 마찬가지로 작동하지만, AD[63:32] 및 C/BE[7:4]#에 대해 짝수 패리티를 제공한다. 이는 REQ64#가 주장되는 경우에만 주소 단계에서 유효하다. PAR64는 REQ64#와 ACK64#가 모두 주장되는 경우에만 데이터 단계에서 유효하다.

 캐시 스누핑 (구식) 
PCI는 원래 쓰기 백 캐시 캐시 일관성에 대한 선택적 지원을 포함했다. 이는 캐시 가능한 메모리 대상의 지원이 필요했으며, 이 대상은 버스의 캐시에서 SDONE (스누핑 완료) 및 SBO# (스누핑 백오프)라는 두 핀을 수신했다.

이 기능은 실제로 거의 구현되지 않았기 때문에 PCI 사양의 개정 2.2에서 삭제되었으며, 개정 2.3에서는 핀이 SMBus 접근에 재사용되었다.

캐시는 DEVSEL#를 주장하지 않고 모든 메모리 접근을 감시했다. 캐시 가능한 접근을 발견하면 SDONE을 낮게 구동했다(스누핑 미완료). 일관성을 지원하는 대상은 SDONE이 높게 주장될 때까지 데이터 단계(TRDY# 주장)를 완료하는 것을 피했다.

캐시에 깨끗한 데이터가 있는 데이터에 대한 쓰기의 경우, 캐시는 자신의 사본을 무효화하기만 하면 되며, 이것이 확립되는 즉시 SDONE을 주장했다. 그러나 캐시에 더티 데이터가 포함되어 있는 경우, 접근이 진행되기 전에 캐시가 이를 다시 기록해야 했으므로 SDONE을 높일 때 SBO#를 주장했다. 이는 활성 대상에게 TRDY# 대신 STOP#를 주장하도록 신호를 보냈으며, 이는 개시자가 연결을 끊고 나중에 작업을 재시도하도록 했다. 그 동안 캐시는 버스를 중재하고 데이터를 메모리에 다시 기록했다.

캐시 일관성을 지원하는 대상은 또한 캐시 라인을 넘어가기 전에 버스트를 종료해야 한다.

 개발 도구 
섬네일|BIOS 시작 중에 POST 번호를 표시하는 PCI POST 카드
PCI 버스를 개발 및 문제 해결할 때 하드웨어 신호 검사가 매우 중요하다. 로직 분석기 및 버스 분석기는 사용자가 유용한 방식으로 신호를 수집, 분석 및 디코딩할 수 있는 도구이다.

 같이 보기 
 PCI 익스프레스
 ISA 버스
 EISA
 MCA
 AGP
 VLB
 PCI-X

 각주 

 외부 링크 

 PCI Special Interest Group (PCI-SIG) 
 Introduction to PCI protocol, electrofriends.com
 PCI bus pin-out and signals, pinouts.ru
 PCI card dimensions, interfacebus.com

 
분류:메인보드 확장 슬롯
분류:IBM PC 호환기종
분류:1993년 도입